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
,這也證明了上面對啓動文件的修改。