FreeRTOS进入函数prvStartFirstTask() 启动SVC后进入HardFault死循环
原因:在初始化串口时为串口中断配置的NVIC与FreeRTOS的优先级设置冲突
解决方法:设置USART的中断分组为,主优先级为4位,副优先级为0位即可!!
这是修改前的代码:
//使能发送和接收
usart_transmit_config(UART_Periph,USART_TRANSMIT_ENABLE);
usart_receive_config(UART_Periph,USART_RECEIVE_ENABLE);
//配置中断管理器
nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4);
nvic_irq_enable(USART0_IRQn,0,1);
这是修改后可以正常工作的代码:
//使能发送和接收
usart_transmit_config(UART_Periph,USART_TRANSMIT_ENABLE);
usart_receive_config(UART_Periph,USART_RECEIVE_ENABLE);
//配置中断管理器
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
nvic_irq_enable(USART0_IRQn,0xF,0);//这里将优先级设置为15,原因是下图代码
在FreeRTOSConfig.h文件中,设置的中断最低优先级为15.
//中断最低优先级
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
//系统可管理的最高中断优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) /* 240 */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )