|
|
  |
Массив константа с переменными, Подскажите как реализовать |
|
|
|
Feb 8 2009, 10:04
|

Местный
  
Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792

|
Доброго времени суток!! Есть массив const unsigned char [] = {1,2,3,4,5,6,7,8,9,x,y,z,0,.....,1234}; Массив расположен во флеш памяти. Но вместо x,y,z нужно подставлять свои значения. Хранить в RAM оч. накладно массив большой. Как выйти из такого положения ??? Спасибо. Как вариант, я понимаю что можно узнать номер элемента в месиве и заменять его на переменную уже при передаче его куда то, но может есть более изящный способ.
|
|
|
|
|
Feb 8 2009, 12:34
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Tcom @ Feb 8 2009, 13:04)  Есть массив const unsigned char [] = {1,2,3,4,5,6,7,8,9,x,y,z,0,.....,1234}; Если массив const, то он должен быть инициализирован только константами и быть изменён в процессе выполнения программы не должен (не может если в ПЗУ). Если много свободного EEPROM то туда ему дорога...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 8 2009, 19:44
|

Участник

Группа: Участник
Сообщений: 73
Регистрация: 8-03-08
Из: Украина, Чернигов
Пользователь №: 35 743

|
В EEPROM разместить, если по алгоритму перезапись элементов нужна не часто, если же перезапись этих данных ведется достаточно интенсивно, то как бы у вас срок жизни EEPROM не кончился в течении года-полтора. Во втором случае конечно проще организовать какие то блоки типа if.
--------------------
Думать - мое хобби :)
|
|
|
|
|
Feb 10 2009, 20:55
|

Местный
  
Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792

|
Цитата(demiurg_spb @ Feb 9 2009, 09:14)  А что мешает перенести его в EEPROM? А смысл??? В упрощённом варианте мне нужно менять 10 байт, если угодно, то пусть это будет например результат измерения АЦП. Я передаю по UART(например) шаблон с вставленными результатами. {0x01,0x2,0x3.....0xFF,myvar1,myvar2,myvar3,0xFF} Зная, что [250] и [251] элемент массива должна быть переменной, вот и подставляю с помощью if else. Подстановку нужно делать раз в 10 мс. Причём тут EEPROM??.... Вы меня просто не поняли... может я неправильно изъяснился... тогда сори..
|
|
|
|
|
Feb 10 2009, 21:11
|

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

|
Цитата(Tcom @ Feb 10 2009, 22:55)  Зная, что [250] и [251] элемент массива должна быть переменной, вот и подставляю с помощью if else. Может имеет смысл сделать не один массив, а два? Код {
uart_send(prefix, sizeof(prefix));
uart_send(&Data, sizeof(Data));
uart_send(suffix, sizeof(suffix));
}
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 13 2009, 15:05
|

Местный
  
Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792

|
Цитата(Сергей Борщ @ Feb 10 2009, 19:11)  Может имеет смысл сделать не один массив, а два? Код {
uart_send(prefix, sizeof(prefix));
uart_send(&Data, sizeof(Data));
uart_send(suffix, sizeof(suffix));
} Да согласен, разбить массив на куски проще кучи if elseoв.
|
|
|
|
|
Feb 13 2009, 16:23
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Tcom @ Feb 10 2009, 23:55)  {0x01,0x2,0x3.....0xFF,myvar1,myvar2,myvar3,0xFF} Если нет места для форматного вывода, можно использовать что-нить подобно тому, как это делалось в Паскале Код const unsigned char formatSTR[]="Current parameter %s is %d"; struct { void *stringPTR; int *value; } scratch_pad; В Паскалевском варианте- функция formatstr() передавалась ссылка на форматную строку и на структуру, содержащую указатели на на объекты, значения которых надо выводить. При этом, спецификаторы формата у Вас могут быть попроще(без претензий на универсальность), например @1 @2 - порядковый номер, соответствующий нужному указателю ЗЫ если непонятно изложил, позже пример дам Вот. Выдрал CODE #include <avr/io.h> #include <avr/pgmspace.h> #include <string.h> #include <stdlib.h>
extern unsigned char fmtstr[];
typedef struct { int *field1; int *field2; //...... // int *fieldN; } scratchpad_t;
#define MEMBERS sizeof(scrathcpad_t) / sizeof(field1) typedef union { scratchpad_t formatted; void * uniform[MEMBERS]; } outpad_t;
#define FORMAT_SYMBOL '@' #define INT_WIDTH 10 /*............USAGE.........................*/ void fmtout(unsigned char *str, outpad_t *pad) { unsigned char prev = 0; unsigned char curr = 0; do { curr = pgm_read_byte(str++);if (!curr) break;
if(prev == FORMAT_SYMBOL) { unsigned char sout[INT_WIDTH]; memset(sout,' ',sizeof(sout)); uart_send_str(itoa(*(pad->uniform[(curr - '0')]),sout,10),INT_WIDTH); } else uart_send_char(curr);
prev = curr; } while (curr); return; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|