标题:
一个关于IAP+APP 模式下不能启动RTOS的话题
[打印本页]
作者:
掘金小分队
时间:
2017-1-17 14:35
标题:
一个关于IAP+APP 模式下不能启动RTOS的话题
问题描述:
某客户
工程师讲述:他
使用
STM32F407IGT6 开发产品
,使用了IAP+APP 模式的软件架构。IAP 为自行编写的 BOOT程序,负责系统启动及更新 APP 程序,而 APP 则用于处理常规业务。系统启动后,首先运行 IAP程序,由其完成系统初始化后跳转APP。两段程序分别由两个独立的软件工程生成。其中,APP 程序是其于某款RTOS 构建的。在加入 IAP+APP 模式之前,分别做了单独的调试,即将其定位到0x08000000 开始的地址空间直接启动,而不通过 IAP 跳转,证实可以正常运行。加入到IAP+APP 架构中后,APP程序被重新定位到了 0x08004000 开始的地址空间。然而这种情况下
APP不能正常运行,跳飞掉了
。通过打印跟踪,发现从
IAP 到 APP的跳转可以顺利完成,APP前几行代码也可以执行,直到执行启动 RTOS 的函数后,不知去向。
问题调研:
检查
APP 软件工程,发现其软件工程是其于 ST 的标准外设驱动库构建的。于是,检查
其中的
system_stm32f4xx.c 文件,找到
systemInit()
函数。
将其中的
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET
改成:
SCB->VTOR = FLASH_BASE | 0x00004000
重新下载后,
RTOS 可以正常运行。
结论及处理:
用户没有重新定位中断向量表,导致
CPU 依使用 IAP 的中断向量表,进而APP 的中断无法被正常的处理。通常,RTOS 需要通过中断来进行任务调度,所以,致使其不能正常的运行。
当我们
修改软件,重新定位中断向量表到正确的位置后就OK。
话题延伸:
Cortex-M3 和Cortex-M4 的中断向量表是可以在最低 1GB 的地址空间内浮动的,且专门
设有一个偏移地址寄存器
VTOR
,用于指示中断向量表的位置,如图(一):
VTOR
的地址为:
0xE000ED08
,复位值为:
0x00000000
。所以,复位后
Cortex-M3
或
Cortex-M4
会到地址
0x00000000
取
SP
的取值,而到地址
0x00000004
取
PC
的取值,来启动程序。一般来说,程序启动后要重新装载
VTOR
的取值,使其指向自身的中断向量表,以保证后续程序能够正确的响应各个中断请求。在
Cortex-M3
和
Cortex-M4
的系统中,对于中断向量表的存放位置的对齐边界有一定的要求,可按如下公式计算:
其中,
N
表示对齐字节数,
Size
表示中断向量表的字节数。
这里特别提醒下,
Cortex-M0
没有
VTOR
寄存器,所以它的中断向量表必须放在
0x00000000
地址起始的寻址空间中,而不能浮动。因此,在
Cortex-M0
的系统中,如要更新中断向量表,需将
RAM
映射到
0x00000000
地址,然后将新的中断向量表复制到
0x00000000
地址起始的寻址空间当中
本文转载微信公众号:融创芯城(一站式电子元器件,PCB,PCBA购买与服务,项目众包、方案共享平台)
http://www.digiic.com/home
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0