|
Написал порт scmRTOS под ARM, интересны отзывы |
|
|
|
 |
Ответов
|
May 17 2006, 18:11
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Смотрите, что я нарыл: (цитата из книжки) Бит S используется для управления (обновления, по-моему) флагами условий. Если этот бит установлен, флаги условий изменяются в соответствии с результатом выполнения команды. Если этот бит сброшен, состояние флагов условий не меняется. Однако, если при установленном бите S в качестве регистра результата указан R15 производится копирование содержимого SPSR текущего режима в регистр CPSR. Эта возможность используется для восстановления РС и переключения в исходный режим в конце обработки исключительных ситуаций. Не пытайтесь выполнить такую команду в режиме User (System забыли!), поскольку в этом режиме отсутствует регистр SPSR и соответственно результат выполнения этой команды невозможно предсказать. ___________________________ Я так понял, что бит S и есть эта галочка (^). В командах она означает обновление арифметических флагов в CPSR после выполнения команды, если результат не в R15. Если же в R15, то обновится весь CPSR значением из SPSR. __________________________ Проверил в отладчике IAR 4.20 Команда с битом S типа SUBS R15,R0,R0 перегружает R15 и SPSR копирует в CPSR. А команда SUBS R1,R0,R0 обновляет только арифметические флаги в CPSR. Команда LDRxx Rx,{R0}^ вообще не меняет регистр CPSR. Тем более, что арифметической операции и нет. Команда LDRxx Rx,{...,R15}^ копирует SPSR в регистр CPSR. Всё это я проделывал находясь в IRQ режиме, а в SPSR был SYSTEM. В командах STMxx эта галочка (^) вообще ни на что не влияет, даже если указан R15. Хотя, может и нет. Надо это ещё проверить. ___________________________ А нафига вы её решили использовать без регистра R15 ?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 17 2006, 18:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Касательно файла Target_LPC2xxx.h
"#define CONTEXT_SWITCH_INT VIC_SW" - Использовать отдельное прерывание (VIC_SW) не обязательно, если у вас так же прерывать задачу может таймер. Для этого я принудительно вызывал прерывание от таймера такой командой: VICSoftInt = (1 << VIC_TIMER1) Внутри обработчика прерывания таймера не забудьте сбросить этот бит, а то зависнет. Если же таймер не переключает задачи, то всё нормально.
Так писать не нужно: "VICIntEnable |= (1<<CONTEXT_SWITCH_INT);" Через этот регистр можно только устанавливать биты, но не сбрасывать. Поэтому пишите так: VICIntEnable = (1<<CONTEXT_SWITCH_INT);
А эта конструкция вообще убьёт всю систему: "#define BlockContextSwitchMacro() do { \ VICIntEnable &= ~(1<<CONTEXT_SWITCH_INT); \ } while (0) // disable context switching interrupt " Для сброса бита разрешения конкретного прерывания есть другой регистр. Надо так: VICIntEnClear = (1<<CONTEXT_SWITCH_INT);
Кстати, зачем пишите "do {...} while (0)" ???
Для чего timer 0, match 0 используете?
Поосторожней пользуйтесь битовым доступом к регистрам. Иногда из регистров читается не то, что хочется.
Для справки, все свободные биты из 32 источников прерываний можно использовать для своих нужд через регистр VICSoftInt. Специально для этого сделан VIC_SW, но и остальные действуют аналогично. Я проверял. В одной проге аж 4 независимых софт-прерывания зафигачил. Кстати, у меня прерывание, переключающее задачи (которое я приводил) сделано так, что прерывания запрещены очень короткий момент и даже для 100 КГц прерываний ни одного не потеряется!
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 18 2006, 08:14
|

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

