[应用相关]

解决FreeRTOS任务的内存分配问题

[复制链接]
1353|1
手机看帖
扫描二维码
随时随地手机跟帖
wakayi|  楼主 | 2019-7-4 11:23 | 显示全部楼层 |阅读模式
在使用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的配置有关。


使用特权

评论回复
wakayi|  楼主 | 2019-7-4 11:23 | 显示全部楼层
通过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



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

3803

帖子

1

粉丝