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

 
 
> iar avr. Глючит при объявлении переменных с инициализацией не нулем, Компилятор "забывает" очистить R31 (модель памяти TINY)
AndryG
сообщение Mar 6 2015, 18:15
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Поймал я странное поведение компилятора. (IAR C/C++ Compiler for AVR 6.12.1 (6.12.1.50500))
Долго искал почему после подключения в программу модуля proteus начал ругаться "обращение к памяти за её пределами".
И вот что нарыл:

Имеем кусочек кода
Код
uint16_t seconds = 0;

void main(void){
  seconds = 60 * 1 + 5;

Прикрепленное изображение

И дальше всё красиво работает.

Теперь инициализируем uint16_t seconds = 1; (не нулем!)
Прикрепленное изображение


R31 у нас не пустой. И компилятор не собирается его очищать, закидывая адрес только в R30 (модель памяти tiny). И команда ST Z, R16 стучится "совсем не туда".

Эх. Так всё лаконично и коротко получилось, а сколько я просидел за листингами, пока нашел причину.

В map-файле имеем:
Код
-------------------------------------------------------------------------
TINY_ID
  Relative segment, address: CODE 000003A4 - 000003A5 (0x2 bytes), align: 0
  Segment part 35.            Intra module refs:   seconds

Вот после этой инициализии, видимо, и остается в Z мусор.

Если включить сильную оптимизацию, то глюк исчезает.

___
P.S.
Если это реальный глюк компилятора, а не моя досадная ошибка, то можно и в тему компилятора iar перенести топик... а то я там только глупые вопросы задаю, а тут целый баг нарыл )))
Go to the top of the page
 
+Quote Post



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

 


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


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