View */
osThreadId_t ViewHandle;
uint32_t ViewBuffer[ 256 ];
osStaticThreadDef_t ViewControlBlock;
const osThreadAttr_t View_attributes = {
.name = "View",
.stack_mem = &ViewBuffer[0],
.stack_size = sizeof(ViewBuffer),
.cb_mem = &ViewControlBlock,
.cb_size = sizeof(ViewControlBlock),
.priority = (osPriority_t) osPriorityNormal,
};
ViewHandle = osThreadNew(tViewTask, NULL, &View_attributes);
(это cmsis_os2 обертка вокруг freertos)
то можно ее грохнуть и потом пересоздать на этих же переменных? По идее при удалении переменные останутся на месте и можно их опять использовать?..
а у вас какая цель то? чтобы задача останавливалась в определенном месте?
по внешнему событию (по кнопке СТОП) ее останавливать и потом запускать с самого начала.
и при нажатии стоп, очень важно, чтобы она до конца конечно же не дошла?
да и раскидать по ней периодическую проверку флага - гемор тот еще.
Странный кейс. Убивать задачи в вытесняющей ртос - такое себе, обычно так не делают. Я б еще понял, если кооперативка и памяти под дескрипторы задач нету. А что будет с данными в этой задачи, когда вы кнопку нажмете?
данные мне не нужны. Все что нужно - сохраняется по ходу дела. Мне нужно ее не удалить, а перезапустить с самого начала. А написана она линейно и довольно много шагов. Потому и хочу от внешнего воздействия ее перезапускать чтобы не переписывать эту портянку. (в наследство досталась)
ха, ну представьте, что кнопку нажали в момент сохранения данных и вы убили таску из другой, которая обрабатывает кнопку, получив управление от сервиса в прерывании. Это ж асинхронный процесс
Мб там на сохранение данных - критическая секция...
может быть даже мютекс 🤷🏻♂️ но в целом это плохой стиль проектирования
т.е. просто поставить "текущий шаг будет 0" нельзя?
Как оно написано сейчас - нет. Точнее можно, но слишком геморно.
Обсуждают сегодня