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

嵌入式系统通用驱动程序接口及其实现-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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值