STM32开发笔记71: 解决FreeRTOS任务的内存分配问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/qingwufeiyang12346/article/details/89061242
今日推荐