MaxiMuz 0 24 сентября, 2012 Опубликовано 24 сентября, 2012 · Жалоба Доброго времяни суток! Использую GCC 4.3.3. Имеется обьемная таблица , ну к примеру в 16тиричных кодах. Как не вписывая ее в листинг , вживить в код программы. И каким образом получать к ней доступ? Есть ли такая возможность ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DRUID3 0 24 сентября, 2012 Опубликовано 24 сентября, 2012 · Жалоба ...в код!? А что оно? Потом программа к нему обращаться будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 24 сентября, 2012 Опубликовано 24 сентября, 2012 · Жалоба Имеется обьемная таблица , ну к примеру в 16тиричных кодах. Как не вписывая ее в листинг , вживить в код программы. "В листинг" - это в текст? Зашейте её программатором во flash. И каким образом получать к ней доступ? Есть ли такая возможность ? Возможность есть. В ИАР-е жто было бы так (примерно): unsigned char _flash * ptr=(unsigned char _flash * )0x1234; unsigned char A=*ptr; В AVRGCC для чтения можно использовать pgm_read_byte и тп функции (avr/pgmspace.h). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 24 сентября, 2012 Опубликовано 24 сентября, 2012 · Жалоба к примеру в 16тиричных кодах Ежели, «к примеру», они бинарные, то можно сразу сгененрировать объектный файл. И мне этот способ так нравится, что, не исключаю, я сначала перегнал бы HEX в BIN тем же srecord-ом, а потом пропустил через objcopy. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 25 сентября, 2012 Опубликовано 25 сентября, 2012 · Жалоба "В листинг" - это в текст? Да, чтобы данные не переводить в текст и не писать потом много цифорок в Си программу, хотелось бы подключить, какимто образом, таблицу в виде отдельного файл (неважен формат). Так что бы можно было данные с этой таблицы считывать в программе. С библ-й (avr/pgmspace.h) и функцией pgm_read_byte я знаком. Там ничего полезного не нашел. ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 25 сентября, 2012 Опубликовано 25 сентября, 2012 · Жалоба С библ-й (avr/pgmspace.h) и функцией pgm_read_byte я знаком. Там ничего полезного не нашел. Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 25 сентября, 2012 Опубликовано 25 сентября, 2012 · Жалоба Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае? Еще раз. Т.о. uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250}; обычно вставляются в программу какиелибо данные , если данных много , то такая запись будет не удобна для читаемости программы или просто громоздко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 25 сентября, 2012 Опубликовано 25 сентября, 2012 · Жалоба Т.о. uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250}; обычно вставляются в программу какиелибо данные , если данных много , то такая запись будет не удобна для читаемости программы Данные можно выделить в отдельный файл, который ничего кроме таблицы не будет содержать - читабельность не пострадает. или просто громоздко. Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 25 сентября, 2012 Опубликовано 25 сентября, 2012 · Жалоба Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу. Как ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 25 сентября, 2012 Опубликовано 25 сентября, 2012 · Жалоба Как ? #define ADDRESS_OF_FLASH_TABLE 0x1000 #define SIZE_OF_FLASH_TABLE 128 unsigned char RamCopyOfTable[SIZE_OF_FLASH_TABLE]; void CopyTableFromFlashToRam() { for (unsigned char i=0; i<SIZE_OF_FLASH_TABLE; i++) RamCopyOfTable[i]=pgm_read_byte(ADDRESS_OF_FLASH_TABLE+i); } Как записать во флеш таблицу - это вопрос отдельный. Несколько способов точно можно придумать (можно как советовал ReAl, можно просто бинарник(hex) программатором зашить - я бы так и сделал). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?Прочитайте внимательно статью по ссылке, которую давал ReAL - там написано, как поместить данные не в секцию .data Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?У objcopy есть ключи для перемещения в другую секцию. Там в примере .rodata, она у ARM полетит во флеш (да у всех контроллеров с единым адреснім пространством должно так быть). Для AVR надо в .progmem.data и потом через pgm_read_* Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 (изменено) · Жалоба ReAl, да Спасибо за подсказку в FAQ к GCC нашел еще вот такой примера получения обьектника: $(OBJDIR)/%.o : %.bin @echo Converting $< @$(OBJCOPY) -I binary -O elf32-avr \ --rename-section .data=.progmem.data,contents,alloc,load,readonly,data \ --redefine-sym _binary_$*_bin_start=$* \ --redefine-sym _binary_$*_bin_end=$*_end \ --redefine-sym _binary_$*_bin_size=$*_size_sym \ $(<) $(@) @echo "extern const char" $(*)"[] PROGMEM;" > $(*).h @echo "extern const char" $(*)_end"[] PROGMEM;" >> $(*).h @echo "extern const char" $(*)_size_sym"[];" >> $(*).h @echo "#define $(*)_size ((int)$(*)_size_sym)" >> $(*).h Но когда приходиться сталкиваться с MakeFile-ом мой мозг отказывается воспринимать информацию! Ну не понимаю я зачем нужно было городить огороды, когда все можно было написать наподобие ДОСовсокого bat-файла !! Куда вставлять этот кусок? Вот теперь разбираюсь что к чему. Изменено 27 сентября, 2012 пользователем MaxiMuz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 29 сентября, 2012 Опубликовано 29 сентября, 2012 · Жалоба с помощью команды avr-objcopy --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -I binary -O elf32-avr Glue.bin Glue.o создал обектный файл. Компилирую проект - изменений ни каких ! Что я не так делаю ? Все 3 требуемых обектных файла в папке, Makefile я не изменял , так почему хекс не хочет полнеть ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 29 сентября, 2012 Опубликовано 29 сентября, 2012 · Жалоба Не знаю. Это надо смотреть Makefile, что где лежит и т.п. Показывайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться