您好
我现在在做串口在线升级程序,想咨询您一下。我的升级程序写在FLASHG,应用程序写在FLASHE,我应该编写什么程序可以实现到另一个FLASH的跳转呢,即从FLASHG跳转到FLASHE,或者说从升级程序的main函数跳转至应用程序的main函数。
谢谢
mangui zhang:
可以先了解一下上电或复位后程序执行及引导过程,或者二次引导
1.首先我们根据图1来看一下芯片上电后的代码执行流程,当芯片在接收到一个复位信号后,会到0x3FFFC0去复位向量,该复位向量跳到BootROM 0x3FF75C中去执行bootloader的程序,这里主要有initboot, 和SelectBootMode, 以及一些外设引导的函数。SeleteBootMode根据芯片的硬件或软件设置来判断芯片该去哪里寻找程序入口,直接目的是如何找到main,然后执行应用程序。
<ignore_js_op>
360截图20180527214750549.jpg (29.11 KB, 下载次数: 0)
下载附件 保存到相册
图1. 芯片的复位流程图
我们最常用到的主要有两种引导模式: 一种是boot to RAM,即跳到0x000000的RAM中,去开始执行指令,主要针对程序加载在RAM的仿真模式;另外一种是boot to Flash,则跳到0x3F7FF6中去开始执行代码。相应的,程序会这两个入口地址0x000000, 0x3F7FF6放一条跳转指令,在codestart.asm源文件中,原因是在Flash的入口地址处只有两个单元的空间,后面是CSM模块,所以需要跳转;而在RAM中之所以也需要跳转,主要是因为在跳转到main之前,需要执行一小段代码_c_int00,该代码会使用0x000003之后的一段RAM,如果代码放在那里,在执行_c_int00之后会损坏代码。