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

 
 
> WINAVR: pgmspace, eeprom, отражаем актуальные проблемы
_Pasha
сообщение Apr 8 2008, 18:50
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Предлагаю в этой ветке отражать передовые методы работы с pgmspace.h и eeprom.h
Может, потом закрепить тему. Тем более, что видны динамичные изменения в этой области.

Для начала. WINAVR-20071221 + Avr Studio 4.13 sp2 build 571

Делаю большой проект. Выложить не могу. Вкратце суть проблемы.
Использую хедер, в котором сведены вместе все параметры, хранящиеся в EEPROM
paramset.h
Код
#ifndef PARAMSET_H
#define PARAMSET_H 1
EEMEM uint16_t nominal_rpm = 500;
EEMEM uint8_t amplitude = 208;
................... etc
#endif


Хедер включается в разные модули. Их много. Везде константы из еепрома пользуются популярностью smile.gif
И, BTW, надо иметь на выходе файл *.eep для начальной заливки.

Для того, чтобы все работало, приходится объявлять параметры дважды - в основном модуле с инициализацией, а в остальных - как extern, т.е.
Код
#ifndef PARAMSET_H
#define PARAMSET_H 1
#ifdef _IN_MAIN_
EEMEM uint16_t nominal_rpm = 500;
EEMEM uint8_t amplitude = 208;
................... etc
#else
extern EEMEM uint16_t nominal_rpm;
extern EEMEM uint8_t amplitude;
................... etc
#endif

#endif


Потом, в основной программе
Код
#define _IN_MAIN_ 1
#include "paramset.h"


Иначе - чушь в распределении адресов.
Как избежать двойного объявления переменных в приведенном примере, ессно, без использования макросов?
Возможно ли это вообще?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 8 2008, 19:16
Сообщение #2


Гуру
******

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



Цитата(_Pasha @ Apr 8 2008, 21:50) *
Как избежать двойного объявления переменных в приведенном примере, ессно, без использования макросов?
Возможно ли это вообще?
Объединить их в структуру:
Код
config.h:
#ifndef CONFIG_H__
#define CONFIG_H__
#include    <stdint.h>
#include    <avr/eeprom.h>

struct cfg_t
{
    uint16_t    Channel_Code;
    uint16_t    Tx_Period;
    uint8_t     Tx_Repeats;
    uint16_t    Cycle_Len;
    uint16_t    Cycle_Pos;
    uint8_t     Sec_TimeSlot;
}__attribute__((__packed__,__aligned__(1)));

extern EEMEM cfg_t Config_ee;
#endif  // CONFIG_H__

config.c:
#include    "config.h"

EEMEM cfg_t Config_ee =
{
   1,
   2,
   3,
   4,
};


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 22:35
Рейтинг@Mail.ru


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