Перейти к содержанию
    

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

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

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

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, inventor said:

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

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

9 minutes ago, inventor said:

"Hearbeat";

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, inventor said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, inventor said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, Arlleex сказал:

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

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

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

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

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

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

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

с 1-й по 10-ю

ДО момента

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 minutes ago, inventor said:

ДО момента

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 минуты назад, inventor сказал:

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

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

Цитата

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

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

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


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, inventor сказал:

ДО момента

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Валится?

 

 

Изменено пользователем razrab83

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, inventor said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...