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

 
 
> Неверный эпилог __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
Ответов
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
GetSmart
сообщение Oct 26 2009, 11:53
Сообщение #3


.
******

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


Гуру
******

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



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

 


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


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