嵌入式单片机工作基本原理:
系统工作原理:CPU要进行指令执行、数据处理、外设控制,首先要做的就是从Code Flash中取出指令,然后执行指令,如果指令的执行有中间变量,就要在RAM中保存,执行完后要去控制外设来完成特定的功能。
系统启动流程:
1)电源上电/复位脚复位
2.1)从地址0x0000 0000处取出堆栈指针MSP的初始值(初始值是栈顶地址)
2.2)从地址0x0000 0004处取出程序计数器指针PC的初始值(初始值是复位向量)
3)设置堆栈大小
4)初始化中断向量表(_Vector 定义)
5)调用初始化函数(非必须,例如systeminit)
6)调用__main.C文件[__main()文件里面有main()函数]
注1:不同芯片厂会将0x0000 0000和0x0000 0004地址映射到不同地址上,根据映射地址的来源可分为不同启动模式(启动模式又称为自举模式)
注2:0x0000 0000和0x0000 0004相差4个字节,是由ECU同时处理的位所决定,32位单片机最多处理32位,即4个字节。
堆栈简介:
栈(Stack) 编译器自动分配和释放,存放函数参数、局部变量
堆(Heap) 程序员分配和释放,如malloc、calloc、ralloer等(若不使用这些函数,则可以不分配)
内存大小与地址的对应关系以及计算方法
参见https://blog.csdn.net/ace_shiyuan/article/details/78203805
特别注意:
1) 在计算机中,一个地址,代表一个字节(1Byte)
2)我们常说的8位机、16位机、32位机、64位机,指的是地址的长度。
Memory map type
1).text
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
注:在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
2).bss
bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量和未初始化的静态变量内存区域。
bss段属于静态内存分配。
3) .const
常量,它用来存放常量(const)。
const段属于静态内存分配。
4) .data
数据段(data segment)通常是指用来存放程序中已初始化的全局变量和已初始化静态变量(static)的一块内存区域。
数据段属于静态内存分配。