многопоточность в CMSIS RTOS - STM32 nucleo L053R8

Сегодня я занимаюсь разработкой RTOS (CMSIS RTOS) для комплекта STM32 nucleo L053R8. У меня проблема, связанная с несколькими задачами.

Я создаю 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);

тогда не выполняйте никаких задач.

На самом деле я хочу создать много потоков для своего приложения, однако эту проблему сложно реализовать.

Не могли бы вы сообщить мне первопричину проблемы? и как это решить.

Спасибо заранее !!


person Cuong Hoang Van    schedule 15.08.2017    source источник
comment
Пахнет стопкой проблем. Проверьте свои настройки. В любом случае я бы предложил что-нибудь еще, кроме printf. Он очень жадный к стеку и куче, и вы запускаете его на крошечном микроконтроллере, а не на ПК.   -  person 0___________    schedule 15.08.2017
comment
во-первых, спасибо за ответ, я использую KITT STM32L053R8 и это моя настройка _Min_Heap_Size = 0x200; _Min_Stack_Size = 0x400 (1024 байт); configMINIMAL_STACK_SIZE = 128   -  person Cuong Hoang Van    schedule 16.08.2017


Ответы (2)


Не существует простого простого метода расчета стека. Это зависит от многих факторов.

Я бы посоветовал избегать жадных функций стека, таких как printf scanf и т. Д. Пишите свои собственные, не такие «умные» и универсальные, но с меньшей жадностью ресурсов.

Избегайте больших локальных переменных. Будьте очень осторожны при распределении памяти

person 0___________    schedule 16.08.2017

Как ваши предложения, я проверил отладку и увидел, что основная причина - небольшой размер кучи.

Разрешаю 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);

Вы знаете, как определить максимальный размер кучи? Пожалуйста, дайте мне знать.

Большое спасибо

person Cuong Hoang Van    schedule 16.08.2017