реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> HardFault handler M0
MoskWin32
сообщение Mar 2 2017, 15:19
Сообщение #16





Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834



Цитата(toweroff @ Feb 16 2017, 12:21) *
Чем ее правильнее закрывать, бинарным семафором или мьютексом?


Как альтернатива для функции потокобезопасного вывода - блокировка планировщика(на примере FreeRTOS):
Код
void vPrintString( const char *pcString )
{
    /* Print the string, suspending the scheduler as method of mutual
    exclusion. */
    vTaskSuspendAll();
    {
        sprintf( cBuffer, "%s", pcString );
        consoleprint( cBuffer );
    }
    xTaskResumeAll();
}
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 2 2017, 16:55
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(MoskWin32 @ Mar 2 2017, 17:19) *
Как альтернатива для функции потокобезопасного вывода - блокировка планировщика(на примере FreeRTOS):
...
consoleprint( cBuffer );

...и убивается весь смысл многозадачности. Выполнение превращается в суперцикл.
Это даже уже не говоря о том что лесом идут все приоритеты задач.
Если так пишете - значит Вы не поняли зачем вообще нужна многозадачная ОС.
Go to the top of the page
 
+Quote Post
MoskWin32
сообщение Mar 2 2017, 17:35
Сообщение #18





Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834



Цитата(jcxz @ Mar 2 2017, 19:55) *
...и убивается весь смысл многозадачности. Выполнение превращается в суперцикл.


Я понимаю, конечно на время вывода сообщения система "стопорится". Я использую это только для отладки чего-либо, в местах под макросом #ifdef _DEBUG_ANYTHING.
В рабочем приложении такого конечно нет.
Функция взята из учебника "FreeRTOS на Cortex-M3". Не такой уж и бред, если понимать, в каком контексте её можно использовать.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 3 2017, 14:17
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(MoskWin32 @ Mar 2 2017, 19:35) *
Я понимаю, конечно на время вывода сообщения система "стопорится". Я использую это только для отладки чего-либо, в местах под макросом #ifdef _DEBUG_ANYTHING.
В рабочем приложении такого конечно нет.
Функция взята из учебника "FreeRTOS на Cortex-M3". Не такой уж и бред, если понимать, в каком контексте её можно использовать.

Один из главных плюсов использования ОС это: полезное использование времени процессора во время выполнения операций ввода/вывода.
Т.е. - например когда одна задача, как у вас, ждёт готовности FIFO UART-а принять очередной передаваемый байт, другая в этой время получает время CPU и выполняет полезную работу.
В суперцикле это невозможно, аналогично как и в приведённом Вами куске кода.
Плюс также - время реакции критичных по времени сервисов существенно меньше суперцикла. А у Вас, при выводе чего-то существенного в порт таким способом, все такие сервисы будут в пролёте.
Использовать такое для отладки тоже не имеет смысла, так как, при включении такой отладки, поведение программы сильно меняется (работа перестаёт быть многозадачной) и соответственно результаты отладки бессмысленны (отлаживается совсем не то ПО, которое нужно).
Если нужно корректное разделение ресурса (буфера вывода UART), то самое правильное - использовать семафор.
Можно использовать и запрет прерываний или запрет шедулера, но только на время вывода в программный буфер UART, а не на время вывода в IO-порт UART.
Go to the top of the page
 
+Quote Post
MoskWin32
сообщение Mar 3 2017, 15:48
Сообщение #20





Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834



jcxz, спасибо за разъяснение. Я все это понимаю, и полностью согласен.
Но если 1 тик шедулера = 1 мс, то на 115200бод/с можно успеть передать 11 символов. Если это будут сообщения типа "PING:ok" или "timeout", то ничего ведь страшного не случится?
Т.е. 1-2 тика не такой уж и криминал в этом случае? Все зависит от требований к времени реакции, конечно.
К тому же прерывания не запрещаются при блокировке шедулера и в некотором смысле многозадачность сохраняется.
По поводу защиты буфера - тогда нужно гарантировать, что все операции через UART для всех задач будут организованы только через него.
Ладно, это всё - скорее мои нелепые попытки оправдаться, знаю laughing.gif

Сообщение отредактировал MoskWin32 - Mar 3 2017, 17:10
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 3 2017, 17:19
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MoskWin32 @ Mar 3 2017, 17:48) *
Но если 1 тик шедулера = 1 мс, то на 115200бод/с можно успеть передать 11 символов.

Много больше, если для передачи используется буфер, то сброс вывода в буфер просходит на порядки быстрее, чем вывод в нефифофированный порт.
Ну а за такой вывод через промежуточный буфер:
Код
sprintf( cBuffer, "%s", pcString );
        consoleprint( cBuffer );

Надо лишать права писать учебники пожизненно.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 09:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016