关于VScode设置大括号格式的做法,设置路径:
File->Preferences->Settings->Extensions->C/C++->c_Cpp:
Clang_format_fallback Style
默认是visual code说明:
Name of the predefined style
used as a fallback in case clang-format is invoked with style
'file' but the .clang-format file is not found. Possible values are
Visual Studio, LLVM, Google, Chromium, Mozilla, WebKit, none, or
use {key: value, ...} to set specific
parameters.
For example, the 'Visual
Studio' style is similar to: { BasedOnStyle: LLVM, UseTab:
Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman,
AllowShortIfStatementsOnASingleLine: false,
IndentCase
一、符号位
符号位为每个字节的最高位。最高位1为负数,0为正数。
负数在内存是以补码的方式存储的。
二、负数的计算
计算方式:原码->反码->补码
例如:十进制-8
原码(负数符号位为1):10001000;
反码(符号位不变,数值位分别“按位取反”):11110111;
补码(反码的末位加1):11111000。
因此-8在8位机中用11111000表示
//keil中默认是不支持匿名结构体的,需要编译指令#pragma
anon_unions指名。
#pragma
anon_unions
typedef
union {
unsigned int num;
struct {
unsigned int
nLow :8;
unsigned int
nHigh :8;
对于很多刚开始接触电源变压器产品设计的新人工程师来说,最需要做的就是要扎实巩固变压器计算相关的基础知识,并能够按照电源变压器的不同分类,进行新产品的研发和调试。其中,正激式电源变压器和反激式电源变压器作为两大类型,是目前市面上最常见的两种变压器形式,这两种变压器都有哪些不同?应该如何加以区分呢?
其实想要区分正激式电源变压器和反激式变压器,从结构上来区分是最容易的。工程师在
小结:
1.
使用C++,不能再使用MicroLIB,MicroLIB不支持C++,会报错;
2.
使用MicroLIB,会自动关闭半主机模式,重定向仅实现putc和getc即可
3.
不使用MicroLIB,需要手动关闭半主机模式;
4. 关闭半主机模式(ARM
Compiler 5版本):#pragma import(__use_no_semihosting_swi)
5. 关闭半主机模式(ARM
Compiler 6版本):__asm('.global
__use_no_semihosting\n\t');
6. ARM Compiler
6版本关闭半主机模式需要实现retarget.c中的好几个函数,下面会贴出代码
7.
C++模板使用Template,需要使用ARM Compiler 6版本
MSP和PSP 的含义是Main_Stack_Pointer
和Process_Stack_Pointer,在逻辑地址上他们都是R13;
权威手册上说的很清楚PSP主要是在Handler的模式下使用,MSP主要在线程模式下使用(当然你在线程模式下也可以调用PSP,需要你做特殊的处理);
这意味着同一个逻辑地址,实际上有两个物理寄存器,一个为MSP,一个为PSP,在不同的工作模式调用不同的物理寄存器。
Cortex-M3内核有两个堆栈指针:MSP-主堆栈指针和PSP-进程堆栈指针,在任何一个时刻只能有一个堆栈指针起作用,也就是说任何一个时刻只能使用一个堆栈指针,要么使用MSP,要么使用PSP。何为堆栈指针,其实就是普通的指针,只是他们指向两个不同的堆栈。
用户代码区的第一个字用于存放栈顶地址(MSP Main stack
pointer)
用户代码区第二个字为程序开始地址(复位地址)
注意:
heap_1.c
使用大数组,可申请,没释放,系统使用创建消息量、定时器等也基本不需要释放;
heap_2.c使用大数组,可申请,可释放,但是不会合并相邻空闲块,会产生碎片;
heap_4.c使用大数组,可申请,可释放,相邻区块可以合并;
heap_3.c