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

 
 
 
Reply to this topicStart new topic
> Неверный эпилог __arm __irq __nested прерывания, создаваемый IAR ARM 4.30
GetSmart
сообщение Oct 26 2009, 11:11
Сообщение #1


.
******

Группа: Участник
Сообщений: 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
разные разработчики компилеров, но грабли у них стандартные. Каждый уважающий себя разработчик компилеров обязан встать на стандартные грабли biggrin.gif

Предлагаю создать тему о багах IARa в шапке "Кросплатформенный компилятор IAR" и постить там только ссылки на другие темы, с конкретным описанием бага и версии IARа. Если кто поддерживает - отпишитесь.

Сообщение отредактировал GetSmart - Oct 26 2009, 11:28


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 26 2009, 11:29
Сообщение #2


Шаман
******

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



Цитата(GetSmart @ Oct 26 2009, 13:11) *
Обратите внимание на последнюю команду от IAR 4.30. По сути нет выхода из прерывания (аппаратного копирования SPSR в CPSR) и проц продолжает работать в режиме прерывания.

Вы проверили, что нет выхода из прерывания или только подозреваете?
Инструкция загружает в PC адрес возврата из стека пост-индексно со смещением. Т. е. по идее должен быть выход из прерывания.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 26 2009, 11:33
Сообщение #3


Гуру
******

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



Цитата(GetSmart @ Oct 26 2009, 14:11) *
Если кто поддерживает - отпишитесь.

Только если баги отсутствуют в официальном перечне Release Nones и не относятся к музейным вариантам компиляторов. "Ваш" баг отмечен и исправлен в 2006 году в версии 4.31. О чем производитель и сознался. На сегодняшний день текущая версия компилятора уже пятая. Парактический интерес может представлять разве только 4.42, как последний компилятор в V4 ветке.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 26 2009, 11:53
Сообщение #4


.
******

Группа: Участник
Сообщений: 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\). Море багов smile.gif Как только я на все них ещё не встал smile.gif Судя по этому списку сгенерить рабочий код из рабочего исходника - уже подвиг.

--------------
Причём баг из заголовка темы появляется при всех видах оптимизации (None не проверял).

Сообщение отредактировал GetSmart - Oct 26 2009, 12:08


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 26 2009, 12:14
Сообщение #5


Гуру
******

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



Цитата(GetSmart @ Oct 26 2009, 14:53) *
Судя по этому списку сгенерить рабочий код из рабочего исходника - уже подвиг.

На самом деле - нет, ибо мне они не встречались на аккуратно и четко написанном исходнике. Тот единственный случай, когда я наступил на баг IAR случился при правке мною чужого кода, когда делалась "заплатка" в попытке сохранить общий вид исходника. Сломался короткий цикл инициализации в достаточно запутанном выражении. Самостоятельно я бы такого не написал даже с бодуна sad.gif. Переписал понятно пять или шесть строчек и заработало.
P.S.
Вложенные прерывания я за всю жизнь использовал считанные разы и то для выживания резидентных программ в DOS, как чужой системе. Допускаю их использование в качестве полухалтурного решения для чего-нибудь маленького периферийного на мелком восьмибитовике.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 26 2009, 12:23
Сообщение #6


.
******

Группа: Участник
Сообщений: 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, как чужой системе. Допускаю их использование в качестве полухалтурного решения для чего-нибудь маленького периферийного на мелком восьмибитовике.

Вложенные прерывания - гениальная весчь в умелых руках. Не надо ля-ля smile.gif
А вложенные софтовые прерывания - вообще наше всё!
Конечно, это не относится к примитивным моргалкам светодиодов.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 26 2009, 12:35
Сообщение #7


Гуру
******

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



Цитата(GetSmart @ Oct 26 2009, 15:23) *
Я уже как минимум 4 раза встал на разные баги....

А я нет, видимо "я что-то делаю неправильно" (с) Анекдот.
Цитата
Вложенные прерывания - гениальная весчь в умелых руках. Не надо ля-ля smile.gif

Нет sad.gif В 99% тяжелая кувалда используемая неумелыми руками во исполнение принципа "а чего-тут думать - трясти вкладывать надо"


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 26 2009, 12:52
Сообщение #8


.
******

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



