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

 
 
> 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 24 2009, 09:44
Сообщение #2


Участник
*

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



Цитата
При входе в цикл регистры R2 и R10 будут изначально равны и цикл по сути не выполнится ни разу

Тяжело дается ассемблер, но вроде как BCS - переход, если больше или равно, т. е. цикл выполнится 1 раз. Иначе вообще бы ничего не работало smile.gif
Это соответствует исходному коду функции wbCalcDA
Код
short wbCalcDA(UBYTE beg, UBYTE end, UBYTE minus, ecgWAVE_BUILD *wseg)
  {
  UBYTE i;
  short da;

  for (i = beg, da = 0; i <= end; i++)
    da += wseg->segs[i].da;
  if (minus) da = -da;
  return da;
  }


Цитата
Если же есть явное подозрение на порчу R8, то это ещё может быть из-за неправильного сохранения/восстановления регистров в прерывании.

Думаю, что это и есть самая вероятная причина. Но, глядя на листинг обработчиков прерываний, ничего подозрительного не нахожу. Правда, смотрел только на использование R8. Все смотреть тяжеловато, проект очень болшьой, а я с ассемблером на "Вы".
fiq в проекте не используется, вложенные прерывания - тоже
IAR показывает, что стеков хватает с запасом. Проверял (считал сам и смотрел на содержимое ОЗУ) - не врет.
Go to the top of the page
 
+Quote Post



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

 


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


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