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

 
 
> scmRTOS - первые шаги, как правильно расшарить ресурсы?
sonycman
сообщение Aug 7 2010, 23:11
Сообщение #1


Любитель
*****

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



Доброго времени суток!

Вот стало мне нечего делать, и потянуло попробовать в первый раз какую нибудь операционку.
Остановился пока что на scmRTOS - с виду очень простая и красиво написанная система.

Скачал порт на STM32 - немного поправить и должно заработать на LPC1768.

Думаю, как правильно работать разными процессами с такими ресурсами, как FatFs диск на карте памяти и ЖКИ.

Интересно, можно ли в последней 0.08 версии FatFs просто установить флаг конфигурации REENTRANT и использовать в функциях sync_obj() мьютекс OS для синхронизации?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
AHTOXA
сообщение Aug 8 2010, 06:04
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Aug 8 2010, 05:11) *
Вот стало мне нечего делать, и потянуло попробовать в первый раз какую нибудь операционку.
Остановился пока что на scmRTOS - с виду очень простая и красиво написанная система.

Отличный выборsmile.gif
Цитата
Интересно, можно ли в последней 0.08 версии FatFs просто установить флаг конфигурации REENTRANT и использовать в функциях sync_obj() мьютекс OS для синхронизации?

Конечно можно. Мутекс проще создать статически:
Код
OS::TMutex ff_mutex;

extern "C" int ff_cre_syncobj(BYTE, int*)    { return true; }
extern "C" int ff_del_syncobj(int)        { return true; }
extern "C" int ff_req_grant(int)        { ff_mutex.Lock(); return true; }
extern "C" void ff_rel_grant(int)        { ff_mutex.Unlock(); }


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 8 2010, 12:05
Сообщение #3


Любитель
*****

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



Цитата(AHTOXA @ Aug 8 2010, 10:04) *
Конечно можно. Мутекс проще создать статически:

Спасибо! Значит, я на правильном пути smile.gif.

А как обычно реализовывают работу с ЖКИ под ОС?
Тоже городить мьютексы? Или проще отдать эту задачу одному единственному процессу, а другие будут, в случае надобности, слать сообщения с нужными данными?

И по поводу сообщений - как происходит с ними работа?
Я так понимаю, что сообщение - просто некий контейнер, который выполняет функцию промежуточного хранения или транспортировки данных между процессами.
Может ли сообщение затираться другим, в случае, если процесс-отправитель имеет высокий приоритет, а получатель - низкий и просто не получает времени на прочтение?

ЗЫ: извиняюсь, оказывается, на форуме есть соответствующая операционным системам тема.
Наверное, стоит перенести топик туда? smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 8 2010, 12:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Aug 8 2010, 16:05) *
ЗЫ: извиняюсь, оказывается, на форуме есть соответствующая операционным системам тема.
Наверное, стоит перенести топик туда? smile.gif

Moderator: Перенес.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 8 2010, 13:50
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(sonycman @ Aug 8 2010, 15:05) *
Может ли сообщение затираться другим, в случае, если процесс-отправитель имеет высокий приоритет, а получатель - низкий и просто не получает времени на прочтение?


scmRTOS - система с приоритетным планировщиком. Соответственно, вы должны предусмотреть, чтобы высокоприоритетный процесс на захватил систему навсегда. Вообще подход должен быть таким - оповестил нужный процесс тем или иным образом, что он должен чего-то сделать, он это что-то быстренько сделал и отдал управление. Кому процессу какой приоритет задать должны вы решить, исходя из вашей задачи.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 8 2010, 15:05
Сообщение #6


Любитель
*****

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



А если ситуация такая: высокоприоритетная задача занята работой, и в процессе может отправить одно или несколько однотипных сообщений низкоприоритетной задаче.
Но передача управления произойдёт не сразу, как будет отправлено любое сообщение, а только когда работа закончится.

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

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

Ещё не совсем разобрался с организацией прерываний.

Надо ли обрамлять макросом TISRW все подряд обработчики прерываний, или только те, в которых используются сервисы ОС?

И имеет ли значение приоритет прерывания SYS_TICK, на котором висит планировщик?
Ведь на кортексах по умолчанию работают вложенные прерывания.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 8 2010, 17:03
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Aug 8 2010, 18:05) *
А как обычно реализовывают работу с ЖКИ под ОС?
Тоже городить мьютексы? Или проще отдать эту задачу одному единственному процессу, а другие будут, в случае надобности, слать сообщения с нужными данными?

