0

今天我为 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);

然后不要运行任何任务。

实际上我想为我的应用程序创建很多线程,但是这个问题导致难以实现。

你能让我知道问题的根本原因吗?以及如何解决它。

谢谢提前!!

4

2 回答 2

1

堆栈计算没有通用的简单方法。这取决于许多因素。

我建议避免使用 printf scanf 等堆栈贪婪函数。编写你自己的函数,而不是“智能”和通用但更少的资源贪婪。

避免使用大的局部变量。分配内存时要非常小心

于 2017-08-16T19:03:19.370 回答
0

根据您的建议,我通过调试进行了检查,发现根本原因是堆大小很小。

我通过2方法解决

  1. 增加堆大小:#define configTOTAL_HEAP_SIZE ((size_t)5120)

  2. 减小堆栈大小:#define configMINIMAL_STACK_SIZE ((uint16_t)64)

    osThreadDef(defaultTask_6, StartDefaultTask_6, osPriorityNormal, 0, 64);

你知道如何确定堆大小的最大值吗?请让我知道。

非常感谢

于 2017-08-16T17:44:39.877 回答