|
|
  |
Написал порт scmRTOS под ARM, интересны отзывы |
|
|
|
May 21 2006, 20:02
|

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

|
Цитата(GetSmart @ May 21 2006, 22:08)  Просто команда выполнится в холостую. Для этого и проверка, чтобы у USER-проги и желания такого не возникало. А посмотреть на исходник и почитать Аtmel-овский AN (кстати посвященный отнюдь не ядру а периферии ) Цитата Хотя в FIQ делать что-то сложное и вызывать систему вообще не рекомендуется. Так, по-быстренькому обратиться к портам или переменным и назад. C чего-бы это вдруг (это если безотносительно к ограничениям конкретной реализации чего-либо). Совершенно нормальный источник. Даже "Быстрый". По крайней мере приоритетный и со своим стеком, что позволяет без дополнительных наворотов вложенность в обычные IRQ реализовывать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 21 2006, 20:33
|

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

|
Цитата(Сергей Борщ @ May 21 2006, 22:42)  2) FIQ не запрещется ибо предполагается что на то оно и быстрое чтобы из него сервисы ОС не вызывались. 4) Не разобрался до конца со SWI но мне кажется что если его вызвать внутри обработчика IRQ то проц уйдет в исключение SWI если не сразу то в момент переключения в System mode при разрешении вложенных прерываний. Буду изучать детальнее. 5) Идея при входе в критическую секцию запрещать не все прерывания а только прерывание переключения контекста была мною предложена автору scmRTOS недели 2-3 назад, он ее пока думает. 2) Я тоже склонился к такой мысли в процессе "подгонки под себя" FreeRTOS. Однако при этом остался открытый вопрос с ритуальными плясками от Atmel :-( пока оставлены из исходя принципа "береженого бог бережет". 4) Сразу. А какие проблемы предполагаются? 5) Это я, как вариант, у себя сделал, тем более во FreeRTOS были уже заложены два отдельных, но одинаково определенных вызова. Но использовать скорее всего не буду - у меня чаще всего источник системного прерывания переключается на внешний в процессе работы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 21 2006, 20:34
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата А посмотреть на исходник и почитать Аtmel-овский AN (кстати посвященный отнюдь не ядру, а периферии ) У-у-у. А с каких пор CPSR стал периферией? Хотя если дадите ссылку, то прочту. Цитата Совершенно нормальный источник. Даже "Быстрый". По крайней мере приоритетный и со своим стеком, что позволяет без дополнительных наворотов вложенность в обычные IRQ реализовывать. Для таких как вы, придётся делать ещё одну критическую секцию "spatial for FIQ".
Сообщение отредактировал GetSmart - May 21 2006, 20:39
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 21 2006, 20:57
|

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