Оба варианта имеют право на существование. Например, один процесс мониторит заряд батарейки, и рисует соответствующую пиктограмму, а второй процесс - пользовательский интерфейс (опрашивает кнопки и рисует меню). В этом случае наверное достаточно мутекса (области рисования независимы). В более общем случае можно назначить отдельный процесс, и к нему - очередь сообщений.

Цитата
И по поводу сообщений - как происходит с ними работа?
Я так понимаю, что сообщение - просто некий контейнер, который выполняет функцию промежуточного хранения или транспортировки данных между процессами.

Да.
Цитата
Может ли сообщение затираться другим, в случае, если процесс-отправитель имеет высокий приоритет, а получатель - низкий и просто не получает времени на прочтение?

Да, может. Чтобы этого не произошло, нужно отправлять сообщения более приоритетному процессу. Либо использовать очередь сообщений.

Цитата(sonycman @ Aug 8 2010, 21:05) *
А если ситуация такая: высокоприоритетная задача занята работой, и в процессе может отправить одно или несколько однотипных сообщений низкоприоритетной задаче.

Тогда очередь, да. Например, OS::channel<>.
Цитата
Надо ли обрамлять макросом TISRW все подряд обработчики прерываний, или только те, в которых используются сервисы ОС?

Только те, где сервисы.

Цитата
И имеет ли значение приоритет прерывания SYS_TICK, на котором висит планировщик?
Ведь на кортексах по умолчанию работают вложенные прерывания.

Да, его приоритет минимальный, это гарантирует, что он выполняется после всех прерываний (не является вложенным). (Приоритет задаётся в OS_Target_asm.S)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 8 2010, 19:08
Сообщение #8


Любитель
*****

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



Цитата(AHTOXA @ Aug 8 2010, 21:03) *
Да, его приоритет минимальный, это гарантирует, что он выполняется после всех прерываний (не является вложенным). (Приоритет задаётся в OS_Target_asm.S)

Спасибо за помощь!
С меня пиво beer.gif
Буду продолжать осваивать.

К сожалению, одновременно приходится осваивать IAR (до этого работал только в Кейле), поэтому всё получается совсем не быстро sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 8 2010, 19:49
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Aug 9 2010, 01:08) *
С меня пиво beer.gif

smile.gif
Цитата
К сожалению, одновременно приходится осваивать IAR

Хм. Я думал, что GCC. Потому что для LPC17xx под IAR есть примерчики, и ничего допиливать не надоsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 8 2010, 20:07
Сообщение #10


Любитель
*****

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



Цитата(AHTOXA @ Aug 8 2010, 23:49) *
Хм. Я думал, что GCC. Потому что для LPC17xx под IAR есть примерчики, и ничего допиливать не надоsmile.gif

Ну я же не буду пустую ось, как в этих примерах, запускать.
Да и камень у меня другой. Плюс заготовка проекта под Кейл.
Вот и переношу sad.gif

Кстати, вопрос не по теме, конечно, но вдруг кто подсобит.

Привык работать с исходником в среде SlickEdit - нравится подсветка цветом и, особенно, автоподстановка переменных\имён регистров и всего и вся в этом роде.

Набил пару первых знаков имени - а дальше просто выбираешь из раскрывшегося списка.
Очень удобно работать со структурами или классами - все члены сразу видно, ничего не надо вспоминать, два нажатия на кнопку - и длинное имя функции\объекта\переменной на месте.
Не представляю, как люди могут работать в простых редакторах без автоподстановки (типа голых кейла или иара) - ужас просто. smile.gif

Но не всё так радужно - ИАРовские макросы под LPC17xx вида NAME ## _bits слик не понимает, к сожалению.
Приходится тащить с собой более простой "и понятный" LPC17xx.h из кейла.

