|
Портирование кода для AVR с IAR под GCC |
|
|
|
Feb 3 2008, 11:17
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
 Вобщем после удачной компиляции и прошивки схема перестала работать. Такое впечатление что IAR выполнил какую-то неявную дополнительную настройку или что-то подобное подскажите с чего начать разруливать ситуацию ато в микроконтроллерах я новичок
|
|
|
|
|
Feb 3 2008, 11:43
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
Цитата(Сергей Борщ @ Feb 3 2008, 13:27)  В IAR иначе ("прямее") организована работа с данными в флеш и eeprom. Ищите в коде ключевые слова __eeprom, __flash, читайте WinAVR/DOC/avr-libc/FAQ.html и WinAVR/DOC/avr-libc/index.html. ключевые слова eeprom && flash заменил на аналоги GCC. кстати пользую не WinAVR а cdk4avr который в частности содержит более свежий GCC Цитата(cvv @ Feb 3 2008, 13:41)  ключевые слова eeprom && flash заменил на аналоги GCC. но Это повлияло только на то что прошивки стали влазить во флеш и епром соответсвенно. Пишу для ATMega48
|
|
|
|
|
Feb 4 2008, 06:29
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата По поиску cdk4avr ссылки на середину 2007 г, а WinAvr 2007-12-20 В последних WinAvr gcc 4.x.x - ИМХО не лучший вариант, код больше, оптимизация хуже.
|
|
|
|
|
Feb 4 2008, 08:31
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
Цитата(733259 @ Feb 4 2008, 08:29)  В последних WinAvr gcc 4.x.x - ИМХО не лучший вариант, код больше, оптимизация хуже. Поддерживаю... gcc 4.x.x - редкий sucks а вообшето я поначалу собирался сам скомпилить gcc но потом передумал.
|
|
|
|
|
Feb 4 2008, 10:29
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата а вообшето я поначалу собирался сам скомпилить gcc но потом передумал. Может стоит собрать gcc 3.4.6 и новые binutils для собственного спокойствия от багов (в cdk4avr вроде 3.4.5).
|
|
|
|
|
Feb 4 2008, 10:45
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
Цитата(733259 @ Feb 4 2008, 12:29)  Может стоит собрать gcc 3.4.6 и новые binutils для собственного спокойствия от багов (в cdk4avr вроде 3.4.5). Если необходимость встанет ребром то придется...
|
|
|
|
|
Feb 4 2008, 14:45
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
* Главная проблема была в кривизне прошивки - она не стартовала до получения команды с последовательного порта
|
|
|
|
|
Mar 24 2008, 08:21
|
Гуру
     
Группа: Свой
Сообщений: 2 318
Регистрация: 13-02-05
Из: Липецкая область
Пользователь №: 2 613

|
Надо разместить таблицу с двухбайтными значениями в памяти программ (WINAVR). Почитал FAQ, конференцию, Яндекс. Написал следующий код. При трансляции ошибок нет. Значения с таблицы не считывет. Код { unsigned int dac_cod = 0; const unsigned int *data = table_v;
uint16_t table_v[] = {0xAAAA,0x0600,0x5B00,0x4F00,0x6600,0x6D00,0x7D00,0x0700,0x7F00,0x6F00,0x8000,0x 7D00,0x0700,0x7F00,0x6F00,0xAAAA};
dac_cod =pgm_read_word(data); } Где ошибка?
|
|
|
|
|
Mar 24 2008, 08:28
|

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

|
Цитата(gte @ Mar 24 2008, 10:21)  Значения с таблицы не считывет. Код uint16_t table_v[] = {0xAAAA,0x0600,0x5B00,0x4F00,0x6600,0x6D00,0x7D00,0x0700,0x7F00,0x6F00,0x8000,0x 7D00,0x0700,0x7F00,0x6F00,0xAAAA}; Где ошибка? Цитата const uint16_t table_v[] PROGMEM = {0xAAAA,0x0600,0x5B00,0x4F00,0x6600,0x6D00,0x7D00,0x0700,0x7F00,0x6F00,0x8000,0x 7D00,0x0700,0x7F00,0x6F00,0xAAAA}; или Цитата const prog_uint16_t table_v[] = {0xAAAA,0x0600,0x5B00,0x4F00,0x6600,0x6D00,0x7D00,0x0700,0x7F00,0x6F00,0x8000,0x 7D00,0x0700,0x7F00,0x6F00,0xAAAA};
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Mar 24 2008, 08:38
|

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