|
Цитата(GetSmart @ May 21 2006, 23:34)  У-у-у. А с каких пор CPSR стал периферией? Хотя если дадите ссылку, то прочту. Не стал, но завязан :-( А AIC уже в официальных Atmel-овских бумагах выступает как периферия ядра. Ссылка на единственный источник: http://www.atmel.com/dyn/resources/prod_do...nts/DOC1156.PDF
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 21 2006, 21:28
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата Не стал, но завязан :-( А AIC уже в официальных Atmel-овских бумагах выступает как периферия ядра. Ну и ничего нового не узнал. :-( Смысл ПДФ-а в том, что внутри обработчиков исключений нужно осторожно анализировать/менять регистр SPSR, или по-другому - писать нормально обработчики прерываний. Там вообще ситуация, когда внутри обработчика в регистре SPSR какой-то дурень принудительно разрешает прерывания. Это делать просто не надо. Ни у меня, ни у Сергея Борща такого изврата нет. Глюк-то не периферийный, а программный. Точнее криво-программный. Кстати, это не только для Атмела, но и в LPC такая же бяка.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 21 2006, 22:21
|

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

|
Цитата(GetSmart @ May 22 2006, 00:28)  Ну и ничего нового не узнал. Тем не менее как-то Ваши обьяснения на мой взгляд совсем не совпадали с причинами изложенными в документе, ну да бог с ними. Первопричина - в задержке блокировки прерываний на такт после изменения CPSR. В этот такт может попасть обработчик прерывания, что не страшно, ну обработается. Проблемы если обработчик разрешит и не запретит по выходу прерывания. Такое просто делать не надо. Выводы - на прибамбасы в __disable_interrupts() наплевать и забыть..... Цитата Кстати, это не только для Атмела, но и в LPC такая же бяка. Похоже :-(. Косвенное подтверждение этому можно получить из описания процесса организации вложенных прерываний на LPC.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 22 2006, 04:55
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165

|
Цитата(sergeeff @ May 20 2006, 20:01)  Есть классная функция, оптимизированная для ARM, которая выдает номер младшего установленного бита в 32-разрядном слове (она используется в Linux’e и TNKernel). Вот ее текст: ... Очевидно имеем констатное время поиска номера младшего установленного бита в слове. Думаю полезно эту функцию использовать вместо стандартного решения. Мысль (именно в приложении к шедулингу) очень здравая. Только приведенный код можно реализовать и на Си (например, первые 2 команды - выделение младшей единички на Си x&(-x)) C точки зрения алгоритмов здесь суть найти число нулей справа (при #define scmRTOS_PRIORITY_ORDER 0 конечно). Реализаций этой функции - море: http://www.hackersdelight.org/HDcode/ntz.ccДля другого порядка приоритетов в карте #define scmRTOS_PRIORITY_ORDER 1 надо использовать функции из http://www.hackersdelight.org/HDcode/nlz.cc
|
|
|
|
|
May 22 2006, 05:32
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165

|
Цитата(Сергей Борщ @ May 20 2006, 23:50)  Отлично! Гарри как раз спрашивал, если такая аппаратная функция в ARM. Обязательно добавлю. Нет в АРМ такой инструкции. Взгляни, например, на команду PRIOR в C166 http://www.keil.com/dd/docs/datashts/infineon/c166ism.pdf
|
|
|
|
|
May 22 2006, 08:22
|

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

|
Цитата(amusin @ May 22 2006, 08:32)  Цитата(Сергей Борщ @ May 20 2006, 23:50)  Отлично! Гарри как раз спрашивал, если такая аппаратная функция в ARM. Обязательно добавлю.
Нет в АРМ такой инструкции. Я так и ответил :-)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 22 2006, 11:48
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165

|
Цитата(Сергей Борщ @ May 22 2006, 17:30)  Теперь пытаюсь разобраться как оно работает чтобы написать такую же но для x = 8 и 16 бит. Кто-нибудь такое делал? А нафиг? GetHighPriority() лежит в порте ОС, т.е. предназначена именно для ARM. Сделать внутри этой функции static_cast аргумента для ntz (на взгляд профана в С++) - из большей корзины не выпадет, а для nlz из результата вычесть 8 или 24 внутри препроцессорных #if #else.
Сообщение отредактировал amusin - May 22 2006, 11:50
|
|
|
|
|
May 22 2006, 11:59
|

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

|
Цитата(amusin @ May 22 2006, 14:48)  Цитата(Сергей Борщ @ May 22 2006, 17:30)  Теперь пытаюсь разобраться как оно работает чтобы написать такую же но для x = 8 и 16 бит. Кто-нибудь такое делал?
А нафиг? GetHighPriority() лежит в порте ОС, т.е. предназначена именно для ARM. Сделать внутри этой функции static_cast аргумента для ntz (на взгляд профана в С++) - из большей корзины не выпадет, а для nlz из результата вычесть 8 или 24 внутри препроцессорных #if #else. Просто в зависимости от количества процессов аргумент для ntz 8, 16 или 32 бит. Или не морочить голову - вроде много тут уже не наэкономить?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|