Jump to content

    
Sign in to follow this  
inventor

Когда задача считается запущеной

Recommended Posts

словил такой баг, который валивает прогу в хардфолт

есть несколько задач и при своем старте они пишут сообщения: Я задача номер ...

функция печати реализована т.о.: 

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

третья: я зада....

потом пытается четвертая - и вылет в хардфолт

насколько я понял, при начальном старте задача берет семафор

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

Когда Ось запущена, то все хорошо работает , вне зависимости от времени занятия этих семафоров,

проблема при старте оси, вот как это можно избежать

Share this post


Link to post
Share on other sites
9 minutes ago, inventor said:

который валивает прогу в хардфолт

Расшифруйте его. Он для того производителем ядра и создан) Как минимум, посмотрите что там с PC. Где программа валится. Вы не указали, какой у Вас Cortex. Но начиная с M3 возможности расшифровки довольно большие. В M0 всё минималистично. Наиболее вероятные причины: переполнение стэка, printf довольно жруч до стэка, переполнение буфера с которым va_list работает. Кстати, стэки надо смотреть и MSP, настраивается в скрипте линкера, и PSP, настраивается для каждой задачи при её создании. Включите ловушку переполнения стэка, она программная, но всё же что-то ловит. Убедитесь, что макросы configASSERT сконфигурированы. По ним тоже можно полезную информацию отловить. Ваш драйвер последовательного порта тоже может содержать ошибки. А кажется, что проблема с процессами.

9 minutes ago, inventor said:

"Hearbeat";

Смените название) Оно у Вас и падать перестанет)))) Наверно надо так "Heartbeat". "Хербит" это как-то жёстко)

Share this post


Link to post
Share on other sites

Не используйте сервисы ОС до старта планировщика. Удобно создать стартап-задачу, которая запустит остальные и самоубьется (или займется чем-нибудь полезным) после.

Share this post


Link to post
Share on other sites
8 hours ago, inventor said:

проблема при старте оси, вот как это можно избежать

Так ПРИ старте ОС или ДО старта ОС? Две большие разницы. Тем не менее, следует включить все отладочные средства, предоставляемые данной библиотекой, и не использовать сервисы ОСРВ до запуска планировщика.

Share this post


Link to post
Share on other sites
11 hours ago, inventor said:

на исполнение ставится другая задача, которая никогда семафора не дождется.

Которая дойдет до xSemaphoreTake, и отдаст контроль обратно, если семафор занят сейчас.

Share this post


Link to post
Share on other sites
5 часов назад, Arlleex сказал:

Ну пока что из приведенного кода не видно, что ТС использует сервисы ОС до запуска планировщика...

Более того - из исходного сообщения видно, что он их использует ПОСЛЕ старта ОС:

18 часов назад, inventor сказал:

есть несколько задач и при своем старте они пишут сообщения: Я задача номер ...

Из текста следует, что ТС обращается к указанной функции из задач. Очевидно, что пока ОС не запущена - никаких задач нет. По определению. А значит - после старта.

Если только ТС не ввёл в заблуждение всех. Что вполне вероятно, глядя как косноязычно написан вопрос....

 

 

PS: Если же вопрос был бы сформулирован грамотно, например так: Есть некая функция, которая может вызываться как из задач ОС, так и до старта ОС.

То и ответить можно было бы осмысленно: Проверить соответствующую статусную переменную, показывающую, что ОС запущена (наверняка во FreeRTOS такая имеется) и только после этого можно вызывать сервисы ОС.

Share this post


Link to post
Share on other sites

Что именно происходит у ТС сказать трудно, но типичная схема фейла такая:

начали создавать задачи до старта планировщика, параллельно инициализируя периферию -> cловили прерывание от периферии -> обработчик полез за семафором/очередью -> все умерли

Share this post


Link to post
Share on other sites

ок, вопрос по пробую по другому, не косноязычно.

ось выставляет задачи на исполнение,

с 1-й по 10-ю

ДО момента

когда они начинают крутится все вместе в бесконечном цикле,

можно использовать семафоры или не?

 

Share this post


Link to post
Share on other sites
46 minutes ago, inventor said:

ДО момента

когда они начинают крутится все вместе в бесконечном цикле,

можно использовать семафоры или не?

До старта планировщика нельзя.

Share this post


Link to post
Share on other sites
44 минуты назад, inventor сказал:

...можно использовать семафоры или не?

Не совсем корректно вопрос поставлен, все равно.
До запуска планировщика практически любые вызовы сервисов ОС запрещены.
 

Цитата

...когда они начинают крутится все вместе в бесконечном цикле...

Как правило, задачи имеют вид приблизительно такой

void task(void *tp)
{
  ... // кусок кода до бесконечного цикла
  ...
  while(1)
  {
    // кусок кода в бесконечном цикле
  }
}


Вот в любых местах этой функции уже можно использовать сервисы ОС, как в "куске до бесконечного цикла", так и в while(1).

Share this post


Link to post
Share on other sites
1 час назад, inventor сказал:

ДО момента

когда они начинают крутится все вместе в бесконечном цикле,

можно использовать семафоры или не?

Вот я никак не пойму: Зачем Вам семафоры ДО старта задач? На кой вы их так упорно пытаетесь использовать ДО?  :wacko2:

22 минуты назад, Arlleex сказал:

До запуска планировщика практически любые вызовы сервисов ОС запрещены.

Я бы уточнил, наверное: "Любые, могущие привести к вытеснению задачи..."

Некоторые возможно будут доступны и до. Например может быть доступно: изменение приоритета созданной, но ещё не запущенной задачи.

Share this post


Link to post
Share on other sites

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);
}

Валится?

 

 

Edited by razrab83

Share this post


Link to post
Share on other sites

В понедельник попробую. В принципе можно сделать фоэункцию 

Задачную и для работы без оси.

Тока мне вот и надо определить когда ось считается запущенной.

 

Share this post


Link to post
Share on other sites
12 hours ago, inventor said:

Тока мне вот и надо определить когда ось считается запущенной.

Ну как же когда? После запуска планировщика.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this