|
|
  |
Неверный эпилог __arm __irq __nested прерывания, создаваемый IAR ARM 4.30 |
|
|
|
Oct 26 2009, 11:11
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Объявлено такое прерывание Код __arm __irq __nested void Interrupt() { ..... } при этом код, генеримый IAR 4.20: Код \ 00000000 04E04EE2 SUB LR,LR,#+0x4 \ 00000004 00402DE9 STMDB SP!,{LR} \ 00000008 00E04FE1 MRS LR,SPSR \ 0000000C 00502DE9 STMDB SP!,{R12,LR} \ 00000010 00E00FE1 MRS LR,CPSR \ 00000014 1FE08EE3 ORR LR,LR,#+0x1F \ 00000018 0EF029E1 MSR CPSR,LR \ 0000001C FF012DE9 STMDB SP!,{R0-R8} ;; Push ............... \ 00000134 FF01BDE8 LDMIA SP!,{R0-R8} ;; Pop \ 00000068 00C00FE1 MRS R12,CPSR \ 0000006C 92C08CE3 ORR R12,R12,#+0x92 \ 00000070 0DC0CCE3 BIC R12,R12,#+0xD \ 00000074 0CF029E1 MSR CPSR,R12 \ 00000078 0050BDE8 LDMIA SP!,{R12,LR} \ 0000007C 0EF069E1 MSR SPSR,LR \ 00000080 0080FDE8 LDMIA SP!,{PC}^ ;; return теперь код, генеримый IAR 4.30: Код \ 00000000 04E04EE2 SUB LR,LR,#+0x4 \ 00000004 04E02DE5 STR LR,[SP, #-4]! \ 00000008 00E04FE1 MRS LR,SPSR \ 0000000C 00502DE9 STMDB SP!,{R12,LR} \ 00000010 00E00FE1 MRS LR,CPSR \ 00000014 1FE08EE3 ORR LR,LR,#+0x1F \ 00000018 0EF029E1 MSR CPSR,LR \ 0000001C FF012DE9 STMDB SP!,{R0-R8} ;; Push ............... \ 00000144 FF01BDE8 LDMIA SP!,{R0-R8} ;; Pop \ 00000068 00C00FE1 MRS R12,CPSR \ 0000006C 92C08CE3 ORR R12,R12,#+0x92 \ 00000070 0DC0CCE3 BIC R12,R12,#+0xD \ 00000074 0CF029E1 MSR CPSR,R12 \ 00000078 0050BDE8 LDMIA SP!,{R12,LR} \ 0000007C 0EF069E1 MSR SPSR,LR \ 00000080 ........ LDR PC,[SP], #+0x4;; return --следующая строчка взята из прошивки, т.к. в листинге почему-то пропущен код последней операции \ 00000080 E49DF004 LDR PC, [SP], #+4 теперь код, генеримый IAR 4.42: Код \ 00000000 04E04EE2 SUB LR,LR,#+4 \ 00000004 04E02DE5 STR LR,[SP, #-4]! \ 00000008 00E04FE1 MRS LR,SPSR \ 0000000C 00502DE9 STMDB SP!,{R12,LR} \ 00000010 00E00FE1 MRS LR,CPSR \ 00000014 1FE08EE3 ORR LR,LR,#0x1F \ 00000018 0EF029E1 MSR CPSR,LR \ 0000001C FF012DE9 PUSH {R0-R8} ............... \ 00000144 FF01BDE8 POP {R0-R8} \ 00000148 00C00FE1 MRS R12,CPSR \ 0000014C 92C08CE3 ORR R12,R12,#0x92 \ 00000150 0DC0CCE3 BIC R12,R12,#0xD \ 00000154 0CF029E1 MSR SPSR,R12 \ 00000158 0050BDE8 LDM SP!,{R12,LR} \ 0000015C 0EF069E1 MSR SPSR,LR \ 00000160 0080FDE8 LDM SP!,{PC}^ ;; return Обратите внимание на последнюю команду от IAR 4.30. По сути нет выхода из прерывания (аппаратного копирования SPSR в CPSR) и проц продолжает работать в режиме прерывания. Глюк ну очень похожий на описанный в этой теме http://electronix.ru/forum/index.php?showt...mp;#entry650548разные разработчики компилеров, но грабли у них стандартные. Каждый уважающий себя разработчик компилеров обязан встать на стандартные грабли  Предлагаю создать тему о багах IARa в шапке "Кросплатформенный компилятор IAR" и постить там только ссылки на другие темы, с конкретным описанием бага и версии IARа. Если кто поддерживает - отпишитесь.
Сообщение отредактировал GetSmart - Oct 26 2009, 11:28
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 26 2009, 11:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(IgorKossak @ Oct 26 2009, 17:29)  1. Вы проверили, что нет выхода из прерывания или только подозреваете? 2. Инструкция загружает в PC адрес возврата из стека пост-индексно со смещением. Т. е. по идее должен быть выход из прерывания. 1. Как только программа залетает в это прерывание, то она начинает вести себя неадекватно. Долго я этот баг искал. Как только запретил это прерывание, то сильно кастрированная программа кое-как заработала. 2. Инструкция выхода из прерывания/исключения ещё должна копировать SPSR в CPSR (восстанавливать CPSR, который был до входа в прерывание). Обычно это делается галочкой ^ в командах LDM (LDMIA SP!,{PC}^) или постфиксом S в командах MOV PC,... (MOVS PC,...). В 4.30 явный баг. Если не восстановить CPSR, то проц будет продолжать работать на стеке прерывания и с его же теневыми регистрами, то есть регистры тоже не восстановятся, хотя управление (PC) уже вернётся туда, откуда его выдернуло прерывание. Цитата(zltigo @ Oct 26 2009, 17:33)  Только если баги отсутствуют в официальном перечне Release Nones и не относятся к музейным вариантам компиляторов. "Ваш" баг отмечен и исправлен в 2006 году в версии 4.31. О чем производитель и сознался. На сегодняшний день текущая версия компилятора уже пятая. Парактический интерес может представлять разве только 4.42, как последний компилятор в V4 ветке. Разумно. Прочитал файл iccarm.htm (лежащий в \Program Files\папка с ИАРом\arm\doc\). Море багов  Как только я на все них ещё не встал  Судя по этому списку сгенерить рабочий код из рабочего исходника - уже подвиг. -------------- Причём баг из заголовка темы появляется при всех видах оптимизации (None не проверял).
Сообщение отредактировал GetSmart - Oct 26 2009, 12:08
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 26 2009, 12:14
|

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

|
Цитата(GetSmart @ Oct 26 2009, 14:53)  Судя по этому списку сгенерить рабочий код из рабочего исходника - уже подвиг. На самом деле - нет, ибо мне они не встречались на аккуратно и четко написанном исходнике. Тот единственный случай, когда я наступил на баг IAR случился при правке мною чужого кода, когда делалась "заплатка" в попытке сохранить общий вид исходника. Сломался короткий цикл инициализации в достаточно запутанном выражении. Самостоятельно я бы такого не написал даже с бодуна  . Переписал понятно пять или шесть строчек и заработало. P.S. Вложенные прерывания я за всю жизнь использовал считанные разы и то для выживания резидентных программ в DOS, как чужой системе. Допускаю их использование в качестве полухалтурного решения для чего-нибудь маленького периферийного на мелком восьмибитовике.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 26 2009, 12:23
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Я уже как минимум 4 раза встал на разные баги в IAR 4.20 и 4.30 и отписывался здесь. Во всех случаях исходник был 100% корректный. В двух из них было константное условие в IFе, и это проблема IARа, а не моя, что они некорректно оптимизируют (!) такие вещи, потому как на средней и менее оптимизациях обе этих ситуации работали. И будут работать во всех нормально писанных компиляторах. Цитата(zltigo @ Oct 26 2009, 18:14)  P.S. Вложенные прерывания я за всю жизнь использовал считанные разы и то для выживания резидентных программ в DOS, как чужой системе. Допускаю их использование в качестве полухалтурного решения для чего-нибудь маленького периферийного на мелком восьмибитовике. Вложенные прерывания - гениальная весчь в умелых руках. Не надо ля-ля  А вложенные софтовые прерывания - вообще наше всё! Конечно, это не относится к примитивным моргалкам светодиодов.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 26 2009, 12:35
|

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

