LINUX.ORG.RU

[avr-binutils] Что за фишка?


0

0

Весь вчерашний день и весь вечер я искал ошибку. Я её искал...искал.....искал. Рвал волосы на голове, но не сдавался. И как всегда ошибка нашлась там где её не ждали. Я её смог обнаружить только сегодня.

Вот два куска кода, первый:

_txbyte:
  mov r1,p0l
  ldi p1l,8
3:sbi DDR_SENSOR,NPIN_SENSOR
  cbi PORT_SENSOR,NPIN_SENSOR
  lsr r1 ; next bit
  brcc 0f
1:delay_us 10 ; bit 1
  cbi DDR_SENSOR,NPIN_SENSOR
  delay_us 60
  rjmp 2f
0:delay_us 60 ; bit 0
  cbi DDR_SENSOR,NPIN_SENSOR
  delay_us 10
2:dec p1l ; next
  brne 3b
  ret

Второй:

_txbyte:
  mov r1,p0l
  ldi p1l,8
3:sbi DDR_SENSOR,NPIN_SENSOR
  cbi PORT_SENSOR,NPIN_SENSOR
  lsr r1 ; next bit
  brcc 4f
1:delay_us 10 ; bit 1
  cbi DDR_SENSOR,NPIN_SENSOR
  delay_us 60
  rjmp 2f
4:delay_us 60 ; bit 0
  cbi DDR_SENSOR,NPIN_SENSOR
  delay_us 10
2:dec p1l ; next
  brne 3b
  ret

И казалось бы разница минимальна, но первый вариант кода не работает правильно. А всё из-за локальной метки с номером 0. Заменил метку 0 на метку 4 (и соответственно 0f на 4f), и заработало.

Вопрос, баг или фишка?

Видимо, таки ассемблер «хочет» работать с нормальными и правильными символическими метками, а не от балды записанными шестнадцатеричными числами .)

elipse ★★★
()
Ответ на: комментарий от elipse

Что значит правильными? Насколько я понимаю, существует два типа меток в GAS: локальные и глобальные. Причём именно с локальной меткой «0» он работает неправильно..

anterior
() автор топика
Ответ на: комментарий от anterior

http://sourceware.org/binutils/docs/as/Symbol-Names.html#Symbol-Names

5.3 Symbol Names

Symbol names begin with a letter or with one of `._'. On most machines, you can also use $ in symbol names; exceptions are noted in Machine Dependencies. That character may be followed by any string of digits, letters, dollar signs (unless otherwise noted for a particular target machine), and underscores.

....

-------------------------------------

elipse ★★★
()

>Весь вчерашний день и весь вечер я искал ошибку.

Пипец - эту ошибку в отладчике можно было за пару минут найти. Пользуйся simulavr и gdb если под linux - там и jtag не нужен.

imhotep
()
Ответ на: комментарий от elipse

> 5.3 Symbol Names
мда...замутненько там у них. Я то думал что локальные метки в стиле как у Кнута в книге описаны, т.е. числа 0-9, ссылаться на которые можно через 0f, 0b, 1f, 1b,... А здесь это и ещё столько тонкостей..

anterior
() автор топика
Ответ на: комментарий от anterior

>А поделу, да, надо начинать использовать.

По делу - с этого и надо было начинать. Писать на асме без отладчика это не тру. Кстати - а чего на С не пишешь - как раз тут у linux для avr большое преимущество - gcc. Код неплохой генерирует а если что исходник на асме всегда поправишь как надо или инлайн удобнейший. Библиотеки готовые есть для разной периферии.

imhotep
()
Ответ на: комментарий от imhotep

> Кстати - а чего на С не пишешь
Вот как раз занимаюсь сдружением асма и Cи, пишу библиотеки для необходимых мне устройств на асме (жк-дисплей, термодатчик например), а потом их юзаю в Си проектах. Имхо оптимально с точки зрения компактности кода/производительности.

anterior
() автор топика

Я так понимаю delay_us — это макрос? Нет ли там метки 0? Если есть то все понятно: после раскрытия макроса у тебя в коде появляется куча меток 0. На одну из них и попадает твой переход.

anonymous
()
Ответ на: комментарий от anonymous

упс...действительно есть:( Опасная ловушка, надо будет в следующий раз быть с этим осторожней.

Теперь вопрос решён, спасибо.

anterior
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.