嵌入式C语言复习

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为未初始化的全局或者静态变量大小

7.结构体封装寄存器

8.链表

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值