版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingwufeiyang12346/article/details/89061242
单片机型号:STM32F091RCT6
在使用FreeRTOS进行程序设计时,遇到任务不能运行的问题,具体程序如下:
DebugOutput("启动USB通讯线程...\r\n\r\n");
osThreadDef(usbTask, StartUsbTask, osPriorityNormal, 0, 128);
usbTaskHandle = osThreadCreate(osThread(usbTask), NULL);
DebugOutput("启动雷达红外通讯线程...\r\n\r\n");
osThreadDef(irdaTask, StartIrdaTask, osPriorityNormal, 0, 128);
irdaTaskHandle = osThreadCreate(osThread(irdaTask), NULL);
DebugOutput("启动GPRS通讯线程...\r\n\r\n");
osThreadDef(gprsTask, StartGprsTask, osPriorityNormal, 0, 128);
gprsTaskHandle = osThreadCreate(osThread(gprsTask), NULL);
程序创建了3个线程,但是第3个任务不能正常运行。尝试多种方法解决,最后发现问题在于任务的堆栈的分配上,减小任务分配的堆栈大小,3个线程可以正常运行。
我现在使用的是STM32F091RCT6单片机,RAM为32K,所以确认不是硬件问题,应该和FreeRTOS的配置有关。
通过FreeRTOS的官方手册,最后确认到配置的参数为configTOTAL_HEAP_SIZE,其解释为静态分配内存的大小,其在FreeRTOSConfig.h中,增大其值后程序正常运行。
#define configUSE_PREEMPTION 1
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( SystemCoreClock )
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 7 )
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
#define configTOTAL_HEAP_SIZE ((size_t)4 * 1024)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_16_BIT_TICKS 0
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。