189 похожих чатов

#Вопросподелу Как во FreeRTOS организовать рестарт задачи? То есть мне

нужно из середины второй задачи перейти в начало(!) первой задачи
Схема памяти heap1, т.е. статическое выделение, поэтому vTaskDelete - Create невозможно применить

Остаётся goto
Но не сломает ли goto внутреннюю логику FreeRTOS?..

49 ответов

35 просмотров

vTaskDelete - Create никто не мешает применять и в статик - но идея так себе Остаётся goto - прямо из задачи в задачу ??? - сорри, оторвать руки почему нормальные механизмы нельзя использовать типа семафоров для передачи управления из задачи в задачу ?

... Или нотификацию.

Max-Sysoev Автор вопроса
ok-home
vTaskDelete - Create никто не мешает применять и в...

Freertos запрещает, ну и чисто логически, vtaskdelete это очищение памяти по сути, а не "удаление" Нормальные механизмы нельзя, так как первый процесс длительный с vtaskdelay и его нельзя прервать, например, нотификацией Я сейчас пришёл к xTaskAbortDelay и флагу Но ещё не тестил Goto работать не будет в функциях как я понял, подробнее не разбирался Ещё думал про set jump long jump, но оставлю на будущее))

Max-Sysoev Автор вопроса
Max Sysoev
Freertos запрещает, ну и чисто логически, vtaskdel...

Freertos запрещает ?? - хотелось бы первоисточник - не вижу никаких проблем удалить задачу из шедулера - https://forums.freertos.org/t/vtaskdelete-of-a-static-task/8354 vtaskdelay прервать - ну так и поставьте вместо vtaskdelay тот же семафор или нотификацию - xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait ) - чем вам не vtasdelay? будет ждать пока не пройдет xTicksToWait или семафор не отдадут ( то же с очередями и нотификациями ) set jump long jump - большие знания большие печали ))) дерзайте !!!!

Сделайте очередь и команды. Одна из команд - ресарт

Max-Sysoev Автор вопроса
ok-home
Freertos запрещает ?? - хотелось бы первоисточник ...

vTaskDelete использует vPortFree (heap1.c) void vPortFree( void *pv ) { /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the memory management pages of http://www.FreeRTOS.org for more information. */ ( void ) pv; /* Force an assert as it is invalid to call this function. */ configASSERT( pv == NULL ); }

Max-Sysoev Автор вопроса
ok-home
Freertos запрещает ?? - хотелось бы первоисточник ...

Delay и xSemaphoreTake c xTicksToWait это разное конечно же. В случае с простым delay первая задача (в которой delay) не ждёт вторую задачу, она от неё не зависит. Можно конечно, прикрутить освобождение семафора во второй задаче, но так как вторая задача опять же длительный процесс это становится нетривиальным

Max-Sysoev Автор вопроса
Alexey Tsvetkov
Сделайте очередь и команды. Одна из команд - ресар...

Звучит как мем "а теперь рисуем остаток совы" Вопрос был именно в том, как организовать рестарт длительной задачи из другой задачи

Max Sysoev
Звучит как мем "а теперь рисуем остаток совы" Вопр...

Ммм я вот ща подприкинул, вы это технически никак не можете сделать ПРАВИЛЬНО.

Max Sysoev
Delay и xSemaphoreTake c xTicksToWait это разное ...

не понял ? вторая задача ( это с ваших слов ) должна перезагрузить первую ( значит есть условие ) ? Значит это тривиально ? А послать сигнал первой ( освободить семафор по тому же условию ) о том что нужно произвести определенные действия это не тривиально ?? и поставить в первой задаче if по условию выхода из семафора ( по delay или по сигналу перезагрузки ) ..... т-е использовать штатные способы межпроцессного взаимодействия это нетривиально а taskDelete, xTaskAbortDelay, longjamp.....

ok-home
не понял ? вторая задача ( это с ваших слов ) долж...

я думаю там имелось ввиду то, что по команде задачи В, задача А начнет немедленное выполнение с начала

Max-Sysoev Автор вопроса
ok-home
не понял ? вторая задача ( это с ваших слов ) долж...

Пример: первая задача выполняет delay(10 секунд), вторая задача не может прервать в лоб delay на 5 секунде. Значит уже нужно делить делить delay по 1 секунде и проверять, например, семафор, тогда в худшем случае я потеряю одну секунду. Хотелось бы без блокирующих ожиданий

Max Sysoev
Да

После делея проверять флаг на удаление и удалятся\резетится. Просто на примере делея это не видно. А представьте себе, что задача не в делее висит, а хз, динамически объекты создает в куче. Вот она половину создала. А вы ее взяли и прихлопнули. Где память аллоковски? Где чертова память ликхед?

Max-Sysoev Автор вопроса
SetPf
После делея проверять флаг на удаление и удалятся\...

Непосредственно проблема удаления задачи меня не интересует. Мне бы прыгнуть в начало. Попробую с xTaskAbortDelay, отпишусь

Max Sysoev
Непосредственно проблема удаления задачи меня не и...

Вот из коробки у вас следующие варианты: 1) Состояние и команды для задачи. При выходе из делея, задача проверит команды, и установит новое состояние. А еще лучше, если она заснет на чтении из очереди и проснется по первой же команде, которая и будет резетом. 2) Динамически создавать задачу, передавая\отбирая интерфейс с внешним миром (который защищен мутексом будет). Т.е. задача проснется, полезет в интерфейс а там ничего нет, после чего она завершится. А новая стартанет с ним и начнет все по новой. (аккуратнее с дедлоком только тут). Может еще есть варианты.

Max-Sysoev Автор вопроса
SetPf
Вот из коробки у вас следующие варианты: 1) Состо...

Спасибо 1) Здесь блокирующее ожидание 2) У меня heap_1, что не подразумевает операцию освобождения памяти

Max-Sysoev Автор вопроса
SetPf
Так у вас и с delay тоже

Да. А хотелось бы, чтобы нет)

Max Sysoev
Да. А хотелось бы, чтобы нет)

Т.е. вы хотите, что бы задача резетилась в любой момент, в том числе, если она даже преостановлена диспетчером во время каких-то действий? А не только в блокирующем ожидании.

Max Sysoev
Пример: первая задача выполняет delay(10 секунд), ...

Если первая задача ждёт 10 секунд вторая может просыпаться хоть 1000 раз, вы путаете делей и ожидание в freertos

Max-Sysoev Автор вопроса
SetPf
Т.е. вы хотите, что бы задача резетилась в любой м...

В блокирующем ожидании. "Блокирующее" применительно к первой задаче

Max-Sysoev Автор вопроса
Max Sysoev
Пока выйдет delay

а она не может ждать сигнала от "главной" задачи?

Max-Sysoev Автор вопроса
Ник Д
Если первая задача ждёт 10 секунд вторая может про...

Пока задача находится в delay, она заблокирована и не может обновить своё состояние

Max-Sysoev Автор вопроса
Aleksander Zholtkovskii
а она не может ждать сигнала от "главной" задачи?

Не может, потому что как и я написал выше - задача находится в delay, она заблокирована и не может обновить своё состояние

Max Sysoev
Не понял вопроса

что мешает переписать задачу чтобы она вместо тупого delay ждала сигнал от "главной" задачи?

Max-Sysoev Автор вопроса
Aleksander Zholtkovskii
что мешает переписать задачу чтобы она вместо тупо...

Ну наверное то, что у задачи своя логика, время выполнения )

Max Sysoev
Ну наверное то, что у задачи своя логика, время вы...

Если у вас там делей как времязадающая сущность - сами себе злобный буратино, для этого есть таймеры.

