打印
[应用相关]

一个关于IAP+APP 模式下不能启动RTOS的话题

[复制链接]
883|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题描述:
某客户工程师讲述:他使用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 地址起始的寻址空间当中。


沙发
feelhyq| | 2017-1-17 17:03 | 只看该作者
给楼主一个小小建议,关于

将其中的
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET
改成:
SCB->VTOR = FLASH_BASE | 0x00004000

重新下载后,RTOS 可以正常运行。

您所讲到的这个设置在修改APP程序的地址后 这个SCB->VTOR = FLASH_BASE | 0x00004000 也会跟着要去被设置,推荐一个简单的办法,不用去设置VTOR偏移量:

start.s 启动代码
     __Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall Handler
                DCD     DebugMon_Handler          ; Debug Monitor Handler
                DCD     0                         ; Reserved
                DCD     PendSV_Handler            ; PendSV Handler
                DCD     SysTick_Handler           ; SysTick Handler
                .
                .
                .
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main

                ; redirect the interrupt vector
                LDR     R0, =__Vectors                      /*  只需要根据汇编标识符号就能知道APP的偏移量 */
                LDR     R1, =__SCB_VTOR
                STR     R0, [R1]

使用特权

评论回复
板凳
wenunit| | 2017-1-18 12:45 | 只看该作者
feelhyq 发表于 2017-1-17 17:03
给楼主一个小小建议,关于

将其中的

高明..............................................

使用特权

评论回复
地板
黑猫警长不吃糖|  楼主 | 2017-1-18 14:31 | 只看该作者
feelhyq 发表于 2017-1-17 17:03
给楼主一个小小建议,关于

将其中的

受教,感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:资深FAE工程师顾问群:499391543;微信公众号:融创芯城

120

主题

219

帖子

18

粉丝