- 单片机的Flash,RAM,各个系统寄存器,共享同一地址空间
32位单片机,意味着这个地址空间有2^32 byte,即4G,完全足够分配给实际的存储。
所以所有的真实存储会映射到同一的4G大小的地址空间内,有序排放。
-以STM32G4单片机为例
几点: - 代码段:存放程序等,由真实的Flash映射到这段
- RAM段:存放变量,或者特殊情况下(如内存模式调试等)的代码
- 堆(heap)和栈(stack):会被分配到RAM段内。堆可以由用户程序用malloc等函数使用,栈用作局部变量和函数传递参数。
- 全局变量:每个变量符号对应一个在RAM内的地址(编译链接的时候分配确定地址,这与堆heap不同,堆是在代码执行时系统分配空闲的地址)
- 有初始值的变量:初始化值在Flash段存着,初始化的时候该值会被存到变量的地址内。
- 全局常量也在RAM里,以提高存取速度,其数值也是存在Flash内,在系统启动的时候初始化,把值写入该地址内。
- 系统的专用寄存器,用作决定各外设(时钟、USART、ADC等)如何工作、以及显示它们的当前状态等,也被映射到固定的地址空间,所以如果知道各寄存器的地址和作用可以用代码直接读取和修改来使用外设,不记得就用库函数,好记些。
- 中断向量:在一片连续的地址空间,存储着各个中断处理程序代码的开始地址(Flash内),当某个中断事件发生,而中断又是允许时,系统会找到对应的中断向量,从里面取出程序代码地址,然后跳到那里去执行中断服务程序。
- 系统启动时:由BOOT0(/BOOT1)的0/1状态,决定从哪里开始取出堆栈开始地址和程序起始地址。
STM32单片机内存映射
于 2024-11-21 14:42:12 首次发布