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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> WinAVR криво собирает код...
Spider
сообщение Apr 4 2009, 16:03
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Писал себе и писал прошивку и вдруг в один прекрасный момент она начала собираться "криво" и откатить назад не получается. Всё пропало. Помогите, что я натворил то?
А именно кривость проявляется в следующем. если после сборки открыть и посмотреть листинг вокруг строки sei(); перед циклом майна. То там какие-то хаотические куски кода, на которых проц то делает переполнение то ребутится. В общем ведёт себя неадекватно, а в main.c этого кода нет. Точнее есть но не в этом месте.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Apr 4 2009, 20:03
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Да вроде бы в этом куске кода GCC как обычно распихивает константы по регистрам перед запуском сурового алгоритма rolleyes.gif

PS: Makefile надо бы исправить: счастье что make сам догадывается что нет main.cpp, а есть main.c, и что оно C, и вовсе не C++ smile.gif
Go to the top of the page
 
+Quote Post
Spider
сообщение Apr 4 2009, 20:15
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



А можете дать результат сборки вашей? lss и hex...
Go to the top of the page
 
+Quote Post
SysRq
сообщение Apr 4 2009, 20:30
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Alexey Belyaev @ Apr 5 2009, 00:15) *
А можете дать результат сборки вашей? lss и hex...

Прикрепленные файлы
Прикрепленный файл  gps_lss_hex_make_corrected.zip ( 34.95 килобайт ) Кол-во скачиваний: 31
 
Go to the top of the page
 
+Quote Post
Spider
сообщение Apr 6 2009, 04:06
Сообщение #5


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Но всё же какой-то косяк...
К примеру вот такой lss получается:
Код
bufferInit((cBuffer*)&uartTxBuffer, (unsigned char *)uartTxData, sizeof(uartTxData));
     6e6:    8c ec           ldi    r24, 0xCC; 204
     6e8:    93 e0           ldi    r25, 0x03; 3
     6ea:    68 e6           ldi    r22, 0x68; 104
     6ec:    71 e0           ldi    r23, 0x01; 1
     6ee:    4f e7           ldi    r20, 0x7F; 127
     6f0:    08 d8           rcall    .-4080   ; 0xfffff702 <__eeprom_end+0xff7ef702>

От куда это он пытается вызвать функцию? Что за бред?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 6 2009, 05:44
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Alexey Belyaev @ Apr 6 2009, 07:06) *
От куда это он пытается вызвать функцию? Что за бред?

Вероятно, это косяк objdump
Go to the top of the page
 
+Quote Post
Spider
сообщение Apr 6 2009, 05:56
Сообщение #7


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(_Pasha @ Apr 6 2009, 12:44) *
Вероятно, это косяк objdump

тогда это ещё косяк Proteus и ARVStudio ибо они в отладке на этот же адрес хотят перейти, да и на железе не работает.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 6 2009, 06:10
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Alexey Belyaev @ Apr 6 2009, 08:56) *
тогда это ещё косяк Proteus и ARVStudio ибо они в отладке на этот же адрес хотят перейти, да и на железе не работает.


Дык поделитесь тайной: версия компилятора и содержимое makefile
В lss от SysRq такого косяка ведь нет sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 6 2009, 08:04
Сообщение #9


Гуру
******

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



Цитата(Alexey Belyaev @ Apr 6 2009, 07:06) *
От куда это он пытается вызвать функцию? Что за бред?
Это не бред. Не забывайте, что PC имеет ограниченную разрядность. Для меги8 это 13 бит. И при прыжке назад присходит отбрасывание старших разрядов. Итого, для меги8 это будет прыжок на адрес 6F2 - 4080 = 0xfffff702 & 0x1FFFF = 0x1702. Прием очень полезный, ибо команда rjmp не позволяет дотянуться до этого адреса прыжком вперед.


--------------------
На любой вопрос даю любой ответ
"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
Spider
сообщение Apr 6 2009, 08:42
Сообщение #10


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(_Pasha @ Apr 6 2009, 13:10) *
Дык поделитесь тайной: версия компилятора и содержимое makefile
В lss от SysRq такого косяка ведь нет sad.gif

Код
Using built-in specs.
Target: avr
Configured with: ../gcc-4.3.2/configure --enable-win32-registry=WinAVR-20081205 --with-gmp=/usr/local --with-mpfr=/usr/local --prefix=/c/WinAVR --target=avr --enable-languages=c,c++,objc --with-dwarf2 --enable-doc --disable-shared --disable-libada --disable-libssp --disable-nls --with-pkgversion='WinAVR 20081205' --with-bugurl='URL:http://sourceforge.net/tracker/?atid=520074&group_id=68108&func=browse'
Thread model: single
gcc version 4.3.2 (WinAVR 20081205)

Прикрепленные файлы
Прикрепленный файл  Slave.taho.zip ( 54.6 килобайт ) Кол-во скачиваний: 22
 
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 6 2009, 15:21
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Скачал. Собрал. Посмотрел. Описанного глюка не было. Полный отчет о make + lss в аттаче.[attachment=31476:gps_result.zip]

Цитата(Сергей Борщ @ Apr 6 2009, 11:04) *
Прием очень полезный, ибо команда rjmp не позволяет дотянуться до этого адреса прыжком вперед.

Неполезный это прием, т.к. обычно считается, что джамп в область вне пространства памяти приведет к непредсказуемым результатам. И лишь благодаря тому, что камень вменяемый...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 6 2009, 15:46
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Pasha @ Apr 6 2009, 18:21) *
Неполезный это прием, т.к. обычно считается, что джамп в область вне пространства памяти приведет к непредсказуемым результатам. И лишь благодаря тому, что камень вменяемый...

1) Вроде как именно для 8-килобайтных AVR-ок такое поведение задокумениторвано, у 90s8515 и прочих просто нет команды jump (ну, по описанию smile.gif ) и такое применение rjmp/rcall для 8-килобайтных - единственный способ достать до всего адресного пространства
2) -mno-wrap


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 6 2009, 15:46
Сообщение #13


Гуру
******

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



Цитата(_Pasha @ Apr 6 2009, 18:21) *
Неполезный это прием, т.к. обычно считается, что джамп в область вне пространства памяти приведет к непредсказуемым результатам.
Это не вне пространства. Пространство памяти программ не безгранично, оно ограничено разрядностью счетчика команд и замкнуто в кольцо все той же разрядностью. Вас ведь не смущает, что таймер, досчитав до 0xFFFF переходит на 0? И SUBI Rx, lo8(-(const)) == Rx + const вас тоже не смущает.

Абсолютно аналогичный прием используется в ARM для доступа к контроллеру прерываний (лежит в конце памяти) из области векторов (лежит в начале памяти). Таким же образом высчитываются простейшие задержки на таймерах. Никакого криминала, чистая математика.


--------------------
На любой вопрос даю любой ответ
"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
Spider
сообщение Apr 7 2009, 04:17
Сообщение #14


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Спасибо за разъяснения. Будем продолжать учиться.
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 7 2009, 05:25
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Было бы просто замечательно, если бы кто-то из глубоко вникших в AVR-GCC, посоветовал, как отключить (избежать, обойти) эту фичу с переходами "вне пространства адресов". в условиях недостатка средств отладка в протеусе - единственно возможный вариант, а он, зараза, не понимает, что ограничение разрядности аппаратно встроено в AVR, и не дает вести отладку... AVR Studio такую ситуацию отрабатывает верно, но вести в ней отладку проектов, завязанных на внешние сигналы, практически нереально sad.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

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

 


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


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