STM32移植FreeRTOS无法启动任务的解决方法
在实验过程中将FreeRTOS源码全部包含在了STM32F103的项目中,但是在实验的过程发现创建的任务无法启动,任务创建程序如下:
#define TEST1_TASK_PRIO 2 //任务优先级
#define TEST1_STK_SIZE 50 //任务堆栈大小
TaskHandle_t Task1_Handler; //任务句柄
void Test_task1(void *pvParameters); //任务函数
#define TEST2_TASK_PRIO 3 //任务优先级
#define TEST2_STK_SIZE 50 //任务堆栈大小
TaskHandle_t Task2_Handler; //任务句柄
void Test_task2(void *pvParameters); //任务函数
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化
printf("StartUp\r\n");
//创建任务
taskENTER_CRITICAL(); //进入临界区
xTaskCreate((TaskFunction_t )Test_task1,
(const char* )"Test_task1",
(uint16_t )TEST1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TEST1_TASK_PRIO,
(TaskHandle_t* )&Task1_Handler);
xTaskCreate((TaskFunction_t )Test_task2,
(const char* )"Test_task2",
(uint16_t )TEST2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TEST2_TASK_PRIO,
(TaskHandle_t* )&Task2_Handler);
taskEXIT_CRITICAL(); //退出临界区
vTaskStartScheduler(); //开启任务调度
}
//任务函数1
void Test_task1(void *pvParameters)
{
int i;
while(1)
{
for(i=0;i<100;i++)
{
printf("Task[1]: %d\r\n",i);
vTaskDelay(120);
}
}
}
//任务函数2
void Test_task2(void *pvParameters)
{
int i;
while(1)
{
for(i=0;i<100;i++)
{
printf("Task[2]: %d\r\n",i);
vTaskDelay(120);
}
}
}
上列代码在任务创建流程没有发现太大问题,百度搜了一下,说是受堆栈大小影响,但试了没有效果,于是在检查"FreeRTOSConfig.h"配置的过程中发现里面没有包含下列宏定义:
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
在"FreeRTOSConfig.h"里面复制这两行宏定义之后,任务开始正常执行。
解决办法:
将上列两行宏定义代码复制到"FreeRTOSConfig.h"头文件当中即可。