|
У меня была проблема при переходе с ИАР на MSPGCC (под MSP430) идеальный код, зацепиться не за что. А в девайсе не работает ни в какую. Мучался с неделю, пока один старший товарищ не заметил (опыт не пропьёшь!), что ИАР формирует файл прошивки несколько иначе, чем средства GCC. Проблема была в формате текстового файла (hex,ti-text - не суть) GCC формирует текстовик в линуховом формате - то есть в конце строки ставится только один символ - 0x0D, в то время как в формате MS(DOS,Win - не важно) положено 2 символа - 0A 0D.
А прошивал я старыми привычными средствами. В результате загрузчик не находил конца строки (0А), а 0D прошивал в процессор, в результате там оказалась полная лажа.
Короче, резюме: при использовании GCC загрузчик должен быть соответствующий, либо нужно преобразовывать формат файла прошивки.
Не совсем в тему, конечно, речь-то идёт об AVR, но может кому пригодится, чтобы не страдали как я
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Mar 24 2008, 09:09
|
Гуру
     
Группа: Свой
Сообщений: 2 318
Регистрация: 13-02-05
Из: Липецкая область
Пользователь №: 2 613

|
На конструкцию const uint16_t table_v[] PROGMEM = дает сообщение * um_mega8.c, line 268: warning: '__progmem__' attribute ignored вторую взял, Static variable address beyond the RAM limit: table_v -> :0x800060 но с предупреждением Repeated variable name table_v within block. Rename it Я, так понимаю, пытается в RAM массив определить. Цитата(MrYuran @ Mar 24 2008, 11:38)  Короче, резюме: при использовании GCC загрузчик должен быть соответствующий, либо нужно преобразовывать формат файла прошивки. Спасибо. Прошивать буду AVReal, посмотрю за этим моментом.
|
|
|
|
|
Mar 24 2008, 12:50
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
Цитата(gte @ Mar 24 2008, 14:44)  Решение оказалось весьма простым. Нельзя вставлять определение такого массива в тело main. Как только я вынес определение из main в начало файла, все стало на свои места. скорее всего его надо было пометить как static так как любые массивы обьявленные без статик внутри ф-и располаются *исключительно* в стеке а ты хотел во флеш.
Сообщение отредактировал cvv - Mar 24 2008, 12:51
|
|
|
|
|
Mar 25 2008, 18:43
|
Гуру
     
Группа: Свой
Сообщений: 2 318
Регистрация: 13-02-05
Из: Липецкая область
Пользователь №: 2 613

|
Цитата(Сергей Борщ @ Mar 24 2008, 19:35)  Тяжело телепатировать после выходных у тещи. Выложите минимальный исходник, в котором возникает предупреждение. Код #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h>
const uint16_t table_v[] PROGMEM = {0xAAAA,0xAAAA,0x0000,0xAAAA,0x0000,0xAAAA,0x0000,0xAAAA,0x0000,0xAAAA,0x0000,0x AAAA,0x0000,0xAAAA,0x0000,0x0000};
int main (void) { //const uint16_t table_v[] PROGMEM = {0xAAAA,0xAAAA,0x0000,0xAAAA,0x0000,0xAAAA,0x0000,0xAAAA,0x0000,0xAAAA,0x0000,0x AAAA,0x0000,0xAAAA,0x0000,0x0000}; const unsigned int *data = table_v; const unsigned int *dat_car;
while (0) { dat_car = data; } } В main пробовал разные варианты, не проходило, вынес работает. Цитата(gte @ Mar 24 2008, 15:44)  Может кто дать комментарии к оставшимся мообщениям?
Converting to AVR COFF: um1.cof avr-objcopy --debugging --change-section-address .data--и т.д. Warning: no "data" section found in output file Warning: file C:/WINDOWS/TEMP/cciw0ld7.s not found in symbol table, ignoring ------------ пропадают если выйти и снова запустить VMLAB.
|
|
|
|
|
Mar 25 2008, 22:38
|

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

