inventor 0 28 сентября, 2021 Опубликовано 28 сентября, 2021 · Жалоба словил такой баг, который валивает прогу в хардфолт есть несколько задач и при своем старте они пишут сообщения: Я задача номер ... функция печати реализована т.о.: void log_printf(const char *tag, const char *msg, ...) { xSemaphoreTake(log_mtx, portMAX_DELAY); va_list list; /* Got time and str time &date */ rtc_get_str_time(str_arr); xputs(str_arr); xputs(tag); /* Copy tag */ xputs(": "); va_start(list, msg); xvfprintf(uart_putc, msg, list); va_end(list); xSemaphoreGive(log_mtx); } а любая задача например стартует так: void StartHearbeatTask(void const * argument) { static const char *tag = "Hearbeat"; log_printf(tag,"START\r\n"); Heatbeat_task(); } Заметил такую вещь, если скорость порта будет очень низкая или в функции печати что то долгое, то происходит вот что, предположим стартуют 10 задач, первая задача написала: Я задача номер 1 вторая: я-задача номер 2 третья: я зада.... потом пытается четвертая - и вылет в хардфолт насколько я понял, при начальном старте задача берет семафор печатает, но не успевает это доделать, на исполнение ставится другая задача, которая никогда семафора не дождется. Когда Ось запущена, то все хорошо работает , вне зависимости от времени занятия этих семафоров, проблема при старте оси, вот как это можно избежать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 28 сентября, 2021 Опубликовано 28 сентября, 2021 · Жалоба 9 minutes ago, inventor said: который валивает прогу в хардфолт Расшифруйте его. Он для того производителем ядра и создан) Как минимум, посмотрите что там с PC. Где программа валится. Вы не указали, какой у Вас Cortex. Но начиная с M3 возможности расшифровки довольно большие. В M0 всё минималистично. Наиболее вероятные причины: переполнение стэка, printf довольно жруч до стэка, переполнение буфера с которым va_list работает. Кстати, стэки надо смотреть и MSP, настраивается в скрипте линкера, и PSP, настраивается для каждой задачи при её создании. Включите ловушку переполнения стэка, она программная, но всё же что-то ловит. Убедитесь, что макросы configASSERT сконфигурированы. По ним тоже можно полезную информацию отловить. Ваш драйвер последовательного порта тоже может содержать ошибки. А кажется, что проблема с процессами. 9 minutes ago, inventor said: "Hearbeat"; Смените название) Оно у Вас и падать перестанет)))) Наверно надо так "Heartbeat". "Хербит" это как-то жёстко) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 28 сентября, 2021 Опубликовано 28 сентября, 2021 · Жалоба Не используйте сервисы ОС до старта планировщика. Удобно создать стартап-задачу, которая запустит остальные и самоубьется (или займется чем-нибудь полезным) после. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 сентября, 2021 Опубликовано 29 сентября, 2021 · Жалоба 8 hours ago, inventor said: проблема при старте оси, вот как это можно избежать Так ПРИ старте ОС или ДО старта ОС? Две большие разницы. Тем не менее, следует включить все отладочные средства, предоставляемые данной библиотекой, и не использовать сервисы ОСРВ до запуска планировщика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rkit 1 29 сентября, 2021 Опубликовано 29 сентября, 2021 · Жалоба 11 hours ago, inventor said: на исполнение ставится другая задача, которая никогда семафора не дождется. Которая дойдет до xSemaphoreTake, и отдаст контроль обратно, если семафор занят сейчас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 29 сентября, 2021 Опубликовано 29 сентября, 2021 · Жалоба Ну пока что из приведенного кода не видно, что ТС использует сервисы ОС до запуска планировщика... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 29 сентября, 2021 Опубликовано 29 сентября, 2021 · Жалоба 5 часов назад, Arlleex сказал: Ну пока что из приведенного кода не видно, что ТС использует сервисы ОС до запуска планировщика... Более того - из исходного сообщения видно, что он их использует ПОСЛЕ старта ОС: 18 часов назад, inventor сказал: есть несколько задач и при своем старте они пишут сообщения: Я задача номер ... Из текста следует, что ТС обращается к указанной функции из задач. Очевидно, что пока ОС не запущена - никаких задач нет. По определению. А значит - после старта. Если только ТС не ввёл в заблуждение всех. Что вполне вероятно, глядя как косноязычно написан вопрос.... PS: Если же вопрос был бы сформулирован грамотно, например так: Есть некая функция, которая может вызываться как из задач ОС, так и до старта ОС. То и ответить можно было бы осмысленно: Проверить соответствующую статусную переменную, показывающую, что ОС запущена (наверняка во FreeRTOS такая имеется) и только после этого можно вызывать сервисы ОС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 сентября, 2021 Опубликовано 29 сентября, 2021 · Жалоба Что именно происходит у ТС сказать трудно, но типичная схема фейла такая: начали создавать задачи до старта планировщика, параллельно инициализируя периферию -> cловили прерывание от периферии -> обработчик полез за семафором/очередью -> все умерли Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 4 октября, 2021 Опубликовано 4 октября, 2021 · Жалоба ок, вопрос по пробую по другому, не косноязычно. ось выставляет задачи на исполнение, с 1-й по 10-ю ДО момента когда они начинают крутится все вместе в бесконечном цикле, можно использовать семафоры или не? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 4 октября, 2021 Опубликовано 4 октября, 2021 · Жалоба 46 minutes ago, inventor said: ДО момента когда они начинают крутится все вместе в бесконечном цикле, можно использовать семафоры или не? До старта планировщика нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 4 октября, 2021 Опубликовано 4 октября, 2021 · Жалоба 44 минуты назад, inventor сказал: ...можно использовать семафоры или не? Не совсем корректно вопрос поставлен, все равно. До запуска планировщика практически любые вызовы сервисов ОС запрещены. Цитата ...когда они начинают крутится все вместе в бесконечном цикле... Как правило, задачи имеют вид приблизительно такой void task(void *tp) { ... // кусок кода до бесконечного цикла ... while(1) { // кусок кода в бесконечном цикле } } Вот в любых местах этой функции уже можно использовать сервисы ОС, как в "куске до бесконечного цикла", так и в while(1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 4 октября, 2021 Опубликовано 4 октября, 2021 · Жалоба 1 час назад, inventor сказал: ДО момента когда они начинают крутится все вместе в бесконечном цикле, можно использовать семафоры или не? Вот я никак не пойму: Зачем Вам семафоры ДО старта задач? На кой вы их так упорно пытаетесь использовать ДО? 22 минуты назад, Arlleex сказал: До запуска планировщика практически любые вызовы сервисов ОС запрещены. Я бы уточнил, наверное: "Любые, могущие привести к вытеснению задачи..." Некоторые возможно будут доступны и до. Например может быть доступно: изменение приоритета созданной, но ещё не запущенной задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 17 5 октября, 2021 Опубликовано 5 октября, 2021 (изменено) · Жалоба 1)вставь в log_printf слып void log_printf(const char *tag, const char *msg, ...) { xSemaphoreTake(log_mtx, portMAX_DELAY); va_list list; /* Got time and str time &date */ rtc_get_str_time(str_arr); xputs(str_arr); xputs(tag); /* Copy tag */ xputs(": "); va_start(list, msg); xvfprintf(uart_putc, msg, list); va_end(list); vTaskDelay(1000); //синтаксис не помню, см RM xSemaphoreGive(log_mtx); } запусти 20 10 таких задач void StartHearbeatTask(void const * argument) { static const char *tag = "Hearbeat"; log_printf(tag,"START\r\n"); for(;;) vTaskSleep(100); //Heatbeat_task(); } ОС валится? Если нет, то хитбит в студию Или может при запуске >10 задач стек переполняется? Метод vApplicationStackOverflowHook() определён? В него попадаешь? ps 2) задачу оставь со слыпом как в 1), а лог такой void log_printf(const char *tag, const char *msg, ...) { xSemaphoreTake(log_mtx, portMAX_DELAY); for(int i = 0; i< 500; i++) //печатаем что-то долгое, с чего валится ОС { va_list list; /* Got time and str time &date */ rtc_get_str_time(str_arr); xputs(str_arr); xputs(tag); /* Copy tag */ xputs(": "); va_start(list, msg); xvfprintf(uart_putc, msg, list); va_end(list); } xSemaphoreGive(log_mtx); } Валится? Изменено 5 октября, 2021 пользователем razrab83 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 5 октября, 2021 Опубликовано 5 октября, 2021 · Жалоба В понедельник попробую. В принципе можно сделать фоэункцию Задачную и для работы без оси. Тока мне вот и надо определить когда ось считается запущенной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 6 октября, 2021 Опубликовано 6 октября, 2021 · Жалоба 12 hours ago, inventor said: Тока мне вот и надо определить когда ось считается запущенной. Ну как же когда? После запуска планировщика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться