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

 
 
> Неверный эпилог __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
 
Start new topic
Ответов
GetSmart
сообщение Oct 26 2009, 12:23
Сообщение #2


.
******

Группа: Участник
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


.
******

Группа: Участник
Сообщений: 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
Сообщение #5


Местный
***

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



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


Приведите пожалуйста!
Никогда не использовал вложенных прерываний - хочется узнать много ли я потерял smile.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 01:35
Рейтинг@Mail.ru


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