Max Sysoev
Ну наверное то, что у задачи своя логика, время вы...

так никто же не мешает вместо тупого delay воткнуть ожидание сигнала с тем же самым временем таймаута. Таймаут вышел работаем дальше, пришёл сигнал, всё бросаем и начинаем сначала.

Aleksander Zholtkovskii
так никто же не мешает вместо тупого delay воткнут...

ну в плане, если там 15 делеев подряд, то каждый раз читать\проверять очередь это будет жестко.

Max-Sysoev Автор вопроса
Max Sysoev
омг. vTaskDelay по вашему не на таймере?)

Нет. Это синхронный блок задачи

SetPf
ну в плане, если там 15 делеев подряд, то каждый р...

ну а какие ещё варианты? Можно конечно удалить задачу из шедуллера и запустить её снова, но, имхо, в этом случае гораздо сложнее обеспечить корректность работы.

Max-Sysoev Автор вопроса
Aleksander Zholtkovskii
так никто же не мешает вместо тупого delay воткнут...

Этот вариант возможен и я его уже описывал

Max Sysoev
Этот вариант возможен и я его уже описывал

Но вы хотите найти способ, сделать архитектурно кривое, не правильное и опасное решение, которое противоречит философии статического выделения и хипа1 в частности?

Max-Sysoev Автор вопроса
Max Sysoev
Не хочу, с чего вы решили?

Тип просто в данный момент это выглядит как вопрос - а как заменить колесо на едущем автомобиле? Ну технически это можно. Но это дурная идея, опасная. Для этого есть автозаплатки и подкачка. Но вы не хотите что бы в колесе что то было или делать систему автоподкачки, просто хотите заменить колесо на ходу. Вот примерно так это выглядит ща =)

Max-Sysoev Автор вопроса
SetPf
Тип просто в данный момент это выглядит как вопрос...

По-моему, вы почему-то зацепились за удаление задачи и мыслите вокруг этого, а это не так.

Max Sysoev
По-моему, вы почему-то зацепились за удаление зада...

Вы хотите перезапустить задачу с нулевой инструкции. (грубо говоря)

Max-Sysoev Автор вопроса
SetPf
Вы хотите перезапустить задачу с нулевой инструкци...

Не совсем. Меня бы устроило выйти из delay, проверить флаг (событие, семафор , etc) и я автоматически окажусь в начале задачи в силу цикличности процесса

Max Sysoev
Не совсем. Меня бы устроило выйти из delay, провер...

Ок. ЖдатьСемафор(100) Это не значит, что он будет ждать семафор и через 100 сек сообщит результат, а значит что как только разлочиться семафор, он тут же стартанет. ЛИБО он стартанет через 100 секунд. Через сколько он стартанул - будет в результате (получено владение семафором или нет) А вот че дальше делать - пишете вы. (ничто не мешает забить хрен и зайти в зону семафора без его получения)

Max-Sysoev Автор вопроса
SetPf
Ок. ЖдатьСемафор(100) Это не значит, что он буд...

Я отвечал на этот вопрос другому человеку. Повторюсь. Семафор не всегда будет разлочен. Когда-то будет, а когда-то нет. А процесс в задаче должен идти своим чередом Так как дискуссия пошла по кругу, я на этом остановлюсь. Коллеги, спасибо за советы и мнение

Max Sysoev
Я отвечал на этот вопрос другому человеку. Повто...

Вы можете взводить семафор при рестарте задачи.

SetPf
Вы можете взводить семафор при рестарте задачи.

Семафор же не общественный туалет, там кто угодно не передергивает. Только 2 задачи о нем знают. 1я пытается попасть раз, занимая его. (ну или при рестарте сразу его занимает, что бы потом на нем встать). И тут же сразу еще раз на нем блочится. Другая разблочивает, если он взведен. Но тут надо тоже с атомарностью не потеряться . Но очереди тут сподручнее будут конечно.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта