嵌入式系统通用驱动程序接口及其实现-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
相关文章推荐
- fastjson处理接口时的一个问题
- 局域网与广域网接口标准
- RJ-45接口信号定义
- DVI 视频接口图文解析
- C#通用邮件发送类分享
- C#、ASP.NET通用扩展工具类之TypeParse
- 如何设置域名接口
- 通过C#实现自动售货机接口
- vbs之自动安装驱动程序
- C#中IEnumerable接口用法实例分析
- C#中实现判断某个类是否实现了某个接口
- C#、ASP.NET通用扩展工具类之LogicSugar
- C#隐式/显示实现接口方法详解
- C#实现两接口中同名方法实例分析
- 详解C#中的接口属性以及属性访问器的访问限制
- C#中的ICustomFormatter及IFormatProvider接口用法揭秘
- C#接口实现方法实例分析
- 基于C# 中可以new一个接口?的问题分析
- C#抽象类和接口的区别分析
- 最新的 for Vista RTM 驱动程序