Может, есть какой редактор, который и с этими макросами (##) прекрасно справляется?

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 9 2010, 07:59
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sonycman @ Aug 9 2010, 02:07) *
Может, есть какой редактор, который и с этими макросами (##) прекрасно справляется?


Eclipse? smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 9 2010, 08:17
Сообщение #12


Гуру
******

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



QUOTE (sonycman @ Aug 8 2010, 23:07) *
Но не всё так радужно - ИАРовские макросы под LPC17xx вида NAME ## _bits слик не понимает, к сожалению.

Ну самое правильное на эти уродские IARовские прибамбасы наплевать раз и навсегда, ибо писать подобную фигню:
CODE
    S0SPCR_bit.CPOL = 1;     
    S0SPCR_bit.CPHA = 1;        
    S0SPCR_bit.BITENABLE = 1;
    S0SPCR_bit.BITS   = 9;    
    S0SPCR_bit.MSTR = 1;

даже если-бы она была переносима, вместо ОДНОЙ строчки неразумно. А если написаны нормальные дефиниции битов, то ими в отличии от этой красатульки, можно пользоваться ВСЕГДА.
А во-вторых слик, как и эклипсе, в исходниках - можете и написать под себя smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 9 2010, 08:41
Сообщение #13


Любитель
*****

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



Цитата(AHTOXA @ Aug 9 2010, 11:59) *
Eclipse? smile.gif

Да, надо в очередной раз попробовать очередную версию Эклипса smile.gif

Цитата(zltigo @ Aug 9 2010, 12:17) *
Ну самое правильное на эти уродские IARовские прибамбасы наплевать раз и навсегда, ибо писать подобную фигню:
Код
    S0SPCR_bit.CPOL = 1;     
    S0SPCR_bit.CPHA = 1;        
    S0SPCR_bit.BITENABLE = 1;
    S0SPCR_bit.BITS   = 9;    
    S0SPCR_bit.MSTR = 1;

даже если-бы она была переносима, вместо ОДНОЙ строчки неразумно.

В случае работы с несколькими битами одного регистра конечно, не стоит пользоваться такими макросами.
Получается отвратно, учитывая, что volatile вообще не оптимизируется.

Но в случае единичных битов - нет проблем.

Всё равно понравился ИАРовский хидер под LPC1766, в отличие от сырого кейловского, в котором вообще отсутствуют определения битов sad.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 9 2010, 20:53
Сообщение #14


Любитель
*****

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



Вроде получается, контроллер сконфигурировал и пример запустил, сейчас потихоньку адаптирую под многозадачность интерфейс ЖКИ и т.д.

А как поступать с вызовами библиотечных функций типа sprintf(), memalloc() и т.д.?
Неужели их тоже надо обрамлять мьютексами?
Или критич. секциями?

Работу с кучей вернее всего придётся защитить, а вот всякие printf()?

Что-то сразу не получилось найти инфу по этому поводу sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 9 2010, 21:15
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Aug 10 2010, 00:53) *
Работу с кучей вернее всего придётся защитить, а вот всякие printf()?

printf() придется в любом случае, вы же не хотите получить кашу в stdout? Всякие *s*printf() - в зависимости от реентерабельности.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 9 2010, 21:28
Сообщение #16


Любитель
*****

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



Цитата(aaarrr @ Aug 10 2010, 01:15) *
printf() придется в любом случае, вы же не хотите получить кашу в stdout? Всякие *s*printf() - в зависимости от реентерабельности.

А как узнать, к примеру, о реентерабельности определённых функций библиотеки ИАРа?
Вроде нашёл среди inc. файлов конфиг. файл DLIB с метками multi-thread...

Наверное, надо спросить в соотв. теме smile.gif
Вероятно, библиотеки можно как то конфигурировать.

Сорри, я с такими вещами ещё дел не имел, поэтому такие глупые вопросы smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 9 2010, 21:34
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sonycman @ Aug 10 2010, 01:28) *
А как узнать, к примеру, о реентерабельности определённых функций библиотеки ИАРа?

Я бы советовал начать с документации. Такие вещи указываются в обязательном порядке.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 9 2010, 21:58
Сообщение #18


Любитель
*****

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



Цитата(aaarrr @ Aug 10 2010, 01:34) *
Я бы советовал начать с документации. Такие вещи указываются в обязательном порядке.

Спасибо, нашёл, стоило немного под напрячься!
После трудного дня легче спросить на форуме, чем шерстить занудные мануалы biggrin.gif :

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() можно пользоваться свободно, и слава богу smile.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 10 2010, 10:50
Сообщение #19


Любитель
*****

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



Может, кто подскажет идею, как в этой операционке сделать измерение процента бездействия\занятости процессора?

Жаль, что нет такого встроенного сервиса. Неужели это не просто сделать?

По идее, хук на вход в idle поток есть, если бы был второй хук на выход из этого потока... sad.gif
Тогда бы вошли - запустили таймер - вышли - засекли время.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 26 2010, 19:13
Сообщение #20


Любитель
*****

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



А чем лучше обернуть запросы на выделение памяти - memalloc() и компанию?
По идее, эти функции должны выполняться весьма быстро - подходит простая критическая секция.

