项目场景:
FreeRTOS实时嵌入式操作系统开发——基于stm32
第一章移植代码
问题描述:
任务调度器执行到vtaskstartscheduler(); //开启任务调度语句不执行
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
printf("11111111111111111111111");
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
printf("222222222222222222");
vTaskStartScheduler(); //开启任务调度
printf("33333333333333333333333333333");
}
原因分析:
通过在串口逐行打印的方式找到是vtaskstartscheduler(); //开启任务调度语句不执行
解决方案:
问题的具体解决方案:将下面的代码放到FreeRTOSConfig.h
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
官方例子中提供的每一个移植好的程序样例在相应的硬件平台上都能正确编译和运行而不用做任何的修改。提供的样例工程将确保新用户尽可能花费最少的时间和精力开始使用FreeRTOS。我们推荐从提供的已经预配置的例子中选择一个合适的略作修改来开始自己新的工程,这样做可以确保新的工程包含了必要的源文件和头文件,以及安装了必要的中断服务程序。如果你创建的工程已经能够编译并且可以运行,但是调用完vTaskStartScheduler()函数后只有一个任务运行或没有任务运行,那么很可能是你中断向量表不正确。
ARM CORTEX-M用户特别注意:ARM Cortex-M3,ARM Cortex-M4和ARM Cortex-M4F上的移植需要FreeRTOS处理安装的SysTick,PendSV和SVCCall中断向量,中断向量表可以分别直接使用FreeRTOS定义的xPortSysTickHandler(),xPortPendSVHandler()和vPortSVCHandler()三个函数。但是,如果中断向量表是与CMSIS兼容的话,用户需在FreeRTOSConfig.h中添加以下三行代码以使FreeRTOS和CMSIS中中断向量名字做映射。