Перейти к содержанию
    

GCC: Как подключить файл-таблицу в ПЗУ

Доброго времяни суток!

Использую GCC 4.3.3. Имеется обьемная таблица , ну к примеру в 16тиричных кодах. Как не вписывая ее в листинг , вживить в код программы. И каким образом получать к ней доступ?

Есть ли такая возможность ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется обьемная таблица , ну к примеру в 16тиричных кодах. Как не вписывая ее в листинг , вживить в код программы.

"В листинг" - это в текст?

Зашейте её программатором во flash.

 

И каким образом получать к ней доступ?

Есть ли такая возможность ?

Возможность есть.

В ИАР-е жто было бы так (примерно):

unsigned char _flash * ptr=(unsigned char _flash * )0x1234;
unsigned char A=*ptr;

В AVRGCC для чтения можно использовать pgm_read_byte и тп функции (avr/pgmspace.h).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

к примеру в 16тиричных кодах

Ежели, «к примеру», они бинарные, то можно сразу сгененрировать объектный файл.

 

И мне этот способ так нравится, что, не исключаю, я сначала перегнал бы HEX в BIN тем же srecord-ом, а потом пропустил через objcopy.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"В листинг" - это в текст?

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

С библ-й (avr/pgmspace.h) и функцией pgm_read_byte я знаком. Там ничего полезного не нашел.

 

 

 

ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С библ-й (avr/pgmspace.h) и функцией pgm_read_byte я знаком. Там ничего полезного не нашел.

Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае?
Еще раз.

Т.о.

uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250};

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.о.
uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250};

обычно вставляются в программу какиелибо данные , если данных много , то такая запись будет не удобна для читаемости программы

Данные можно выделить в отдельный файл, который ничего кроме таблицы не будет содержать - читабельность не пострадает.

 

или просто громоздко.

Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу.
Как ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как ?

 

#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) программатором зашить - я бы так и сделал).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?
Прочитайте внимательно статью по ссылке, которую давал ReAL - там написано, как поместить данные не в секцию .data

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?
У objcopy есть ключи для перемещения в другую секцию. Там в примере .rodata, она у ARM полетит во флеш (да у всех контроллеров с единым адреснім пространством должно так быть). Для AVR надо в .progmem.data и потом через pgm_read_*

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с помощью команды

avr-objcopy --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -I binary -O elf32-avr Glue.bin Glue.o

создал обектный файл. Компилирую проект - изменений ни каких ! Что я не так делаю ?

Все 3 требуемых обектных файла в папке, Makefile я не изменял , так почему хекс не хочет полнеть ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю. Это надо смотреть Makefile, что где лежит и т.п.

Показывайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...