|
Переменные, объявленные вами внутри функции (автоматические переменные), размещаются на стеке. Вы же пытаетесь заставить компилятор разместить переменную во флеш. Но это нонсенс - она не может быть одновременно и на стеке и во флеше. Если вы хотите, чтобы переменная была во флеше и ее область видимости была ограничена функцией, то объявлять эту переменную внутри функции надо с атрибутом static: Код int main (void) { static const uint16_t table_v[] PROGMEM = Цитата(gte @ Mar 25 2008, 20:43)  Код const unsigned int *data = table_v; const unsigned int *dat_car;
while (0) { dat_car = data; } } Здесь вы объявили указатель на int в ОЗУ. К большому сожалению, avr-gcc не отслеживает смешивание обычных указателей и указателей на флеш, хотя фактически это разные указатели  Т.е. то, что вы написали, avr-gcc проглотит, но не забудьте потом данные по этому указателю доставать при помщи pgm_read_xxx, а не *data. Лучше такие указатели сразу объявлять как const unsigned int PROGMEM *dat_car; - вам самому потом будет легче читать программу. А когда avr-gcc научится отличать указатели на флеш от указателей на ОЗУ - не придется править старые исходники.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2008, 10:40
|

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

|
Цитата(gte @ Mar 26 2008, 07:55)  Увы, я пробовал разные варианты объявления, в том числе и static (пост 19). Закоментированная строка - копия верхней. Код int main (void) { static const uint16_t table_v[] PROGMEM = { 1,2,3 }; const unsigned int *data = table_v; pgm_read_word(data); } Только что откомпилил. Никаких ошибок и предупреждений. WinAVR 20070725. Видимо причина кроется в другой части вашего исходника, которую вы нам не показали. Откомпилировал и текст из поста 19. При объявлении table_v внутри main как static тоже никаких предупреждений.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 27 2008, 05:45
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700

|
Цитата(gte @ Mar 26 2008, 18:39)  Repeated variable name table_v within block. Rename it это не варнинг насколько я понял. а последняя строчка лично меня смущает
|
|
|
|
|
Mar 27 2008, 20:41
|
Гуру
     
Группа: Свой
Сообщений: 2 318
Регистрация: 13-02-05
Из: Липецкая область
Пользователь №: 2 613

|
Да нет, я сразу же вынес, откомпилил и зашил в контроллер. Просто за простыми сообщениями иногда кроются большие проблемы. Кстати, про размер кода. Транслировал из VMLAB, WINAVR, AVRStudio, компилятор тот-же. Настройки, естественно разные, большинство по умолчанию, так как размер кода в данном случае не интересует. Так вот, умудрялся получать размер кода и 8 и 2,5 и 1,3 килобайт. Последний из AVRStudio с оптимизацией Os. Вот в одной известной книге по ARM и пишут, что GCC дает код, который работает на порядок медленнее, чем коммерческие компиляторы.
Понравился осциллограф в VMLAB. Можно быстро визуально оценить результат.
|
|
|
|
|
Mar 29 2008, 09:29
|
Гуру
     
Группа: Свой
Сообщений: 2 318
Регистрация: 13-02-05
Из: Липецкая область
Пользователь №: 2 613

|
В следующей программе переношу код работы с АЦП. В теле обработчика прерываний (первое и единственное использование) определяется static unsigned char n_adc; В WINRAR код разрушен. Запускаю из VMLAB. Дает сообщение Код Loading COFF file: det_8302.cof ---- --- ! Static variable address beyond the RAM limit: n_adc -> :0x800062 -Extracting line nr. to code x-refs ! COFF file contains inconsistencies or unsupported features. Debug info could be wrong or incomplete . Перенес static unsigned char n_adc; в начало файла - все стало нормально. WINRAR -20071221.
|
|
|
|
|
Mar 29 2008, 16:39
|

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

|
Для "дружбы" с AVRStudio естественным является формат elf. Насколько я понял из документации gcc, coff является несколько устревшим форматом. Цитата(gte @ Mar 29 2008, 12:42)  Вы не знаете, стоит использовать sqrt() из gcc с точки зрения скорости выполнения? со слов aesok: Цитата И если будете использовать float подключите 'libm.lib' библиотеку, добавте ключик -lm. ...... Дело в том что есть 2 варианта функций выполняющих действия (+, -, .. сравнения, преобразования в/из int) над float. В libgcc написанные на С и в libm написанные ассемблере. Для того чтобы использовались ассемблерные варианты этих функций нужно подключить libm в командной строке линкера после libgcc.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|