С другой стороны, если в приложении требуется быстрая реакция на события от прерываний - крит. секция может быть очень некстати в самый неподходящий момент...

Может, лучше ещё один мьютекс?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 26 2010, 21:47
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 27 2010, 05:00
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Добавлю ссылку на пример: вот.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 27 2010, 07:46
Сообщение #23


Любитель
*****

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



Цитата(Сергей Борщ @ Aug 27 2010, 01:47) *
Первый раз, пока куча не фрагментирована. Да и от реализации менеджера зависит. А если самый худший случай - память кончилась и вызывается чистильщик?

Понятно - значит, будет мьютекс smile.gif

А что за чистильщик такой? Составная часть библиотечного malloc(), или что-то своё?
Каков его функционал - дефрагментация выделенных блоков?
Цитата(AHTOXA @ Aug 27 2010, 09:00) *
Добавлю ссылку на пример: вот.

Спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 27 2010, 09:59
Сообщение #24


Гуру
******

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



Цитата(sonycman @ Aug 27 2010, 10:46) *
А что за чистильщик такой?
Там по ссылке чуть ниже описано. Система принимает сообщения, складывает в буфер и ретранслирует дальше. Если канал ретрансляции отвалился, то буфер в конце-концов переполнится. В этом случае чистильщик удаляет по одному самые старые сообщения пока не наберется достаточно свободного места для нового.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Sep 6 2010, 08:15
Сообщение #25


Любитель
*****

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



А для чего вообще в обработчики прерываний с сервисами РТОС добавлять "обёртку" TISRW?
Случайно забыл её добавить в обработчик, использующий SignalISR() - на работоспособности вроде не сказалось...

Как я понял, эта обёртка служит для вызова планировщика перед выходом из прерывания?
Тогда, в случае вложенных прерываний, планировщик может вызываться больше одного раза...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 6 2010, 08:29
Сообщение #26


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sonycman
сообщение Sep 6 2010, 10:10
Сообщение #27


Любитель
*****

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



Цитата(ReAl @ Sep 6 2010, 12:29) *
Не может. Там есть Kernel.ISR_NestCount

По первому вопросу всё понял, спасибо!

А по второму - почему же не может?
К примеру, два или больше обработчиков различных прерываний с одним приоритетом, следующие сразу друг за другом.
Везде есть обёртка.
Соответственно, планировщик будет вызываться в конце каждого обработчика. Несколько раз.

Или другое - вложенное прерывание с бОльшим приоритетом возникает прямо во время аппаратного сохранения контекста, то есть переход на другой обработчик будет до того, как выполнится обёртка.
Соответственно, планировщик будет вызван и в конце высокоприоритетного обработчика, и во второй раз в конце низкоприоритетного.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 6 2010, 16:29
Сообщение #28


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 - так там контекст программно сохраняется и вложенное прерывание не пролезет, пока вручную не разрешить таковые.
Если есть аппаратное сохранение контекста и если оно может быть прервано более приоитетным прерыванием, то да. Но с точки зрения ОС это мало отличается от следующих друг за другомо прерываний - она ещё не получила управления и не знает, что прерывания вложенные. Т.е. к началу работы высокоприоритетного обработчика ОС не знает, что низкоприоритетное вобще начиналось, с её точки зрения это те же "друг за другом".
Можно ли с этим побороться и как именно - тоже надо смотреть конкретную архитектуру.
Кстати, если реальное переключение задач производится специальным прерыванием, то и в описаных случаях хоть планировщик вызовется и несколько раз, а контекст на нужную задачу переключится один раз в конце.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sonycman
сообщение Sep 6 2010, 16:49
Сообщение #29


Любитель
*****

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



Цитата(ReAl @ Sep 6 2010, 20:29) *
Можно ли с этим побороться и как именно - тоже надо смотреть конкретную архитектуру.
Кстати, если реальное переключение задач производится специальным прерыванием, то и в описаных случаях хоть планировщик вызовется и несколько раз, а контекст на нужную задачу переключится один раз в конце.

Да, в порте для кортексов-м3 контекст переключается вызовом софтового прерывания - PendSV.
Оно имеет самый низкий приоритет, что гарантирует его обработку в последнюю очередь.

Насколько я понял, "лишние" вызовы планировщика никоим образом не нарушают его работу, просто получаем небольшой оверхед.
Наверное, на такой архитектуре по другому и не получится.

Спасибо за пояснения! cheers.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 02:46
Рейтинг@Mail.ru


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