|
Цитата(GetSmart @ Oct 26 2009, 15:23)  Я уже как минимум 4 раза встал на разные баги.... А я нет, видимо "я что-то делаю неправильно" (с) Анекдот. Цитата Вложенные прерывания - гениальная весчь в умелых руках. Не надо ля-ля  Нет  В 99% тяжелая кувалда используемая неумелыми руками во исполнение принципа "а чего-тут думать - трясти вкладывать надо"
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 26 2009, 12:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Oct 26 2009, 18:35)  "а чего-тут думать - трясти вкладывать надо" МММ ? Цитата(zltigo @ Oct 26 2009, 18:35)  Нет  В 99% тяжелая кувалда используемая неумелыми руками Вы очень часто неадекватно расставляете проценты. Особенно без учёта уровня собеседника. Я при этом не понимаю что Вы имеете в виду - среднестатистическое использование (в исходниках которые Вы где-то видели) вложенных прерываний, или вообще применительно даже к профессионалам, мол они все дураки что используют вложенные прерывания, а я такой умный знаю, что это зло. Могу привести множество практических ситуаций, когда вложенные прерывания будут самым оптимальным решением по всем критериям. Не без недостатков, но достоинства уроют эти недостатки 10 раз. Поэтому я и люблю применять вложенные прерывания, но только именно в таких случаях, а не где попало. Человек же, который не понимает всей "картины" будет упорно твердить, что они зло.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 26 2009, 12:57
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(GetSmart @ Oct 26 2009, 16:52)  Могу привести множество практических ситуаций, когда вложенные прерывания будут самым оптимальным решением по всем критериям. Приведите пожалуйста! Никогда не использовал вложенных прерываний - хочется узнать много ли я потерял
|
|
|
|
|
Oct 26 2009, 13:19
|

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

|
Цитата(GetSmart @ Oct 26 2009, 15:52)  Я при этом не понимаю что Вы имеете в виду - среднестатистическое использование (в исходниках которые Вы где-то видели) вложенных прерываний.... И еще собственный многолетний опыт создания разнообразных железок, и еще не одна дискуссия на этом форуме по вложенным прерываниям. Все это совершенно не повлияло на точку зрения, что вложенные прерывания есть банальная заплатка, которой можно пользоваться именно, как заплаткой в некоторых обстоятельствах. И уж никак не во "множестве практических ситуаций". Цитата Человек же, который не понимает всей "картины" будет упорно твердить, что они зло. А мысль о том, что другой человек способен видеть за пределами нарисованной Вами "картины" и сам рисовать "картины" отметается сразу?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 13 2009, 07:16
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(KRS @ Oct 27 2009, 03:48)  А кто нибудь посчитал расходы на вложенные прерывания - именно для ARM7 ? IMHO если убрать весь этот оверхед - окажется что вложенных прерываний и не надо  . Если уж обработчик такой тяжелый что жрет много времени - не проще ли перекинуть большую его часть на обычный уровень! А для совсем критических вещей есть же FIQ - два уровня IRQ, FIQ вполне достаточно. Цитата(Dima_G @ Oct 26 2009, 18:57)  Приведите пожалуйста! Никогда не использовал вложенных прерываний - хочется узнать много ли я потерял  http://electronix.ru/forum/index.php?showtopic=69514&hl=
Сообщение отредактировал GetSmart - Nov 13 2009, 07:17
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|