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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> GCC: Как подключить файл-таблицу в ПЗУ
MaxiMuz
сообщение Sep 24 2012, 18:08
Сообщение #1


Местный
***

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



Доброго времяни суток!
Использую GCC 4.3.3. Имеется обьемная таблица , ну к примеру в 16тиричных кодах. Как не вписывая ее в листинг , вживить в код программы. И каким образом получать к ней доступ?
Есть ли такая возможность ?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Sep 24 2012, 18:39
Сообщение #2


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



...в код!? А что оно? Потом программа к нему обращаться будет?


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 24 2012, 18:58
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 24 2012, 19:03
Сообщение #4


Нечётный пользователь.
******

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



Цитата(MaxiMuz @ Sep 24 2012, 21:08) *
к примеру в 16тиричных кодах

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

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Sep 25 2012, 16:56
Сообщение #5


Местный
***

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



Цитата(_Артём_ @ Sep 24 2012, 21:58) *
"В листинг" - это в текст?

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



ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 25 2012, 17:00
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(MaxiMuz @ Sep 25 2012, 19:56) *
С библ-й (avr/pgmspace.h) и функцией pgm_read_byte я знаком. Там ничего полезного не нашел.

Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае?
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Sep 25 2012, 17:12
Сообщение #7


Местный
***

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



Цитата(_Артём_ @ Sep 25 2012, 20:00) *
Разве функция чтения байта-слова по адресу не то, что нужно в вашем случае?
Еще раз.
Т.о.
Код
uint8_t tabl[] PROGMEM={0,1,2,3,4,20,30,100,250};
обычно вставляются в программу какиелибо данные , если данных много , то такая запись будет не удобна для читаемости программы или просто громоздко.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 25 2012, 17:18
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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) *
или просто громоздко.

Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Sep 25 2012, 17:22
Сообщение #9


Местный
***

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



Цитата(_Артём_ @ Sep 25 2012, 20:18) *
Можно таблицу вообще не объявлять как переменную, а обращаться к ней по константному адресу.
Как ?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 25 2012, 17:31
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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) программатором зашить - я бы так и сделал).
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 26 2012, 07:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MaxiMuz @ Sep 25 2012, 20:56) *
ReAl с бинарником более менее понятно, но потом как я понял, данные перемещаются в секцию .data которая копируется в ОЗУ , или я чтото не так понял ?
Прочитайте внимательно статью по ссылке, которую давал ReAL - там написано, как поместить данные не в секцию .data
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 26 2012, 08:58
Сообщение #12


Нечётный пользователь.
******

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



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Sep 27 2012, 12:15
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Sep 29 2012, 12:10
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 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 я не изменял , так почему хекс не хочет полнеть ?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 29 2012, 14:02
Сообщение #15


Нечётный пользователь.
******

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



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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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