|
GCC: Как подключить файл-таблицу в ПЗУ |
|
|
|
Sep 24 2012, 18:58
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MaxiMuz @ Sep 24 2012, 21:08)  Имеется обьемная таблица , ну к примеру в 16тиричных кодах. Как не вписывая ее в листинг , вживить в код программы. "В листинг" - это в текст? Зашейте её программатором во flash. Цитата(MaxiMuz @ Sep 24 2012, 21:08)  И каким образом получать к ней доступ? Есть ли такая возможность ? Возможность есть. В ИАР-е жто было бы так (примерно): Код unsigned char _flash * ptr=(unsigned char _flash * )0x1234; unsigned char A=*ptr; В AVRGCC для чтения можно использовать pgm_read_byte и тп функции (avr/pgmspace.h).
|
|
|
|
|
Sep 24 2012, 19:03
|

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

|
Цитата(MaxiMuz @ Sep 24 2012, 21:08)  к примеру в 16тиричных кодах Ежели, «к примеру», они бинарные, то можно сразу сгененрировать объектный файл. И мне этот способ так нравится, что, не исключаю, я сначала перегнал бы HEX в BIN тем же srecord-ом, а потом пропустил через objcopy.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 25 2012, 16:56
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(_Артём_ @ Sep 24 2012, 21:58)  "В листинг" - это в текст? Да, чтобы данные не переводить в текст и не писать потом много цифорок в Си программу, хотелось бы подключить, какимто образом, таблицу в виде отдельного файл (неважен формат). Так что бы можно было данные с этой таблицы считывать в программе. С библ-й (avr/pgmspace.h) и функцией pgm_read_byte я знаком. Там ничего полезного не нашел. ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?
|
|
|
|
|
Sep 25 2012, 17:12
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(_Артём_ @ Sep 25 2012, 20:00)  Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае? Еще раз. Т.о. Код uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250}; обычно вставляются в программу какиелибо данные , если данных много , то такая запись будет не удобна для читаемости программы или просто громоздко.
|
|
|
|
|
Sep 25 2012, 17:18
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MaxiMuz @ Sep 25 2012, 20:12)  Т.о. Код uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250}; обычно вставляются в программу какиелибо данные , если данных много , то такая запись будет не удобна для читаемости программы Данные можно выделить в отдельный файл, который ничего кроме таблицы не будет содержать - читабельность не пострадает. Цитата(MaxiMuz @ Sep 25 2012, 20:12)  или просто громоздко. Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу.
|
|
|
|
|
Sep 25 2012, 17:31
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MaxiMuz @ Sep 25 2012, 20:22)  Как ? Код #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) программатором зашить - я бы так и сделал).
|
|
|
|
|
Sep 27 2012, 12:15
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
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-файла !! Куда вставлять этот кусок? Вот теперь разбираюсь что к чему.
Сообщение отредактировал MaxiMuz - Sep 27 2012, 12:31
|
|
|
|
|
Sep 29 2012, 12:10
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
с помощью команды Код avr-objcopy --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -I binary -O elf32-avr Glue.bin Glue.o создал обектный файл. Компилирую проект - изменений ни каких ! Что я не так делаю ? Все 3 требуемых обектных файла в папке, Makefile я не изменял , так почему хекс не хочет полнеть ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|