Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Массив константа с переменными
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Tcom
Доброго времени суток!!
Есть массив const unsigned char [] = {1,2,3,4,5,6,7,8,9,x,y,z,0,.....,1234};
Массив расположен во флеш памяти.
Но вместо x,y,z нужно подставлять свои значения.
Хранить в RAM оч. накладно массив большой.
Как выйти из такого положения ???
Спасибо.
Как вариант, я понимаю что можно узнать номер элемента в месиве и заменять его на переменную уже при передаче его куда то, но может есть более изящный способ.
demiurg_spb
Цитата(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 то туда ему дорога...
taurus
В EEPROM разместить, если по алгоритму перезапись элементов нужна не часто, если же перезапись этих данных ведется достаточно интенсивно, то как бы у вас срок жизни EEPROM не кончился в течении года-полтора. Во втором случае конечно проще организовать какие то блоки типа if.
Tcom
Ясно, данные подставлять буд на лету. EEPROM тут не причём массив залит в флеш.
demiurg_spb
А что мешает перенести его в EEPROM?
Скорость доступа к нему конечно снизится, но зато можно будет менять его конфигурацию.
Еще можно сделать несколько массивов с разными конфигурациями, если много ПЗУ и если мало конфигураций.
Tcom
Цитата(demiurg_spb @ Feb 9 2009, 09:14) *
А что мешает перенести его в EEPROM?

А смысл??? В упрощённом варианте мне нужно менять 10 байт, если угодно, то пусть это будет например результат измерения АЦП.
Я передаю по UART(например) шаблон с вставленными результатами.

{0x01,0x2,0x3.....0xFF,myvar1,myvar2,myvar3,0xFF}

Зная, что [250] и [251] элемент массива должна быть переменной, вот и подставляю с помощью if else.

Подстановку нужно делать раз в 10 мс.

Причём тут EEPROM??.... Вы меня просто не поняли... может я неправильно изъяснился... тогда сори..
Сергей Борщ
Цитата(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));

}
Tcom
Цитата(Сергей Борщ @ Feb 10 2009, 19:11) *
Может имеет смысл сделать не один массив, а два?
Код
{

    uart_send(prefix, sizeof(prefix));

    uart_send(&Data, sizeof(Data));

    uart_send(suffix, sizeof(suffix));

}


Да согласен, разбить массив на куски проще кучи if elseoв.
_Pasha
Цитата(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;
}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.