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

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

|
Цитата(sonycman @ Aug 8 2010, 05:11)  Вот стало мне нечего делать, и потянуло попробовать в первый раз какую нибудь операционку. Остановился пока что на scmRTOS - с виду очень простая и красиво написанная система. Отличный выбор  Цитата Интересно, можно ли в последней 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(); }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 8 2010, 12:05
|

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

|
Цитата(AHTOXA @ Aug 8 2010, 10:04)  Конечно можно. Мутекс проще создать статически: Спасибо! Значит, я на правильном пути  . А как обычно реализовывают работу с ЖКИ под ОС? Тоже городить мьютексы? Или проще отдать эту задачу одному единственному процессу, а другие будут, в случае надобности, слать сообщения с нужными данными? И по поводу сообщений - как происходит с ними работа? Я так понимаю, что сообщение - просто некий контейнер, который выполняет функцию промежуточного хранения или транспортировки данных между процессами. Может ли сообщение затираться другим, в случае, если процесс-отправитель имеет высокий приоритет, а получатель - низкий и просто не получает времени на прочтение? ЗЫ: извиняюсь, оказывается, на форуме есть соответствующая операционным системам тема. Наверное, стоит перенести топик туда?
|
|
|
|
|
Aug 8 2010, 13:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

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

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

|
А если ситуация такая: высокоприоритетная задача занята работой, и в процессе может отправить одно или несколько однотипных сообщений низкоприоритетной задаче. Но передача управления произойдёт не сразу, как будет отправлено любое сообщение, а только когда работа закончится.
Нет смысла отдавать время низкоприоритетной задаче, когда полно более важной работы.
Тут, наверное, нужно организовывать очередь сообщений, только с одним не получится...
Ещё не совсем разобрался с организацией прерываний.
Надо ли обрамлять макросом TISRW все подряд обработчики прерываний, или только те, в которых используются сервисы ОС?
И имеет ли значение приоритет прерывания SYS_TICK, на котором висит планировщик? Ведь на кортексах по умолчанию работают вложенные прерывания.
|
|
|
|
|
Aug 8 2010, 17:03
|

фанат дивана
     
Группа: Свой
Сообщений: 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)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 8 2010, 20:07
|

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

|
Цитата(AHTOXA @ Aug 8 2010, 23:49)  Хм. Я думал, что GCC. Потому что для LPC17xx под IAR есть примерчики, и ничего допиливать не надо  Ну я же не буду пустую ось, как в этих примерах, запускать. Да и камень у меня другой. Плюс заготовка проекта под Кейл. Вот и переношу  Кстати, вопрос не по теме, конечно, но вдруг кто подсобит. Привык работать с исходником в среде SlickEdit - нравится подсветка цветом и, особенно, автоподстановка переменных\имён регистров и всего и вся в этом роде. Набил пару первых знаков имени - а дальше просто выбираешь из раскрывшегося списка. Очень удобно работать со структурами или классами - все члены сразу видно, ничего не надо вспоминать, два нажатия на кнопку - и длинное имя функции\объекта\переменной на месте. Не представляю, как люди могут работать в простых редакторах без автоподстановки (типа голых кейла или иара) - ужас просто.  Но не всё так радужно - ИАРовские макросы под LPC17xx вида NAME ## _bits слик не понимает, к сожалению. Приходится тащить с собой более простой "и понятный" LPC17xx.h из кейла. Может, есть какой редактор, который и с этими макросами (##) прекрасно справляется?
|
|
|
|
|
Aug 9 2010, 08:17
|

Гуру
     
Группа: Свой
Сообщений: 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; даже если-бы она была переносима, вместо ОДНОЙ строчки неразумно. А если написаны нормальные дефиниции битов, то ими в отличии от этой красатульки, можно пользоваться ВСЕГДА. А во-вторых слик, как и эклипсе, в исходниках - можете и написать под себя  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 9 2010, 08:41
|

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

|
Цитата(AHTOXA @ Aug 9 2010, 11:59)  Eclipse?  Да, надо в очередной раз попробовать очередную версию Эклипса  Цитата(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, в отличие от сырого кейловского, в котором вообще отсутствуют определения битов
|
|
|
|
|
Aug 9 2010, 20:53
|

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

|
Вроде получается, контроллер сконфигурировал и пример запустил, сейчас потихоньку адаптирую под многозадачность интерфейс ЖКИ и т.д. А как поступать с вызовами библиотечных функций типа sprintf(), memalloc() и т.д.? Неужели их тоже надо обрамлять мьютексами? Или критич. секциями? Работу с кучей вернее всего придётся защитить, а вот всякие printf()? Что-то сразу не получилось найти инфу по этому поводу
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|