1.C语言基本常识
1).数据类型(常用char,short,int,long,signed,unsigned,float,double,sizeof)
32位机中 int为32位 64位则int占64位
2).运算和控制(=,+,-,*,while,do-while,if,else,switch,case,continue,break)
3).数据存储(static,extern,const,volatile)
4).结构(struct,enum,union,typedef)
5).位操作和逻辑运算(<<,>>,&,|,~,^)
6).预处理(#define, #include, #if...#elif...#else...fendif等)
2.位、字节、字的关系
位 (bit):计算机中最基本的单位,对应0或1
字节(Byte):计算机中数据存储的基本单位,8位=1字节
字(word):计算机进行数据处理和运算的单位。32位机中,4字节=1字;64位机中,8字节=1字;
3.volatie的用法
C语言关键词volatile用法。_volatile在c语言中的用法-CSDN博客
4.寄存器
一切的源头在于写了一个项目代码,通过keil等编译器编译成了xxx.bin/hex/axf文件,并烧写到了flash,以32为例,就是烧写到了0x8000_0000
汇编读指令 LDR R0, [ADDR] ,把addr数据读到r0
cpu的16个寄存器,留意后三个寄存器,R13存放栈地址,
5变量
以如下程序讲解变量在ram中的变化
首先,变量在运行是必然保存在内存(ram)里,比如32的sram 0x2000_0000——0x2000_FFFF(64KB)
上电时,会把异常向量表中第一个数值设置到R13栈寄存器里面,所以初始栈顶地址是我们自己定义的,而全局变量和静态变量的存放地址可以在keil
当运行BL mymain时,BL执行的操作是将pc程序计数器的数值传入LR寄存器,LR寄存器带着地址压栈,此时再将PC指向mymain函数的地址,达到保护现场的作用。
局部变量
可以发现,局部变量随着程序的运行在栈内被分配空间并初始化
volatile int a = 321;
PUSH {r0,lr} //分配栈空间
//赋值a = 321
MOVW r0,#0x141
STR r0,[sp,#0x00]
局部变量的释放(pop出栈)
使用pop将栈底元素赋值给寄存器,如图r2 =321,r3=r0,pc=lr,此时sp=2000FF94
全局变量
全局变量的初始化:如果像局部变量一样初始化(就是使用push之类的指令),机器码的代码量就会变大,从而就会浪费flash空间
程序是烧写在flash上的,程序在flash上分为代码段,数据段,其中数据段保存着全局变量或者静态变量的初始值,在main函数运行之前,会自动执行一个copy程序初始化全局变量,也就是把数据段的内容拷贝到ram的全局初始化区。全局初始化区可以在魔法棒—linker(链接器)—r/w base在sram的地址范围内定义。
无初始值的全局变量
无初始值的全局变量并不会存放在data段,太浪费flash空间了,一般是执行某汇编函数,该汇编函数功能是在存放有初始值的全局变量初始化区的上方,根据无初始化的全局变量占用的空间使用memset函数设置该段空间内容为0。
无初始值的全局变量放在全局变量初始化区之后,在执行main函数之前调用可以将初始值设置为0的函数,例如由下图的BL SetZero(zi段)
6.堆栈
如果你想定义一个变量或者空间,你想让他在你想释放的时候释放。显然他不能放在全局变量初始化区,而如果该变量定义在函数里,那函数结束时,变量也就释放了。所以需要有一个叫堆的区域,他是一块空闲的ram区域,这个区域可以通过malloc函数开辟一块区域,并在你想释放时使用free进行释放。
堆和栈一开始都是空闲的区域,但是栈的空间分配是由编译器生成的汇编语言确定的,自己很难控制,所以才需要引入堆。
简易内存管理函数
volatile char mybuf[20*1024];
volatile int index = 0;
void *malloc(int size)
{
char *ret = &mybuf[index];
index += size; //index指向了下一次可分配的数组下标
return ret;
}
int main()
{
volatile *p;
p = malloc(100);
*p = 0x12345678;
}
Program Size Code RO RW ZI 解析
Program Size描述了烧录的flash的文件中,代码段Code,RO段,RW段,ZI段占用的字节,其中RW段为已经初始化的全局或者静态变量大小,ZI-data为未初始化的全局或者静态变量大小