Цитата(zltigo @ Oct 26 2009, 18:35) *
"а чего-тут думать - трясти вкладывать надо"

МММ ?

Цитата(zltigo @ Oct 26 2009, 18:35) *
Нет sad.gif В 99% тяжелая кувалда используемая неумелыми руками

Вы очень часто неадекватно расставляете проценты. Особенно без учёта уровня собеседника. Я при этом не понимаю что Вы имеете в виду - среднестатистическое использование (в исходниках которые Вы где-то видели) вложенных прерываний, или вообще применительно даже к профессионалам, мол они все дураки что используют вложенные прерывания, а я такой умный знаю, что это зло.

Могу привести множество практических ситуаций, когда вложенные прерывания будут самым оптимальным решением по всем критериям. Не без недостатков, но достоинства уроют эти недостатки 10 раз. Поэтому я и люблю применять вложенные прерывания, но только именно в таких случаях, а не где попало. Человек же, который не понимает всей "картины" будет упорно твердить, что они зло.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Oct 26 2009, 12:57
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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


Приведите пожалуйста!
Никогда не использовал вложенных прерываний - хочется узнать много ли я потерял smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 26 2009, 13:19
Сообщение #10


Гуру
******

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



Цитата(GetSmart @ Oct 26 2009, 15:52) *
Я при этом не понимаю что Вы имеете в виду - среднестатистическое использование (в исходниках которые Вы где-то видели) вложенных прерываний....

И еще собственный многолетний опыт создания разнообразных железок, и еще не одна дискуссия на этом форуме по вложенным прерываниям. Все это совершенно не повлияло на точку зрения, что вложенные прерывания есть банальная заплатка, которой можно пользоваться именно, как заплаткой в некоторых обстоятельствах. И уж никак не во "множестве практических ситуаций".
Цитата
Человек же, который не понимает всей "картины" будет упорно твердить, что они зло.

А мысль о том, что другой человек способен видеть за пределами нарисованной Вами "картины" и сам рисовать "картины" отметается сразу?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 26 2009, 15:44
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Братья-художники, прежде чем чубы рвать, уточнили бы о каких вложенных прерываниях идет речь.
Одно дело приоритетные вложенные, другое дело AVR какой-нить.
Слова одни, а суть другая.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 26 2009, 15:54
Сообщение #12


Гуру
******

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



Цитата(Dog Pawlowa @ Oct 26 2009, 18:44) *
Слова одни, а суть другая.

В данном случае началось с ARM7.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VslavX
сообщение Oct 26 2009, 15:58
Сообщение #13


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(GetSmart @ Oct 26 2009, 14:23) *
Я уже как минимум 4 раза встал на разные баги в IAR 4.20 и 4.30

+1. Я начинал с версии 4.11 - там раз в неделю что-то генерилось не так, особенно он длинные (с телом на экран и более строчек) циклы недолюбливал. 4.20 - уже значительно реже - пару раз всего. Начиная с 4.30 проблем вроде особых не было.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 26 2009, 21:48
Сообщение #14


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А кто нибудь посчитал расходы на вложенные прерывания - именно для ARM7 ? IMHO если убрать весь этот оверхед - окажется что вложенных прерываний и не надо wink.gif.
Если уж обработчик такой тяжелый что жрет много времени - не проще ли перекинуть большую его часть на обычный уровень!
А для совсем критических вещей есть же FIQ - два уровня IRQ, FIQ вполне достаточно.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 13 2009, 07:16
Сообщение #15


.
******

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



Цитата(KRS @ Oct 27 2009, 03:48) *
А кто нибудь посчитал расходы на вложенные прерывания - именно для ARM7 ? IMHO если убрать весь этот оверхед - окажется что вложенных прерываний и не надо wink.gif.
Если уж обработчик такой тяжелый что жрет много времени - не проще ли перекинуть большую его часть на обычный уровень!
А для совсем критических вещей есть же FIQ - два уровня IRQ, FIQ вполне достаточно.

Цитата(Dima_G @ Oct 26 2009, 18:57) *
Приведите пожалуйста!
Никогда не использовал вложенных прерываний - хочется узнать много ли я потерял smile.gif

http://electronix.ru/forum/index.php?showtopic=69514&hl=

Сообщение отредактировал GetSmart - Nov 13 2009, 07:17


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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