|
scmRTOS - первые шаги, как правильно расшарить ресурсы? |
|
|
|
Aug 9 2010, 21:28
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Aug 10 2010, 01:15)  printf() придется в любом случае, вы же не хотите получить кашу в stdout? Всякие *s*printf() - в зависимости от реентерабельности. А как узнать, к примеру, о реентерабельности определённых функций библиотеки ИАРа? Вроде нашёл среди inc. файлов конфиг. файл DLIB с метками multi-thread... Наверное, надо спросить в соотв. теме  Вероятно, библиотеки можно как то конфигурировать. Сорри, я с такими вещами ещё дел не имел, поэтому такие глупые вопросы
|
|
|
|
|
Aug 9 2010, 21:58
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(aaarrr @ Aug 10 2010, 01:34)  Я бы советовал начать с документации. Такие вещи указываются в обязательном порядке. Спасибо, нашёл, стоило немного под напрячься! После трудного дня легче спросить на форуме, чем шерстить занудные мануалы  : Most parts of the DLIB library are reentrant, but these functions and parts are not reentrant because they need static data: ● Heap functions—malloc, free, realloc, calloc, and the C++ operators new and delete ● Time functions—asctime, localtime, gmtime, mktime ● Multibyte functions—mbrlen, mbrtowc, mbsrtowc, wcrtomb, wcsrtomb, wctomb ● The miscellaneous functions setlocale, rand, atexit, strerror, strtok ● Functions that use files in some way. This includes printf, scanf, getchar, and putchar. The functions sprintf and sscanf are not included. Some functions also share the same storage for errno. These functions are not reentrant, since an errno value resulting from one of these functions can be destroyed by a subsequent use of the function before it is read. Among these functions are: exp, exp10, ldexp, log, log10, pow, sqrt, acos, asin, atan2, cosh, sinh, strtod, strtol, strtoul
Remedies for this are: ● Do not use non-reentrant functions in interrupt service routines ● Guard calls to a non-reentrant function by a mutex, or a secure region, etc.
В общем, не так уж и много вещей, которых стоит бояться. sprinf() можно пользоваться свободно, и слава богу
|
|
|
|
|
Aug 26 2010, 21:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sonycman @ Aug 26 2010, 22:13)  По идее, эти функции должны выполняться весьма быстро Первый раз, пока куча не фрагментирована. Да и от реализации менеджера зависит. А если самый худший случай - память кончилась и вызывается чистильщик? Мутекс подходит очень хорошо.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 27 2010, 07:46
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Сергей Борщ @ Aug 27 2010, 01:47)  Первый раз, пока куча не фрагментирована. Да и от реализации менеджера зависит. А если самый худший случай - память кончилась и вызывается чистильщик? Понятно - значит, будет мьютекс  А что за чистильщик такой? Составная часть библиотечного malloc(), или что-то своё? Каков его функционал - дефрагментация выделенных блоков? Цитата(AHTOXA @ Aug 27 2010, 09:00)  Добавлю ссылку на пример: вот. Спасибо!
|
|
|
|
|
Sep 6 2010, 08:29
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(sonycman @ Sep 6 2010, 11:15)  А для чего вообще в обработчики прерываний с сервисами РТОС добавлять "обёртку" TISRW? Случайно забыл её добавить в обработчик, использующий SignalISR() - на работоспособности вроде не сказалось... Ну так это надо сомтреть. Похоже, переключение задач, которое "попросило" сделать SignalISR(), происходит не сразу же, а после очередного прерывания системного тика либо другого прериывания, у которого есть TISRW. Т.е. увеличилось время реакции на тот SignalISR(), который не обёрнут в TISRW. Вполне может и не нарушить работоспособность в определ’нной ситуации. Цитата(sonycman @ Sep 6 2010, 11:15)  Как я понял, эта обёртка служит для вызова планировщика перед выходом из прерывания? Тогда, в случае вложенных прерываний, планировщик может вызываться больше одного раза... Не может. Там есть Kernel.ISR_NestCount
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 6 2010, 10:10
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(ReAl @ Sep 6 2010, 12:29)  Не может. Там есть Kernel.ISR_NestCount По первому вопросу всё понял, спасибо! А по второму - почему же не может? К примеру, два или больше обработчиков различных прерываний с одним приоритетом, следующие сразу друг за другом. Везде есть обёртка. Соответственно, планировщик будет вызываться в конце каждого обработчика. Несколько раз. Или другое - вложенное прерывание с бОльшим приоритетом возникает прямо во время аппаратного сохранения контекста, то есть переход на другой обработчик будет до того, как выполнится обёртка. Соответственно, планировщик будет вызван и в конце высокоприоритетного обработчика, и во второй раз в конце низкоприоритетного.
|
|
|
|
|
Sep 6 2010, 16:29
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(sonycman @ Sep 6 2010, 11:15)  Как я понял, эта обёртка служит для вызова планировщика перед выходом из прерывания? Тогда, в случае вложенных прерываний, планировщик может вызываться больше одного раза... Цитата(sonycman @ Sep 6 2010, 13:10)  А по второму - почему же не может? К примеру, два или больше обработчиков различных прерываний с одним приоритетом, следующие сразу друг за другом. Везде есть обёртка. Соответственно, планировщик будет вызываться в конце каждого обработчика. Несколько раз. Да, конечно, для следующих друг за другом планировщик будет вызываться в конце каждого перед выходом из прерывания. Хотя бы потому, что в конце первого планировщик знать не знает о том, что второе будет. Цитата(sonycman @ Sep 6 2010, 13:10)  Или другое - вложенное прерывание с бОльшим приоритетом возникает прямо во время аппаратного сохранения контекста, то есть переход на другой обработчик будет до того, как выполнится обёртка. Соответственно, планировщик будет вызван и в конце высокоприоритетного обработчика, и во второй раз в конце низкоприоритетного. Ну тут уже зависит от архитектуры. Как в AVR - так там контекст программно сохраняется и вложенное прерывание не пролезет, пока вручную не разрешить таковые. Если есть аппаратное сохранение контекста и если оно может быть прервано более приоитетным прерыванием, то да. Но с точки зрения ОС это мало отличается от следующих друг за другомо прерываний - она ещё не получила управления и не знает, что прерывания вложенные. Т.е. к началу работы высокоприоритетного обработчика ОС не знает, что низкоприоритетное вобще начиналось, с её точки зрения это те же "друг за другом". Можно ли с этим побороться и как именно - тоже надо смотреть конкретную архитектуру. Кстати, если реальное переключение задач производится специальным прерыванием, то и в описаных случаях хоть планировщик вызовется и несколько раз, а контекст на нужную задачу переключится один раз в конце.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 6 2010, 16:49
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(ReAl @ Sep 6 2010, 20:29)  Можно ли с этим побороться и как именно - тоже надо смотреть конкретную архитектуру. Кстати, если реальное переключение задач производится специальным прерыванием, то и в описаных случаях хоть планировщик вызовется и несколько раз, а контекст на нужную задачу переключится один раз в конце. Да, в порте для кортексов-м3 контекст переключается вызовом софтового прерывания - PendSV. Оно имеет самый низкий приоритет, что гарантирует его обработку в последнюю очередь. Насколько я понял, "лишние" вызовы планировщика никоим образом не нарушают его работу, просто получаем небольшой оверхед. Наверное, на такой архитектуре по другому и не получится. Спасибо за пояснения!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|