阅读:1259回复:1

MCU IAP升级与BIN格式浅析

楼主#
更多 发布于:2023-10-31 09:43
【背景】
最近公司上线了虚拟桌面(办公开发全部从本地电脑转移到机房的服务器,通过账号登录的方式),在把本地电脑的keil工程转移到虚拟桌面系统中去后发现,keil能够正确的编译生成hex和bin,但是烧录进MCU板子后,运行异常,很奇怪的现象,以前从来没有碰到过的现象,代码之前在本地电脑编译,是能够正确执行的。所以猜测可能和keil工程的各个配置选项有关。


【分析】
通过对比编译生成的bin文件分析,发现了bin文件大小是一致的。但是字节很多都不一样,bin文件的开头前面几个字节就不一样。发现是栈顶的地址不一样,才跟踪到问题是由于在【keil】-->【Option】-->【Target】-->【Read/Write Memory Areas】-->【IRAM1】设置错误。


- 根据map文件可以看到:程序flash区地址从0x08000000开始,程序栈地址从0x20000000开始。
- bin文件的前面4个字节表示的是程序栈顶地址(全局变量编译的时候占用的),也就是:0x200xxxxx,具体看RAM有多大。
- 接下里的4个字节是程序的中断向量表地址。中断向量表,是系统发生硬件错误,软件错误,各个中断发生跳转的一个表格,里面记录了各个中断服务函数的地址
- 除掉了这8个字节,后面紧挨着的就是中断向量表的具体内容,看不同的芯片中断号的数量而定,例如F031系列就是0xC0个字节。
- 在后面的数据就是真正的函数代码了,main函数等等其他函数。
-
- 我们的BootLoader程序默认是0x08000000开始,程序的栈地址也是从0x20000000开始,全局变量直接从0x20000000开始存放。在上电初始化中,我们把中断向量表直接设置到flash的0x08000000地址即可。我们的程序栈地址就不用动,直接是0x20000000。
-  
- 在App程序中,假如我们分配了0x1800的空间给BootLoader,那么我们在keil中配置ROM时应该是0x08001800开始,这样中断向量表会编译在0x08001800的地址,也就是说bin文件的第4-7这四个字节的值是0x08001800。从BootLoader跳转到APP时,我们第一时间需要重新设置中断向量表的地址,这里有两种方法:
1. 看具体的芯片支持与否。直接把中断向量表的地址从0x08000000改为0x08001800。
2. 如果芯片没有提供方法1中的寄存器给你设置,那么芯片的上电配置一般是这样设计的:
要么是从将中断向量表地址默认到flash的起始地址,要么就是默认到内存的首地址。所以这种情况下,0x8001800不是flash的首地址,也不是内存的首地址,那我们可以这样把内存头部,人为的留一部分出来,通过映射的方法把中断向量表映射过来就可以了:
把中断向量表映射到内存SRAM中,中断向量表长度为0xC0,那么我们就从0x20000000~0x200000C0给到中断向量表,APP上电做一个指针映射操作,特别注意,在KEIL的设置中,我们需要把程序用的SRAM地址改为0x200000C0开始,不然编译器还是默认把栈放到0x20000000,这样APP一起来,重定向到0x08001800后,0x20000000~0x200000C0之间所有的全局变量都乱套了。程序会异常工作。

最新喜欢:

zhaoyf13zhaoyf...
If you have nothing to lose, then you can do anything.
沙发#
发布于:2023-11-21 14:14
学习了!!!
游客

返回顶部