|
Errata IAR ARM 5.30, это точно компилятор)) |
|
|
|
Nov 23 2009, 10:53
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692

|
Начал подглючивать девайс при работе. Долго искал причины, пока не убедился, что это косяк IAR ARM 5.30. Делал оптимизацию High по Speed. Были установлены все птички, кроме Static clustering. Окончательно убедился, что это не ошибка в коде, когда стал регулярно ловить такую ситуацию. Ассемблерный код: ... MOVNE R8,R8, LSL #+16 MOVNE R8,R8, ASR #+16 // 1740 if (a >= wbNOISE_PARTS)//фиксируем начало зубца CMP R8,#+12 ... Команды MOVNE выполняют преобразование типа short->long. После этих операций в старших 16 битах может быть только знак, т. е. нули или единицы. Когда я ходил по ассемблерному коду, поймать не удавалось. А если идти по С-шному, то после очередного шага я сразу попадаю на строку CMP и вижу чудеса: например, в R8 вместо числа 58, лежат нули в младших 16 битах и число 25 в старших. Посмотрел, как используется R8 в прерываниях, но криминала не обнаружил. Так и не выяснил, что же именно происходит. Но поскольку использованием регистров рулит компилятор, то видимо из-за него когда-то что-то происходит не так. После снятия галочки Function inlining в настройках оптимизатора все стало работать нормально.
|
|
|
|
|
 |
Ответов
|
Nov 23 2009, 11:13
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 29-12-05
Из: Екатеринбург
Пользователь №: 12 692

|
прикрепляю файлик, сменил расширение с .s на .txt, а то не позволяли прикрепить строка 6922 Только код работает, смотреть его, наверное, неинтересно. Исходник не менялся полтора года, прошивка столько же работает в серийных изделиях. Я три дня по этому коду хожу. При одних и тех же начальных условиях функция может работать по-разному. А тот фрагмент, который написан выше, вроде как однозначно определяет содержимое R8.
|
|
|
|
|
Nov 23 2009, 11:48
|

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

|
Цитата(zhek @ Nov 23 2009, 13:13)  фрагмент, который написан выше, вроде как однозначно определяет содержимое R8. Может я чего-то не понимаю, но MOV NE выполняется именно когда NE. А если перед этим кодом получилось не NE, то эти команды не выполняются, и никакой однозначности в определении содержимого R8.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 23 2009, 11:57
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Nov 23 2009, 17:48)  Может я чего-то не понимаю, но MOVNE выполняется именно когда NE. А если перед этим кодом получилось не NE, то эти команды не выполняются, и никакой однозначности в определении содержимого R8. В этом месте в листинге всё в норме Код CMP R6,#+0 RSBNE R8,R8,#+0 MOVNE R8,R8, LSL #+16 MOVNE R8,R8, ASR #+16 Никакой неоднозначности. В зависимости от R6 у регистра R8 (signed short) будет сменён знак и опять преобразован к signed short (на всякий случай (+0x8000)). --------- Насколько я успел мельком взглянуть, в листинге не видно баг и там не может быть старшие 16 бит R8 содержать число отличное от 0 или 0xffff.
Сообщение отредактировал GetSmart - Nov 23 2009, 11:58
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
zhek Errata IAR ARM 5.30 Nov 23 2009, 10:53 zltigo Слова-слова... А где, собственно тот самый не рабо... Nov 23 2009, 10:57 zltigo Цитата(zhek @ Nov 23 2009, 14:13) Только ... Nov 23 2009, 11:29 GetSmart Одно только в этом коде выглядит подозрительным
Ко... Nov 23 2009, 15:13 zhek ЦитатаПри входе в цикл регистры R2 и R10 будут изн... Nov 24 2009, 09:44 Alechek Цитата(zhek @ Nov 23 2009, 16:53) Начал п... Nov 24 2009, 12:22 zhek Похоже, косяк был связан все-таки не с компиляторо... Jul 8 2010, 09:01 scifi Цитата(zhek @ Jul 8 2010, 13:01) в качест... Jul 8 2010, 09:46 zhek Поизучал оптимизацию. Косяк возникает только если ... Jul 8 2010, 11:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|