|
|
  |
WinAVR: Организация смешенного чтения байтов, слов из таблицы во flash-памяти программ, Есть ли такая возможность ? |
|
|
|
Mar 21 2012, 07:53
|

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

|
Таблица представляет из себя чтото типа: Код uint8_t tabl[] PROGMEM={0x00,0x12ff,0x02,0x0100,0x40,0x0020,0x3f,0x1000}; чередование целых байтов и слов. Задается указатель на начало таблицы и затем с помощью команды pgm_read_byte (Ptabl) или pgm_read_word (Ptabl) по порядку читается байты и слова. Но проблема в том, как в записи таблицы корректно указать размер ее содержимого. Возможно ли вообще такое обращение ?
|
|
|
|
|
Mar 22 2012, 08:37
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(MaxiMuz @ Mar 22 2012, 10:15)  писанины получиться много Тогда, как вариант - два массива: 1. Массив данных. Типа того, что вы представили, но с типом элементов массива максимально возможного размера (если, как у Вас - байты и слова, то массив слов). 2. Массив типов данных. Каждый элемент этого массива некое число, характеризующее тип соответствующего элемента первого массива. Например: 0 - байт, 1 - слово... Т.е., из первого массива считываем элемент (для Вашего примера - всегда слово); считываем из второго массива признак типа элемента первого массива; при необходимости производим преобразование типа; что-то с преобразованными данными делаем (Вы не привели информацию об использовании этих данных).
|
|
|
|
|
Mar 22 2012, 09:10
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(MaxiMuz @ Mar 22 2012, 10:15)  цель такой таблицы это простота ее заполнения , а при написании структуры , там писанины получиться много Цель любой таблицы - это что бы ее корректно понял компилятор С. В вашем случае он ее поймет, но результат будет не тот, который вы ожидаете. Ваша таблица будет обрезанна до такой: Код uint8_t tabl[] PROGMEM={0x00,0xff,0x02,0x00,0x40,0x20,0x3f,0x00}; и вся будет байтовая. Так что пишите структуру: Код #pragma pack(1) typedef struct { uint8_t byte; unit16_t word; } MyStruct;
MyStruct tabl[] PROGMEM={{0x00,0x12ff},{0x02,0x0100},{0x40,0x0020},{0x3f,0x1000}};
|
|
|
|
|
Mar 22 2012, 09:47
|

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

|
Цитата(Палыч @ Mar 22 2012, 11:37)  ................. Т.е., из первого массива считываем элемент (для Вашего примера - всегда слово); считываем из второго массива признак типа элемента первого массива; при необходимости производим преобразование типа; что-то с преобразованными данными делаем (Вы не привели информацию об использовании этих данных). я не понял что это должно из себя представлять. Смысл в том что в прерывании каждый раз будет считываться в размере байта - тон цвета , слово - задержка. И так каждый вызов. Две таблицы писать неразумно. Уже подумал написать преобразователь таблиц : пишем попорядку байт, слово , на выходе в тестовом виде все байты. Вставляем в программу и дальше дело техники .. Цитата(XVR @ Mar 22 2012, 12:10)  Так что пишите структуру: Код #pragma pack(1) typedef struct { uint8_t byte; unit16_t word; } MyStruct;
MyStruct tabl[] PROGMEM={{0x00,0x12ff},{0x02,0x0100},{0x40,0x0020},{0x3f,0x1000}}; а возможно написание без промежуточных скобок: " {0x00,0x12ff,0x02,0x0100,0x40,0x0020,0x3f,0x1000};" ?
|
|
|
|
|
Mar 22 2012, 10:15
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(MaxiMuz @ Mar 22 2012, 13:47)  будет считываться в размере байта - тон цвета , слово - задержка... Так у Вас всегда чередование байт - слово ?! Тогда всё проще Код uint16_t tabl[] PROGMEM={0x00,0x12ff, 0x02,0x0100, 0x40,0x0020, 0x3f,0x1000}; uint16_t * Ptabl; ...... Ptabl= tabl; ...... color= (uint8_t)pgm_read_word (Ptabl); ++Ptabl; time= pgm_read_word (Ptabl); ++Ptabl;
|
|
|
|
|
Mar 22 2012, 10:37
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(MaxiMuz @ Mar 22 2012, 13:47)  а возможно написание без промежуточных скобок: "{0x00,0x12ff,0x02,0x0100,0x40,0x0020,0x3f,0x1000};" ? Да, но некоторые компиляторы будут на это выдавать warning'и
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|