|
Цитата(GetSmart @ May 17 2006, 21:53)  Касательно файла Target_LPC2xxx.h
"#define CONTEXT_SWITCH_INT VIC_SW" - Использовать отдельное прерывание (VIC_SW) не обязательно, если у вас так же прерывать задачу может таймер. Для этого я принудительно вызывал прерывание от таймера такой командой: VICSoftInt = (1 << VIC_TIMER1) Внутри обработчика прерывания таймера не забудьте сбросить этот бит, а то зависнет. Если же таймер не переключает задачи, то всё нормально. Основной механизм - вытесняющая многозадачность. Таймер может вызвать переключение если истек тайм-аут какого-либо процесса. Цитата(GetSmart @ May 17 2006, 21:53)  Так писать не нужно: "VICIntEnable |= (1<<CONTEXT_SWITCH_INT);" Через этот регистр можно только устанавливать биты, но не сбрасывать. Поэтому пишите так: VICIntEnable = (1<<CONTEXT_SWITCH_INT); А эта конструкция вообще убьёт всю систему: "#define BlockContextSwitchMacro() do { \ VICIntEnable &= ~(1<<CONTEXT_SWITCH_INT); \ } while (0) // disable context switching interrupt " Для сброса бита разрешения конкретного прерывания есть другой регистр. Надо так: VICIntEnClear = (1<<CONTEXT_SWITCH_INT); Каюсь, здесь я промухал. Посыпаю голову окурками :-) Цитата(GetSmart @ May 17 2006, 21:53)  Кстати, зачем пишите "do {...} while (0)" ??? Это долгая история. Сначала увидел такую конструкцию в исходниках линукса и тоже был озадачен. Задал вопрос на сахаре и ReAl мне наглядно объяснил, что поскольку в макрос может быть добавлена еще одна команда то его лучше сразу заключить в {}, но макрос с {} нельзя использовать в лоб в конструкции if(cond) Macro(); else ....; а если добавить do while(0) то смысл не изменится но ограничений уже не будет. Цитата(GetSmart @ May 17 2006, 21:53)  Для чего timer 0, match 0 используете? Системное время, ОС по нему считает тайм-ауты. Цитата(GetSmart @ May 17 2006, 21:53)  Для справки, все свободные биты из 32 источников прерываний можно использовать для своих нужд через регистр VICSoftInt. Специально для этого сделан VIC_SW, но и остальные действуют аналогично. Я проверял. Угу, мне об этом говорили. Я, наивный, подумал что в атмеловском SAM7 так же. И тут же получил граблями в лоб - у атмела неиспользуемые биты не реализованы физически, т.е. "атакой, не атакуй...". С тех пор я слегка пуганый, и когда увидел в описании специально заточенный бит подумал "ВОТ!" и глубже решил не копать. Цитата(GetSmart @ May 17 2006, 21:53)  Кстати, у меня прерывание, переключающее задачи (которое я приводил) сделано так, что прерывания запрещены очень короткий момент и даже для 100 КГц прерываний ни одного не потеряется! Я еще не измерял сколько у меня получилось время переключения - наверное сегодня выделю минутку. Вообще мы с автором scmRTOS обсуждали идею как сильно сократить время запрета прерываний, но пока это на уровне идеи - должно какое-то время повариться в мозгу.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Сергей Борщ Написал порт scmRTOS под ARM May 15 2006, 14:19 Pat Цитата(Сергей Борщ @ May 15 2006, 16:19) ... May 15 2006, 16:20 Сергей Борщ >Я не шибко опытный, но что то компилер не нахо... May 15 2006, 16:35 Pat Скомпилир все ОК.
Запускаю отладку в симуляторе.
П... May 15 2006, 17:20  Сергей Борщ Цитата(Pat @ May 15 2006, 20:20) Скомпили... May 15 2006, 17:44  Сергей Борщ Цитата(Pat @ May 15 2006, 20:20) Запускаю... May 16 2006, 14:10 GetSmart ЦитатаВ данной же ситуации симулятор загружает SPS... May 16 2006, 15:43 Сергей Борщ Цитата(GetSmart @ May 16 2006, 18:43) Цит... May 16 2006, 16:04  spf Цитата(Сергей Борщ @ May 16 2006, 22:04) ... May 17 2006, 03:45 GetSmart Напишите комментарии в ASM-файле к каждой команде.... May 16 2006, 16:32 Сергей Борщ Цитата(GetSmart @ May 16 2006, 19:32) Нап... May 16 2006, 18:36 GetSmart Вопрос: почему у вас в xcl-файле начальные адреса ... May 16 2006, 18:09 GetSmart Всё-равно как-то запутанно. Попробуйте разобраться... May 16 2006, 19:17 Сергей Борщ Цитата(GetSmart @ May 16 2006, 22:17) Всё... May 16 2006, 19:57 GetSmart Цитатаmsr CPSR_cf,lr ; перек. в SYSTEM с разреш. п... May 16 2006, 20:20 Сергей Борщ Послушал советы, кое-чего поправил. Сделал targets... May 17 2006, 12:37 GetSmart ЦитатаСтранно, но почему-то в моем макете с AT91SA... May 17 2006, 16:17 Сергей Борщ Цитата(GetSmart @ May 17 2006, 19:17) Цит... May 17 2006, 16:56  zltigo Не сочтите за 'наезд' - работа несомненно ... May 18 2006, 07:06   Сергей Борщ Цитата(zltigo @ May 18 2006, 10:06) Цитат... May 18 2006, 07:45    zltigo Цитата(Сергей Борщ @ May 18 2006, 10:45) ... May 18 2006, 08:29     Сергей Борщ Цитата(zltigo @ May 18 2006, 11:29) Цитат... May 18 2006, 09:08      zltigo Цитата(Сергей Борщ @ May 18 2006, 12:08) ... May 18 2006, 09:37       Сергей Борщ Цитата(zltigo @ May 18 2006, 12:37) Цитат... May 18 2006, 13:06        zltigo Цитата(Сергей Борщ @ May 18 2006, 16:06) ... May 18 2006, 14:38 Сергей Борщ Цитата(GetSmart @ May 17 2006, 21:11) Смо... May 18 2006, 07:16 GetSmart ЦитатаНо все же я настаиваю, что восстановление CP... May 17 2006, 21:04 Сергей Борщ Цитата(GetSmart @ May 18 2006, 00:04) Дум... May 18 2006, 07:00 GetSmart ЦитатаЦитата
Команды "LDMFD LR, {R0-LR}^ ; NO... May 18 2006, 09:13 zltigo Давайте я Вас еще попытаюсь совлечь c "пути и... May 18 2006, 15:01 Сергей Борщ Цитата(zltigo @ May 18 2006, 18:01) Давай... May 18 2006, 15:21  zltigo Цитата(Сергей Борщ @ May 18 2006, 18:21) ... May 18 2006, 15:40 Сергей Борщ Сравнил по скорости с FreeRTOS. Тест простой: низк... May 18 2006, 15:14 zltigo Цитата(Сергей Борщ @ May 18 2006, 18:04) ... May 18 2006, 15:16  Сергей Борщ Цитата(zltigo @ May 18 2006, 18:16) Цитат... May 18 2006, 15:41 zltigo [quote name='Сергей Борщ' date='May 18... May 18 2006, 15:24 zltigo Цитата(Сергей Борщ @ May 18 2006, 18:14) ... May 18 2006, 18:50  Сергей Борщ Цитата(zltigo @ May 18 2006, 21:50) Цитат... May 19 2006, 11:04   zltigo Цитата(Сергей Борщ @ May 19 2006, 14:04) ... May 19 2006, 11:49    Сергей Борщ Цитата(zltigo @ May 19 2006, 14:49) Ну во... May 19 2006, 13:13     zltigo Цитата(Сергей Борщ @ May 19 2006, 16:13) ... May 19 2006, 13:32      Сергей Борщ Цитата(zltigo @ May 19 2006, 16:32) Цитат... May 19 2006, 13:37 GetSmart 2 Сергей Борщ
Когда закончите доводить до ума свою... May 18 2006, 15:41 Сергей Борщ Цитата(GetSmart @ May 18 2006, 18:41) 2 С... May 18 2006, 15:50 sergeeff Я давно приглядываюсь к scmRTOS применительно к AR... May 20 2006, 14:01 Сергей Борщ Цитата(sergeeff @ May 20 2006, 17:01) Я д... May 20 2006, 17:50  ig_z Цитата(Сергей Борщ @ May 20 2006, 20:50) ... May 21 2006, 00:02   Dainis Цитата(ig_z @ May 20 2006, 18:01) Почему ... May 21 2006, 12:07 amusin Цитата(sergeeff @ May 20 2006, 20:01) Ест... May 22 2006, 04:55  amusin Цитата(Сергей Борщ @ May 20 2006, 23:50) ... May 22 2006, 05:32   Сергей Борщ Цитата(amusin @ May 22 2006, 08:32) Цитат... May 22 2006, 08:22 ig_z 2 Сергей Борщ
Посмотрел ваш порт, сходу возник а... May 20 2006, 15:01 sergeeff Да. Еще про critical section. Твой вариант запрета... May 20 2006, 15:32 GetSmart ЦитатаSWI единственный коректный способ вызова SYS... May 21 2006, 12:36 zltigo ЦитатаМожно хотябы в общих словах пример кода, я е... May 21 2006, 16:54 GetSmart Цитатавопрос только в том,
нужны-ли эти выкрутасы ... May 21 2006, 17:38 zltigo Цитата(GetSmart @ May 21 2006, 20:38) А п... May 21 2006, 18:34 GetSmart Самая близкая по смыслу цитата из <arm7tdmi.pdf... May 21 2006, 19:08 zltigo Цитата(GetSmart @ May 21 2006, 22:08) Про... May 21 2006, 20:02 Сергей Борщ Завтра (в понедельник) буду изучать все это вдумчи... May 21 2006, 19:42 zltigo Цитата(Сергей Борщ @ May 21 2006, 22:42) ... May 21 2006, 20:33 GetSmart 1,2,3 - OK
4. Как только в коде (даже в IRQ, и даж... May 21 2006, 19:57 GetSmart ЦитатаА посмотреть на исходник и почитать Аtmel-ов... May 21 2006, 20:34 zltigo Цитата(GetSmart @ May 21 2006, 23:34) У-у... May 21 2006, 20:57 GetSmart ЦитатаНе стал, но завязан :-(
А AIC уже в официаль... May 21 2006, 21:28 zltigo Цитата(GetSmart @ May 22 2006, 00:28) Ну ... May 21 2006, 22:21 aaarrr Цитата(amusin @ May 22 2006, 09:32) Нет в... May 22 2006, 10:32 Сергей Борщ Спасибо всем, кто подсказал функцию поиска наиболе... May 22 2006, 11:30 amusin Цитата(Сергей Борщ @ May 22 2006, 17:30) ... May 22 2006, 11:48  Сергей Борщ Цитата(amusin @ May 22 2006, 14:48) Цитат... May 22 2006, 11:59   IgorKossak Цитата(Сергей Борщ @ May 22 2006, 14:59) ... May 22 2006, 12:16 sergeeff Да, конечно, для ARM надо сделать количество проце... May 22 2006, 15:40 amusin Цитата(sergeeff @ May 22 2006, 21:40) Да,... May 23 2006, 02:32  Сергей Борщ Цитата(amusin @ May 23 2006, 05:32) Цитат... May 23 2006, 07:25 sergeeff Пара соображений по поводу быстродействия. Я эту и... May 26 2006, 17:34 IgorKossak Цитата(sergeeff @ May 26 2006, 20:34) ...... May 27 2006, 16:03 dxp Цитата(sergeeff @ May 27 2006, 00:34) voi... May 29 2006, 03:46  amusin Цитата(dxp @ May 29 2006, 09:46)
Гарри,... May 29 2006, 06:18 GetSmart ЦитатаУ АРМа есть аппаратный сдвигатель?
Конечно е... May 29 2006, 09:20 spf Цитата(GetSmart @ May 29 2006, 15:20) Цит... May 29 2006, 10:16 GetSmart АРМ имеет команды с обоими вариантами: как непосре... May 29 2006, 10:21
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|