CMSIS RTOS 中的多线程 - STM32 nucleo L053R8
multiple thread in CMSIS RTOS - STM32 nucleo L053R8
今天我为套件STM32 nucleo L053R8开发RTOS(CMSIS RTOS)。我有与多项任务相关的问题。
我创建了 4 个任务(task_1、task_2、task_3、task_4),但是只有 3 个任务 运行。
这是我的代码的一部分:
#include "main.h"
#include "stm32l0xx_hal.h"
#include "cmsis_os.h"
osMutexId stdio_mutex;
osMutexDef(stdio_mutex);
int main(void){
.....
stdio_mutex = osMutexCreate(osMutex(stdio_mutex));
osThreadDef(defaultTask_1, StartDefaultTask_1, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_1), NULL);
osThreadDef(defaultTask_2, StartDefaultTask_2, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_2), NULL);
osThreadDef(defaultTask_3, StartDefaultTask_3, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_3), NULL);
osThreadDef(defaultTask_4, StartDefaultTask_4, osPriorityNormal, 0, 600);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_4), NULL);
}
void StartDefaultTask_1(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
void StartDefaultTask_2(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
void StartDefaultTask_3(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
void StartDefaultTask_4(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
这是控制台 (uart) 中的结果:
当我将任务 4 的堆栈大小从 600 -> 128 更改如下时:
osThreadDef(defaultTask_4, StartDefaultTask_4, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_4), NULL);
那么没有任何任务运行。
其实我想为我的应用程序创建很多线程,但是这个问题导致难以实现。
你能告诉我问题的根本原因吗?以及如何解决它。
提前谢谢!!
根据您的建议,我通过调试进行了检查,发现根本原因是堆大小太小。
我用2种方法解决
增加堆大小:#define configTOTAL_HEAP_SIZE ((size_t)5120)
减少堆栈大小:#define configMINIMAL_STACK_SIZE ((uint16_t)64)
osThreadDef(defaultTask_6, StartDefaultTask_6, osPriorityNormal, 0, 64);
你知道如何确定堆大小的最大值吗?请告诉我。
非常感谢
堆栈计算没有通用的简单方法。这取决于很多因素。
我建议避免堆栈贪婪函数,如 printf scanf 等。编写自己的函数,而不是 "smart" 和通用但资源贪婪较少。
避免大的局部变量。分配内存时要非常小心
今天我为套件STM32 nucleo L053R8开发RTOS(CMSIS RTOS)。我有与多项任务相关的问题。
我创建了 4 个任务(task_1、task_2、task_3、task_4),但是只有 3 个任务 运行。
这是我的代码的一部分:
#include "main.h"
#include "stm32l0xx_hal.h"
#include "cmsis_os.h"
osMutexId stdio_mutex;
osMutexDef(stdio_mutex);
int main(void){
.....
stdio_mutex = osMutexCreate(osMutex(stdio_mutex));
osThreadDef(defaultTask_1, StartDefaultTask_1, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_1), NULL);
osThreadDef(defaultTask_2, StartDefaultTask_2, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_2), NULL);
osThreadDef(defaultTask_3, StartDefaultTask_3, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_3), NULL);
osThreadDef(defaultTask_4, StartDefaultTask_4, osPriorityNormal, 0, 600);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_4), NULL);
}
void StartDefaultTask_1(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
void StartDefaultTask_2(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
void StartDefaultTask_3(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
void StartDefaultTask_4(void const * argument){
for(;;){
osMutexWait(stdio_mutex, osWaitForever);
printf("%s\n\r", __func__);
osMutexRelease(stdio_mutex);
osDelay(1000);
}
}
这是控制台 (uart) 中的结果:
当我将任务 4 的堆栈大小从 600 -> 128 更改如下时:
osThreadDef(defaultTask_4, StartDefaultTask_4, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask_4), NULL);
那么没有任何任务运行。
其实我想为我的应用程序创建很多线程,但是这个问题导致难以实现。
你能告诉我问题的根本原因吗?以及如何解决它。
提前谢谢!!
根据您的建议,我通过调试进行了检查,发现根本原因是堆大小太小。
我用2种方法解决
增加堆大小:#define configTOTAL_HEAP_SIZE ((size_t)5120)
减少堆栈大小:#define configMINIMAL_STACK_SIZE ((uint16_t)64)
osThreadDef(defaultTask_6, StartDefaultTask_6, osPriorityNormal, 0, 64);
你知道如何确定堆大小的最大值吗?请告诉我。
非常感谢
堆栈计算没有通用的简单方法。这取决于很多因素。
我建议避免堆栈贪婪函数,如 printf scanf 等。编写自己的函数,而不是 "smart" 和通用但资源贪婪较少。
避免大的局部变量。分配内存时要非常小心