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

 
 
> Как разместить массив структур во флеш памяти (WinAVR)?
smac
сообщение Feb 17 2009, 19:22
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Доброго времени суток, дамы и господа!
Есть такой вопрос: как разместить массив структур приведенный ниже во флеш памяти микроконтроллера (например ATMega32) с помощью компилятора WinAVR 20081205, желательно так, чтобы обеспечить удобную работу с этим массивом?
Код
    struct at_cmd cmd_set[]={
                                   {"A/",         cmd_a_},
                                   {"AT",         cmd_at},
                                   {"ATA",     cmd_ata},
                                   {"ATB",        cmd_atb},
                                   {"ATC",        cmd_atc},
                                   {"ATD",        cmd_atd}
                               };

Начал изучать С (пока читаю K&R и параллельно пробую применить к AVR, иногда заглядывая в документацию компилятора) хотелось бы узнать как правильно решить приведенную задачу.
Попытался проделать самостоятельно получилось вот так.
CODE
/* Ниже приведена попытка заменить приведенный массив структур массивом
структур, расположенным во флеш памяти*/
#include <avr/io.h>
#include <avr/pgmspace.h>

const char a__mnem[] PROGMEM = "A/"; // Записываем во флеш мнемоники команд
const char at_mnem[] PROGMEM = "AT";
const char ata_mnem[] PROGMEM = "ATA";
const char atb_mnem[] PROGMEM = "ATB";
const char atc_mnem[] PROGMEM = "ATC";
const char atd_mnem[] PROGMEM = "ATD";


int cmd_a_ (char*param); // Объявляем функции-обработчики команд
int cmd_at (char*param);
int cmd_ata (char*param);
int cmd_atb (char*param);
int cmd_atc (char*param);
int cmd_atd (char*param);

struct at_cmd{ PGM_P cmd_mnem;
int (*cmd_func)(char *);}; // Объявляем вид структуры at_cmd

struct at_cmd cmd_set [] PROGMEM ={ // Записываем во флеш массив структур at_cmd
{a__mnem, cmd_a_},
{at_mnem, cmd_at},
{ata_mnem, cmd_ata},
{atb_mnem, cmd_atb},
{atc_mnem, cmd_atc},
{atd_mnem, cmd_atd},
};


int main(void) // Пример работы (гипотетический)
{
struct at_cmd temp_cmd; // объявляем структуру с которой будем работать (буфер для 1 элемента
// массива структур расположенного во флеш памяти)
char i,s, par[8];
for (i=0; i<(sizeof(cmd_set)/sizeof(cmd_set[0]));i++){
memcpy_P(&temp_cmd, &cmd_set[i], sizeof(cmd_set[0])); // Копируем структуру из массива ( во флеш памяти) во временную
s=pgm_read_byte(temp_cmd.cmd_mnem); // Читаем первый символ мне моники коман ды
(*temp_cmd.cmd_func)(&par[0]); // Вызываем функцию-обработчик команды
}

return 0;
}

int cmd_a_ (char*param){ // функции-обработчики (тоже гипотетические)
return 10;
}

int cmd_at (char*param){
return 20;
}

int cmd_ata (char*param){
return 30;
}

int cmd_atb (char*param){
return 40;
}
int cmd_atc (char*param){
return 50;
}
int cmd_atd (char*param){
return 60;
}

Уверен, что полученное решение криво и неэлегантно, поэтому прошу подсказать знающих как оно должно быть на самом деле.

Сообщение отредактировал smac - Feb 17 2009, 19:23
Go to the top of the page
 
+Quote Post



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

 


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


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