单片机型号:STM32F091RCT6
在使用FreeRTOS进行程序设计时,遇到任务不能运行的问题,具体程序如下:
DebugOutput("启动USB通讯线程...rnrn");
osThreadDef(usbTask, StartUsbTask, osPriorityNormal, 0, 128);
usbTaskHandle = osThreadCreate(osThread(usbTask), NULL);
DebugOutput("启动雷达红外通讯线程...rnrn");
osThreadDef(irdaTask, StartIrdaTask, osPriorityNormal, 0, 128);
irdaTaskHandle = osThreadCreate(osThread(irdaTask), NULL);
DebugOutput("启动GPRS通讯线程...rnrn");
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
上一篇:STM32开发笔记72: 使用命名空间解决类名冲突问题
下一篇:STM32开发笔记70: 传递参数时,为何要对套接字地址进行强制
推荐阅读最新更新时间:2024-10-28 13:41
设计资源 培训 开发板 精华推荐
- 具有错误标志的 Si91821 微功率 300mA CMOS 固定输出 LDO 稳压器的典型应用
- AM30K-2415S-NZ 15V 30 瓦 DC-DC 转换器的典型应用
- 具有开尔文连接优势的 ADR421 2.5V XFET 输出电压基准的典型应用
- LT3091HDE 产生极低输出电压的典型应用
- 多版本 DW01 锂电池保护板
- 用于研究L6472的全集成的步进电机驱动器演示板
- AM2F-0512SH52Z 12V 2 瓦 DC/DC 转换器的典型应用
- 使用 Richtek Technology Corporation 的 RT6032A 的参考设计
- LTC2992HDE 双向 30V 至 300V 高侧功率监视器的典型应用
- 用于电池充电指示器的 NCP300LSN185T1 1.85V 电压检测器的典型应用