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

 
 
> Errata IAR ARM 5.30, это точно компилятор))
zhek
сообщение Nov 23 2009, 10:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 в настройках оптимизатора все стало работать нормально.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zhek
сообщение Nov 23 2009, 11:13
Сообщение #2


Участник
*

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



прикрепляю файлик, сменил расширение с .s на .txt, а то не позволяли прикрепить
строка 6922
Только код работает, смотреть его, наверное, неинтересно. Исходник не менялся полтора года, прошивка столько же работает в серийных изделиях. Я три дня по этому коду хожу. При одних и тех же начальных условиях функция может работать по-разному. А тот фрагмент, который написан выше, вроде как однозначно определяет содержимое R8.
Прикрепленные файлы
Прикрепленный файл  ecg_sel.txt ( 273.77 килобайт ) Кол-во скачиваний: 64
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2009, 11:48
Сообщение #3


Гуру
******

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



Цитата(zhek @ Nov 23 2009, 13:13) *
фрагмент, который написан выше, вроде как однозначно определяет содержимое R8.
Может я чего-то не понимаю, но MOVNE выполняется именно когда NE. А если перед этим кодом получилось не NE, то эти команды не выполняются, и никакой однозначности в определении содержимого R8.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 23 2009, 11:57
Сообщение #4


.
******

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


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



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

 


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


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