我在做STM32串口IAP实验室的时候看了正点原子的程序代码,在跳转的部分不太明白,为什么要这样检测 if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
还有就是重新设置堆栈地址的时候,必须使用汇编才能重新设置堆栈地址吗???
//跳转到应用程序段//appxaddr:用户代码起始地址.void iap_load_app(u32 appxaddr){ if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法. { jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) jump2app(); //跳转到APP. }} //设置栈顶地址//addr:栈顶地址__asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14}
栈顶地址是否合法,应该是前面有什么约定吧
设置好栈指针,就可以进 c 程序了,你得 app 应该就是 c 代码了。
底层就是这样操作栈指针的,可以看看芯片手册中的指令集部分,告诉你怎么操作栈指针,用什么指令,就是这些汇编。
汇编已经是最低层了,人家怎么说怎么用,没啥商量的,不按照那么用也没有别的方法,这就是最官方的正式的用法了