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

 
 
7 страниц V  « < 4 5 6 7 >  
Reply to this topicStart new topic
> Глюки компилятора IAR?, Важно! Код прошивки по непонятным причинам не стартует в МК AVR.
singlskv
сообщение Feb 11 2008, 21:00
Сообщение #76


дятел
*****

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



Цитата(zltigo @ Feb 10 2008, 02:17) *
Можно это утверждение игнорировать начисто - я бегло просмотрел этот код. Полный мрак, начиная с переопределенной точки входа прямо в main(), деклараций переменных в header-ах,

Нда..., Вы меня заинтриговали и я тоже глянул на код...
Переопределение main это фигня, если автор точно знает что делает,
декларация переменных в хедерах...., ну сам иногда пользуюсь, иногда это удобнее
и правильнее...(в соответствующем контексте конечно...)

Но примерно 30-50 вызовов функции EEPROM_write_byte, половина из которых
вызывается из прерываний... 07.gif

Эта прога не заживет никогда, хотя автар будет еще долго утверждать что по частям
у него все работало... АМИНЬ...
Go to the top of the page
 
+Quote Post
DiMonstr
сообщение Feb 11 2008, 21:00
Сообщение #77


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

Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706



Спасибо.
Go to the top of the page
 
+Quote Post
bzx
сообщение Feb 11 2008, 21:20
Сообщение #78


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(DiMonstr @ Feb 12 2008, 00:00) *
Спасибо.

Надеюсь Вас тут убелили, что не стоит делать хитроумные проверки в виде счётчика переходов до основной точки входа и, тем более, хаять компилятор...


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
DiMonstr
сообщение Feb 12 2008, 17:44
Сообщение #79


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

Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706



Цитата(bzx @ Feb 12 2008, 00:20) *
Надеюсь Вас тут убелили, что не стоит делать хитроумные проверки в виде счётчика переходов до основной точки входа и, тем более, хаять компилятор...

А вот и нет, не убедили. Я не понимаю почему не стоит делать проверки джампов до main(). Как раз там её и целесообразней сделать, чтобы ещё до начала фунциклирования кода выявить ошибку. Я не вижу в этом ничего криминального! В любых системах, перед её запуском производится тестирование оборудования.

Цитата(singlskv @ Feb 12 2008, 00:00) *
...Но примерно 30-50 вызовов функции EEPROM_write_byte, половина из которых
вызывается из прерываний... 07.gif
Эта прога не заживет никогда, хотя автар будет еще долго утверждать что по частям
у него все работало... АМИНЬ...

А в чем собственно проблема? И причем тут вызов EEPROM_write_byte. Да хоть 100 раз я вызову - коренным образом это ничего не изменит. Во-первых, я их использую для отладки. Во-вторых, вызов функции записи в eeprom из прерываний для меня не критичен. В-третьих, на ход выполнения кода это тоже никак не влияет, иначе зачем тогда eeprom? Что Вы этим хотели сказать? Конкретизируйте пожалуйста. smile3009.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 12 2008, 18:42
Сообщение #80


дятел
*****

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



Цитата(DiMonstr @ Feb 12 2008, 20:44) *
Во-первых, я их использую для отладки. Во-вторых, вызов функции записи в eeprom из прерываний для меня не критичен. В-третьих, на ход выполнения кода это тоже никак не влияет, иначе зачем тогда eeprom?
Если для Вас не критично что из-за вызова функции записи в EEPROM,
прерывание может зависнуть в этом месте примерно на 3,5миллисекунды , и будут пропущены
другие прерывания, тогда не вопрос, тогда у Вас все в порядке... 07.gif
Go to the top of the page
 
+Quote Post
forever failure
сообщение Feb 13 2008, 06:09
Сообщение #81


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Кстати, кто-нить смотрел checkjump.asm ? Особенно вот такое место впечатлило :
TESTJMP_SUCCESS_BRID:
INC R17
;//////////////////////////////////////////////////////////////////////////
;// Формируем адрес перехода исходя из результатов тестов
// SHL ecx, 1
// ADD R17, offset TESTJMP_FINISH;
;//////////////////////////////////////////////////////////////////////////
;// Переход в зависимости от результата
// JMP R17
;//////////////////////////////////////////////////////////////////////////
;// Програмные ловушки
TESTJMP_FINISH:
TESTJMP_FINISH_COMPLETE:
END
/*кгхм.... ну и куда дальше пошло исполнение ?
прим. мое, f. f. */

Автор, если серьёзно хотите что-то продолжить, у вас есть два выбора:
1. Внимать советам более опытных участников форума и не упираться рогами в духе
"а я вот хочу так и всё".
2. Продолжить самостоятельно заниматься этим сумеречным умопомрачением, но уже не задавать вопросы "почему у меня не заводится, наверно компилятор кривой ?"

[плохой вариант удалён]

Сообщение отредактировал IgorKossak - Feb 13 2008, 06:40
Go to the top of the page
 
+Quote Post
GDI
сообщение Feb 13 2008, 07:39
Сообщение #82


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Я не понимаю почему не стоит делать проверки джампов до main()

Потому что Си программа стартует с main(), а все что вы понаписали до функции main() это только определения функций, т.е. код , который может быть вызван, только из функции main() или из прерываний, которые инициализируются и разрешаются опять же из функции main().


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
DiMonstr
сообщение Feb 13 2008, 20:31
Сообщение #83


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

Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706



Цитата(forever failure @ Feb 13 2008, 09:09) *
Кстати, кто-нить смотрел checkjump.asm ? Особенно вот такое место впечатлило...

Да этот тест ещё не дописан уважаемый!!! Не пугайтесь так. Приведенная Вами часть кода пока в разработке.


Цитата(GDI @ Feb 13 2008, 10:39) *
Потому что Си программа стартует с main(), а все что вы понаписали до функции main() это только определения функций, т.е. код , который может быть вызван, только из функции main() или из прерываний, которые инициализируются и разрешаются опять же из функции main().

А здесь я с Вами в корне не согласен! Как тут уже упоминалось, можно прицепить файл cstartup.s90 и написать код в нем. Вызов main() функции производиться из этого файла строкой:
Код
?cstartup_call_main:
    XCALL   main

Здесь я и продумываю разместить свои тесты, т.е. до инициализации стека и массивов данных.

Сегодня я провел такой эксперимент с прошивкой которая не запускается в атмеге.
Вставил в этот файл свой код, который пару раз дергает один из выводов порта.
Подключил к ноге анализатор и зашил прошивку.
Код вставил сюда:
Код
;----------------------------------------------------------------------------
; Set up the CSTACK and RSTACK pointers.
;----------------------------------------------------------------------------
    RSEG    CODE:CODE:NOROOT(1)
?SETUP_STACK:
    SBI 0x11, 4
    SBI 0x12, 4    
    CBI 0x12, 4
    SBI 0x12, 4    
    CBI 0x12, 4    
   ;; Return address stack (RSTACK)
    LDI R16,LOW(SFE(RSTACK)-1)
    OUT 0x3D,R16

После запуска стало ясно, что выполнение программы даже до этого участка не доходит!!! wacko.gif
Изменений сигнала на выводе порта не происходит!

Выходит дело, что переход с нулевого адреса выполняется не по адресу PC+0x00F9:
Код
@00000000: __program_start
---- cstartup.s90 ---------------------------------------------------------------------------------
26:           XJMP    ?C_STARTUP
+00000000:   C0F8        RJMP    PC+0x00F9        Relative jump
@00000001: ??INTVEC 2


Или в результате компиляции рождается битая прошивка.
А иначе как такое можно объяснить???!!!

Что на это скажете?!
Go to the top of the page
 
+Quote Post
bzx
сообщение Feb 13 2008, 21:21
Сообщение #84


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(DiMonstr @ Feb 13 2008, 23:31) *
Или в результате компиляции рождается битая прошивка.
А иначе как такое можно объяснить???!!!
Что на это скажете?!

Откуда у Вас такая неуёмная страсть к мазохизму? Вам уже десятка два людей прямо говорят, перестаньте страдать фигнёй. Годика 2-3 непрерывно попишите чего-нибудь попроще на чистом C, тогда, возможно, и самостоятельно разберётесь что к чему и без посторонней помощи, которую Вы не хотите слышать.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
forever failure
сообщение Feb 14 2008, 04:36
Сообщение #85


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Прогнать в симуляторе АВР студии полученный код не пробовали ? Прямо по шагам по ассемблерным инструкциям, откуда стартует, куда доходит, куда не доходит. Не обломайтесь, прогоните, многое станет ясно. Еще вариант - сделать полный дизассемблерный листинг прошивки. 8к кода - это не очень много, что бы найти в нём ошибку за достаточно короткое время.
Go to the top of the page
 
+Quote Post
DiMonstr
сообщение Feb 14 2008, 06:10
Сообщение #86


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

Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706



Цитата(forever failure @ Feb 14 2008, 07:36) *

Прогонял я код и в AVR Studio и в IARовском отладчике. Правда в IAR я дебаггера так и не заставил шагать с 0x00 адреса. Всегда он начинает с main(). Ну да ладно...
В общем в студии всё чисто, без криминала. Всё работает.


Цитата(bzx @ Feb 14 2008, 00:21) *

Откуда у Вас такая неуёмная страсть к мазохизму? Вам уже десятка два людей прямо говорят, перестаньте страдать фигнёй. Годика 2-3 непрерывно попишите чего-нибудь попроще на чистом C, тогда, возможно, и самостоятельно разберётесь что к чему и без посторонней помощи, которую Вы не хотите слышать.

Да и так уже почти год пишу на Си. Начинал с камешка AT90USB. Таких проблем там не было, а те что были разрулил. Это второй проект, причем на самом простом контроллере из AVR. И такая засада получилась...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 14 2008, 06:34
Сообщение #87


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(DiMonstr @ Feb 14 2008, 08:10) *
Прогонял я код и в AVR Studio и в IARовском отладчике. Правда в IAR я дебаггера так и не заставил шагать с 0x00 адреса. Всегда он начинает с main().

Project->Options->Debugger->Setup снять галочку Run to main.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 14 2008, 08:48
Сообщение #88


Гуру
******

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



Цитата(DiMonstr @ Feb 14 2008, 08:10) *
Да и так уже почти год пишу на Си.
Тогда вернитесь к истокам. Создайте новый проект, напишите в нем моргалку светодиодом из четырех команд и вылизывая железо добейтесь ее устойчивой работы. Если даже такая простая программа работать не будет - надо менять или железо или профессию. Вы питание и землю на все ножки питания/земли процессора подали или только на одну пару?
Потом постепенно добавите кусочки из своего нынешнего проекта. Проверять команды перехода - полная фигня. Что вы будете делать, если тест покажет ошибку? Будете крутиться в замкнутом цикле? Но какой командой вы цикл организуете, ведь переходы-то не работают! Запрещать переходить в main тоже не нужно - если переходы не работают, вы туда просто не попадете по XCALL main, ведь переходы-то не работают.

Менять cstartup для выполнения кода перед main не нужно - почитайте про функцию __low_level_init() в IAR и секции .initX в avr-gcc.


--------------------
На любой вопрос даю любой ответ
"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
MrYuran
сообщение Mar 3 2008, 14:31
Сообщение #89


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Сергей Борщ @ Jan 11 2008, 11:11) *
Первое, что нужно сделать - посмотреть в листинг и убедиться, что компилятор понял вас правильно.
Это понятно, что компилятор обвинить проще простого. У меня подобное поведение наблюдалось однажды, когда ошибочно был установлен фуз BRST. А у студента - когда подтяжка ресета вместо питания была подключена к одному из портов. Он порт настраивает на вывод - контроллер ресетится.

В общем есть предложение поспорить на ящик пива, что компилятор снова не при чем, а виноваты недостаток знаний и опыта.


А я часто сталкиваюсь с глюками ИАРа под МСП. В основном они однообразны и заключаются в непереходе по условию if, когда вроде бы всё очевидно.
Я точно не помню, но было что-то типа такого:

char i;
...
if (i) do something
else dо other

Так вот, условие никогда не выполнялось, хотя i было явно не ноль.
И так продолжалось до тех пор, пока я не переопределил условие типа i==0 или что-то типа этого, точно уже не помню.

И случай не единичный. Но ничего , привык. Правда, теперь вот на mspgcc надо переходить, а он вообще не хочет работать (в смысле код)

Хотя согласен, чаще всего ошибки в собственном коде.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 3 2008, 15:46
Сообщение #90


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(MrYuran @ Mar 3 2008, 18:31) *
А я часто сталкиваюсь с глюками ИАРа под МСП. В основном они однообразны и заключаются в непереходе по условию if, когда вроде бы всё очевидно.

Как правило причину уже озвучивали, - volatile. Компилятор просто видит, что вы не делали никаких операций и выбрасывает условие (оптимизирует)
Go to the top of the page
 
+Quote Post

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

 


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


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