在使用原子的战舰开发板进行中断测试实验时发现,两个定时器只print一下就挂掉了,经过分析发现是SysTick_Handler
和xPortSysTickHandler
的冲突问题;
在上一篇移植的时候,有一个操作是修改启动文件 startup_stm32f10x_hd.s
,替换了三个关于中断的函数,其中注释掉了SysTick_Handler
,换成了xPortSysTickHandler
,但是在原子的开发手册中关于 delay.c
的systick函数修改是:
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
}
因此在修改启动文件的时候不需要替换SysTick_Handler
就可以:
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
IMPORT vPortSVCHandler
IMPORT xPortPendSVHandler
__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 vPortSVCHandler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
; DCD PendSV_Handler ; PendSV Handler
DCD xPortPendSVHandler
DCD SysTick_Handler ; SysTick Handler
具体为什么和定时器中的print函数冲突还有待挖掘;
另外一个就是:
FreeRTOS的demo中F4和F1的FreeRTOSconfig.h有差异,在进行F1中断测试的时候,需要修改
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x4F
有效的是MSB,也就是4,因为F1只用了m3内核的16个中断,低8位没有用,设置为0x4F则:优先级高于4的中断不会被屏蔽,等于低于4的会被屏蔽掉。
同时分析F4的FreeRTOSconfig.h
就会发现
没有重定义
SysTick_Handler
,这也证明了上面对启动文件的修改。
网友评论