https://www.jianshu.com/p/a6afea04b62c
https://www.jianshu.com/p/01f3580feef8
修改FreeRTOS.h下的两个宏定义,从0改为1
4.修改startup_stm32f10x_hd.s
在第56行开始的地方
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
/******************************change****************************/
IMPORT vPortSVCHandler
IMPORT xPortPendSVHandler
IMPORT xPortSysTickHandler
/****************************************************************/
__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
/**************************************change****************************************/
; 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
DCD xPortSysTickHandler
/**************************************************************************************/
有一个问题 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
,这也证明了上面对启动文件的修改。