|
HardFault handler M0 |
|
|
|
 |
Ответов
|
Mar 2 2017, 15:19
|
Группа: Участник
Сообщений: 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(); }
|
|
|
|
|
Mar 2 2017, 17:35
|
Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834

|
Цитата(jcxz @ Mar 2 2017, 19:55)  ...и убивается весь смысл многозадачности. Выполнение превращается в суперцикл. Я понимаю, конечно на время вывода сообщения система "стопорится". Я использую это только для отладки чего-либо, в местах под макросом #ifdef _DEBUG_ANYTHING. В рабочем приложении такого конечно нет. Функция взята из учебника "FreeRTOS на Cortex-M3". Не такой уж и бред, если понимать, в каком контексте её можно использовать.
|
|
|
|
|
Mar 3 2017, 14:17
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Mar 3 2017, 15:48
|
Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834

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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
toweroff HardFault handler M0 Feb 15 2017, 20:08 Сергей Борщ Если совсем простое:
CODEvoid HardFault_Handler... Feb 15 2017, 20:24 toweroff Цитата(Сергей Борщ @ Feb 15 2017, 23:24) ... Feb 15 2017, 20:59  ViKo Цитата(toweroff @ Feb 15 2017, 23:59) ого... Feb 16 2017, 08:57    ohmjke Цитата(toweroff @ Feb 16 2017, 12:21) Ест... Feb 16 2017, 16:15     toweroff Цитата(ohmjke @ Feb 16 2017, 19:15) Не по... Feb 17 2017, 15:32 toweroff В общем докопался. Из прерывания отправлялся сигна... Feb 16 2017, 12:52 ohmjke Там помимо этого сообщения есть много других, где ... Feb 17 2017, 18:49 toweroff Цитата(ohmjke @ Feb 17 2017, 21:49) Там п... Feb 17 2017, 20:11  ohmjke Цитата(toweroff @ Feb 17 2017, 23:11) еще... Feb 17 2017, 21:19 toweroff У меня лыжи, наверное, не едут. Если у семафора ... Feb 18 2017, 19:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|