|
Проблемы перевода программы из IAR в WinAVR. |
|
|
|
Nov 19 2007, 09:03
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Проблема размещения массивов. Есть такой текст в IAR, работает:
typedef struct FONT_DEF { unsigned char *au8FontTable; /* Font table start address in memory */ } FONT_DEF;
__flash unsigned char Font_1[] = { 7, 8, 0, 255 0x00,0x00,0x00,0x00,0x00,0x00,0x00, …………………………………………….. 0x98,0x64,0x24,0x24,0xFC,0x00,0x00 };
__flash unsigned char Font_2[] = { 5, 6, 32, 59 0x00,0x00,0x00,0x00,0x00, ……………………………………… 0x24,0x1A,0x0A,0x3E,0x00 };
struct const FONT_DEF Font_TAB[] = { { Font_1 }, { Font_2 } };
Перевожу его в WinAVR, получается так:
typedef struct FONT_DEF { unsigned char *au8FontTable; /* Font table start address in memory */ } FONT_DEF;
unsigned char Font_1[] __attribute__((__progmem__)) = { 7, 8, 0, 255 0x00,0x00,0x00,0x00,0x00,0x00,0x00, …………………………………………….. 0x98,0x64,0x24,0x24,0xFC,0x00,0x00 };
unsigned char Font_2[] __attribute__((__progmem__)) = { 5, 6, 32, 59 0x00,0x00,0x00,0x00,0x00, ……………………………………… 0x24,0x1A,0x0A,0x3E,0x00 };
struct FONT_DEF Font_TAB[] = { { Font_1 }, { Font_2 } };
Компилится, но не работает. В отладчики видно, что адреса рассчитываются не правильно. Реальный адрес массива Font_1 в progmem 0x2A, а в структуре Font_TAB он 0x54. Откуда такое смещение? Может я не правильно атрибуты задаю? Помогите разобраться.
|
|
|
|
|
 |
Ответов
|
Nov 19 2007, 12:28
|

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

|
Цитата(Oleg_IT @ Nov 19 2007, 11:03)  Есть такой текст в IAR, работает: Совершенно непонятно как оно у вас работает в IAR. Вы указатель на ОЗУ инициализируете адресом объекта, находящегося во флеш. Если бы было unsigned char __flash *au8FontTable; то работало бы. В WinAVR есть файл pgmspace.h, он описан в документации на avr-libc. Там определен атрибут PROGMEM, чем-то похожий на __flash ИАРа. Вам надо использовать определенный там тип prog_char и функцию pgm_read_byte(). Увы, непосредственно запись var = *pgm_ptr не работает, вместо чтения из флеш генерится чтение из ОЗУ по тому же адресу, но самое неприятное - не генерится сообщения об ошибке или хотя бы предупреждения. Так что будьте внимательны.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 19 2007, 13:44
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Цитата(Сергей Борщ @ Nov 19 2007, 15:28)  Совершенно непонятно как оно у вас работает в IAR. Вы указатель на ОЗУ инициализируете адресом объекта, находящегося во флеш. Если бы было unsigned char __flash *au8FontTable; то работало бы. В WinAVR есть файл pgmspace.h, он описан в документации на avr-libc. Там определен атрибут PROGMEM, чем-то похожий на __flash ИАРа. Вам надо использовать определенный там тип prog_char и функцию pgm_read_byte(). Увы, непосредственно запись var = *pgm_ptr не работает, вместо чтения из флеш генерится чтение из ОЗУ по тому же адресу, но самое неприятное - не генерится сообщения об ошибке или хотя бы предупреждения. Так что будьте внимательны. В IAR, как не странно работает, и правильно. Можно пример дать, как в WinAVR задавать массив массивов, которые находятся в памяти кода. Атрибут __progmem__ у меня стоит, и в отладчике я вижу этот массив во флеше (надеюсь отладчик правильно показывает). А компилятор, в IAR так, не знаю как в GCC, разбирается какая переменная в какой памяти расположена и генерит соответствующий код. Вопрос то мой не в доступе к памяти, а в смещении. Программа считывает правильно, но не по тому адресу!
|
|
|
|
Сообщений в этой теме
Oleg_IT Проблемы перевода программы из IAR в WinAVR. Nov 19 2007, 09:03 KRS Цитата(Oleg_IT @ Nov 19 2007, 12:03) Комп... Nov 19 2007, 09:55 Oleg_IT Цитата(KRS @ Nov 19 2007, 12:55) Так у ат... Nov 19 2007, 11:34 GDI Может ничего и не надо тут делать и затык не в адр... Nov 19 2007, 12:21  Сергей Борщ Цитата(Oleg_IT @ Nov 19 2007, 15:44) В IA... Nov 19 2007, 16:01   Oleg_IT Цитата(Сергей Борщ @ Nov 19 2007, 19:01) ... Nov 20 2007, 09:41 bloodden Я с таким сталкивался. Указатель действительно ука... Nov 19 2007, 13:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|