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

 
 
 
Reply to this topicStart new topic
> WinAVR: Организация смешенного чтения байтов, слов из таблицы во flash-памяти программ, Есть ли такая возможность ?
MaxiMuz
сообщение Mar 21 2012, 07:53
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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) по порядку читается байты и слова. Но проблема в том, как в записи таблицы корректно указать размер ее содержимого.
Возможно ли вообще такое обращение ?

Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 21 2012, 10:22
Сообщение #2


Гуру
******

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



Все элементы массива должны быть одного типа (не может быть часть элементов массива - байты, а остальные - слова). Такое смешение типов может быть в структурах... Может быть, структура - это то, что Вам нужно?
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Mar 22 2012, 06:15
Сообщение #3


Местный
***

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



цель такой таблицы это простота ее заполнения , а при написании структуры , там писанины получиться много
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 22 2012, 08:37
Сообщение #4


Гуру
******

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



Цитата(MaxiMuz @ Mar 22 2012, 10:15) *
писанины получиться много

Тогда, как вариант - два массива:
1. Массив данных. Типа того, что вы представили, но с типом элементов массива максимально возможного размера (если, как у Вас - байты и слова, то массив слов).
2. Массив типов данных. Каждый элемент этого массива некое число, характеризующее тип соответствующего элемента первого массива. Например: 0 - байт, 1 - слово...

Т.е., из первого массива считываем элемент (для Вашего примера - всегда слово); считываем из второго массива признак типа элемента первого массива; при необходимости производим преобразование типа; что-то с преобразованными данными делаем (Вы не привели информацию об использовании этих данных).
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 22 2012, 09:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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}};

Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Mar 22 2012, 09:47
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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};" ?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 22 2012, 10:15
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 22 2012, 10:37
Сообщение #8


Гуру
******

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



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

Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Mar 22 2012, 11:12
Сообщение #9


Местный
***

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



Цитата(Палыч @ Mar 22 2012, 13:15) *
Так у Вас всегда чередование байт - слово ?!

Ну или слово - байт , разницы особой нет
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:03
Рейтинг@Mail.ru


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