您的位置:首页 > 其它

嵌入式系统通用驱动程序接口及其实现-EERPOM存取位置标准化(视频教学时的同步输入文件)

2016-06-17 22:03 591 查看

嵌入式系统通用驱动程序接口及其实现-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息