嵌入式系统通用驱动程序接口及其实现-EERPOM存取位置标准化
存储单元 结构
保存永久性数据 每次读 写位置 要一致 才能恢复
- flash 程序存储器宽间
- RAM 空间
- EEPROM空间 由我们决定的。
编译器所决定的
LED控制器
LedCtrler.h:
struct _LedCtrlerInfo{
unsigned char DispMode,
unsigned char FlashCount
unsigned char OnCount;
unsigned char OfCount;
.
.
.
.
};
Struct _LedCtrler{
struct _LedCtrlerInfo Info;
unsigend char a;
unsigned char b;
.
.
.
};
Sen.h //亮度传感器模块:
struct _SenInfo{
unsigned short Zero;
unsigned short Gain;
};
struct _Sen{
struct _SenInfo Info;
unsigend char a;
unsigned char b;
.
.
.
};
传统做法: InfoBase.h
//EEPROM初始化标志
#define INFO_BASE_INIT_FLAG_ADR 0x0000
#define INFO_BASE_INIT_FLAG_LEN 1
//应用相关:LED_CTRLER_INFO
#define INFO_BASE_LED_CTRLER_INFO_ADR (INFO_BASE_INIT_FLAG_ADR + INFO_BASE_INIT_FLAG_LEN)
#define INFO_BASE_LED_CTRLER_INFO_LEN 8
//应用相关:SEN_INFO
#define INFO_BASE_SEN_INFO_ADR (INFO_BASE_LED_CTRLER_INFO_ADR + INFO_BASE_LED_CTRLER_INFO_LEN)
#define INFO_BASE_SEN_INFO_LEN 8
.
.
换一种思路,解决这个问题:
- 并不关心,放在那个位置,需要的的:从那儿写,从那儿读回来
能否让编译器像flash RAM一样,让系统帮我们分配:固定
define struct_offset(type, member)
unsigned long Adr = struct_offset(struct _LedCtrlerInfo, OnCount);
//编译器结果: Adr = 2;
*struct_offset 原理:
typedef struct _type{
member0; //0位置
member1; //1位置
.
.
.
memberN;
}type;
type A; //flash分配空间(自动) 0X50
type *a = &A; //a = 0x50;
a->member1 = ?? //&a->member1 地址 0x51
unsigend char memberOffset = (char*)(&a->member1)- (char*)a = 0x51 - 0x50;
#define struct_offset(type,member) \
(unsigned int)(&(((type) *)0)->(member)))
Infobase_LedCtrler_V100.h 实现:
//整个EEProm空间
struct _LedCtrlerInfo_Ini{
unsigned char Reversed[8];
}
struct _SenInfo_Ini{
unsigned char Reversed[8];
}
typedef struct _InfoBase{
unsigned char InitFlag;
struct _LedCtrlerInfo_Ini LedCtrlerInfo; //4存储空间 ->预留8个空间
struct _SenInfo_ini SenInfo; //4个空间
}InfoBase_t;
#define InfoBase_GetLedCtrlerInfo() struct_offset(InfoBase_t, LedCtrlerInfo);
#define InfoBase_GetSenInfo() struct_offset(InfoBase_t,SenInfo);
Infobase_LedCtrler_V200.h 实现:
略
Infobase.h实现:
#ifdef HW_V100
#inlude “Infobase_LedCtrler_V100.h”
#endif
#ifdef HW_V200
#inlude "Infobase_LedCtrler_V200.h"
#endif
4778





