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

 
 
6 страниц V  « < 3 4 5 6 >  
Closed TopicStart new topic
> Написал порт scmRTOS под ARM, интересны отзывы
zltigo
сообщение May 21 2006, 20:02
Сообщение #61


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 21 2006, 20:33
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2006, 20:34
Сообщение #63


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
А посмотреть на исходник и почитать Аtmel-овский AN (кстати посвященный отнюдь не ядру, а периферии )

У-у-у. А с каких пор CPSR стал периферией?
Хотя если дадите ссылку, то прочту.

Цитата
Совершенно нормальный источник. Даже "Быстрый". По крайней мере приоритетный и со своим
стеком, что позволяет без дополнительных наворотов вложенность в обычные IRQ реализовывать.

Для таких как вы, придётся делать ещё одну критическую секцию "spatial for FIQ".

Сообщение отредактировал GetSmart - May 21 2006, 20:39


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 21 2006, 20:57
Сообщение #64


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2006, 21:28
Сообщение #65


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата
Не стал, но завязан :-(
А AIC уже в официальных Atmel-овских бумагах выступает как периферия ядра.

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 21 2006, 22:21
Сообщение #66


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
amusin
сообщение May 22 2006, 04:55
Сообщение #67


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
amusin
сообщение May 22 2006, 05:32
Сообщение #68


Частый гость
**

Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165



Цитата(Сергей Борщ @ May 20 2006, 23:50) *
Отлично! Гарри как раз спрашивал, если такая аппаратная функция в ARM. Обязательно добавлю.

Нет в АРМ такой инструкции. Взгляни, например, на команду PRIOR в C166
http://www.keil.com/dd/docs/datashts/infineon/c166ism.pdf
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2006, 08:22
Сообщение #69


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 22 2006, 10:32
Сообщение #70


Гуру
******

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



Цитата(amusin @ May 22 2006, 09:32) *
Нет в АРМ такой инструкции. Взгляни, например, на команду PRIOR в C166
http://www.keil.com/dd/docs/datashts/infineon/c166ism.pdf

Есть у ARM такая инструкция, правда, начиная с архитектуры V5 - CLZ называется.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2006, 11:30
Сообщение #71


Гуру
******

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



Спасибо всем, кто подсказал функцию поиска наиболее приоритетного процесса. Просмотрел все варианты на http://www.hackersdelight.org/HDcode/ntz.cc, наиболее эффективно компилится вариант подсказанный sergeeff за счет замены + на |. Теперь пытаюсь разобраться как оно работает чтобы написать такую же но для x = 8 и 16 бит. Кто-нибудь такое делал?

Сообщение отредактировал Сергей Борщ - May 22 2006, 11:34


--------------------
На любой вопрос даю любой ответ
"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
amusin
сообщение May 22 2006, 11:48
Сообщение #72


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2006, 11:59
Сообщение #73


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 22 2006, 12:16
Сообщение #74


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ May 22 2006, 14:59) *
Просто в зависимости от количества процессов аргумент для ntz 8, 16 или 32 бит. Или не морочить голову - вроде много тут уже не наэкономить?

Вот именно!
Вознёй с 8 и 16-битными вариантами можно только замедлить работу.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 22 2006, 15:40
Сообщение #75


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

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



Да, конечно, для ARM надо сделать количество процессов - 32. Будет проще и быстрее.
Go to the top of the page
 
+Quote Post

6 страниц V  « < 3 4 5 6 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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