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

来源:互联网 发布:淘宝我要日报在哪 编辑:程序博客网 时间:2024/06/07 06:18

嵌入式系统通用驱动程序接口及其实现-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
0 0
原创粉丝点击