基于相互关联的数据结构的技巧定义

2010-9-4 17:39 1087 0 分类: MCU/ 嵌入式

 最近在开发项目中,涉及到多维相关联常量表。基于传统的直接的方法就是多维常量表。


比如我们定义多维的向量表:


/* (name, mask, code, persistence, sympt, enlamp, fault_type */


XX_TAB[]={


   "A1_NUMB", 0X0001, 0X9567,DTC_FAIL, SYSTEMFAIL, LAMP_ON,SYS_TYPE,


  "A2_NUMB",0X00020,0X9568,DTC_SYSFAIL,SYSTEMSENSORFAIL,LAMP_ON,SENSOR_TYPE,


  "A3_NUMB",0X0040,0X9578,DTC_LRSENSOR,SYSSENSORFAIL,LAMP_ON,SENSOR_TYPE


 };


 


这里笔者发现一种简洁的构造表达的方法:


我们分三步来实现表达:



1。先建立 一个列表文件:FL_list.h


/****************************************************************************


 * File        : FL_list.h


 * Project     : 


 * Description  :   Fault Enum, code and mask defined.


 * Copyright   :


 ***************************************************************************/ 


 


 #ifdef FAULT_ENUM


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)   \


                                                                                                                       name##_ENUM,


 #endif 


 #ifdef FAULT_MASK


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)    \


                                                                                                                       (unsigned long)mask,


 #endif


 #ifdef FAULT_CODE


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)    \


                                                                                                                       (unsigned short)code,


 #endif


 #ifdef FAULT_RETAIN


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)     \


                                                                                                                       (unsigned char)persistence,


 #endif


 #ifdef FAULT_SYMPT


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)     \


                                                                                                                       (unsigned char)sympt,


 #endif


  #ifdef FAULT_ENLAMP


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)      \


                                                                                                                       (unsigned char)enlamp,


 #endif


 #ifdef FAULT_TYPE


  #define FAULT(name, mask, code, persistence, sympt, enlamp, fault_type)      \


                                                                                                                       (unsigned char)fault_type,


 #endif


 


 


 


 


 /*1*/FAULT( BATTERY_LOW,  0x00000002, 0x5406, DTC_NOT_PERSISTENT, DTC_BELOW_MIN_THRESHOLD,     DTC_TPMS_LAMP_ON, FLT_SYS                                  )


 /*2*/FAULT( BATTERY_HIGH,     0x00000004, 0x5407, DTC_NOT_PERSISTENT, DTC_ABOVE_MAX_THRESHOLD, DTC_TPMS_LAMP_ON, FLT_SYS                                  )


 /*3*/FAULT( SELF_CHECK,  0x00000008, 0x5800, DTC_NOT_PERSISTENT, DTC_INVALID_SIGNAL, DTC_TPMS_LAMP_ON, FLT_SYS                                )


 /*4*/FAULT( SENSOR_NOT_CALIBRATED,    0x00000010, 0x5802, DTC_NOT_PERSISTENT, DTC_INVALID_SIGNAL, DTC_TPMS_LAMP_ON, FLT_SYS      )


 /*5*/FAULT( EEPROM_CHECKSUM_FAILURE, 0x00000010, 0x5801, DTC_NOT_PERSISTENT, DTC_INVALID_SIGNAL, DTC_TPMS_LAMP_ON, FLT_SYS                                  )


 


 /*6*/FAULT( SENSOR_FL_BATTERY_LOW,  0x00010000, 0x5807, DTC_PERSISTENT, DTC_BELOW_MIN_THRESHOLD, DTC_TPMS_LAMP_ON, FLT_FL_SENSOR         )


 /*7*/FAULT( SENSOR_FR_BATTERY_LOW,  0x00010000, 0x5808, DTC_PERSISTENT, DTC_BELOW_MIN_THRESHOLD, DTC_TPMS_LAMP_ON, FLT_FR_SENSOR         )


 /*8*/FAULT( SENSOR_RL_BATTERY_LOW,  0x00010000, 0x5809, DTC_PERSISTENT, DTC_BELOW_MIN_THRESHOLD, DTC_TPMS_LAMP_ON, FLT_RL_SENSOR         )


 /*9*/FAULT( SENSOR_RR_BATTERY_LOW,  0x00010000, 0x5810, DTC_PERSISTENT, DTC_BELOW_MIN_THRESHOLD, DTC_TPMS_LAMP_ON, FLT_RR_SENSOR        )


 


 /*10*/FAULT( SENSOR_FL_NOT_TRANSMITTING, 0x00020000, 0x5803, DTC_PERSISTENT, DTC_NOT_TRANSMITTING, DTC_TPMS_LAMP_ON, FLT_FL_SENSOR         )


 /*11*/FAULT( SENSOR_FR_NOT_TRANSMITTING, 0x00020000, 0x5804, DTC_PERSISTENT, DTC_NOT_TRANSMITTING, DTC_TPMS_LAMP_ON, FLT_FR_SENSOR         )


 /*12*/FAULT( SENSOR_RL_NOT_TRANSMITTING, 0x00020000, 0x5805, DTC_PERSISTENT, DTC_NOT_TRANSMITTING, DTC_TPMS_LAMP_ON, FLT_RL_SENSOR         )


 /*13*/FAULT( SENSOR_RR_NOT_TRANSMITTING, 0x00020000, 0x5806, DTC_PERSISTENT, DTC_NOT_TRANSMITTING, DTC_TPMS_LAMP_ON, FLT_RR_SENSOR        )


 


 


 


 #undef FAULT /*(name, mask, code, persistence, sympt, enlamp, fault_type) 


 #undef FAULT_ENUM


 #undef FAULT_MASK


 #undef FAULT_CODE


 #undef FAULT_RETAIN


 #undef FAULT_SYMPT


 #undef FAULT_ENLAMP


 #undef FAULT_TYPE


 


/******************************End of File**********************************/


 


2。 头文件定义引用的常量


  在另外的头文件内,这样定义引用


使用一个采用符号的枚举变量来定位索引,便于后面的数据结构的定位:


typedef enum
{
   #define   FAULT_ENUM
   #include "FL_list.h"
} T_FAULT;


这里通过采用枚举变量类型定义,多维数组通过常量变量实现了数组的偏移定位,同时达到名字易于理解的目的。


 


3。 原代码内定义常量数组


#define NUMBER_OF_DTC      13


 


 static const uint32 FLT_u32MaskArray [NUMBER_OF_DTC] =
{
   #define   FAULT_MASK
   #include "fault_list.h"
};


static const uint8 FLT_u8FaultType [NUMBER_OF_DTC] =
{
   #define   FAULT_TYPE
   #include "fault_list.h"
};


 


const uint8 FLT_u8Persistence [NUMBER_OF_DTC] =


{


   #define   FAULT_RETAIN


   #include "fault_list.h"


};


 


const uint8 FLT_u8Symptom [NUMBER_OF_DTC] =


{


   #define   FAULT_SYMPT


   #include "fault_list.h"


};


 


const uint8 FLT_u8EnLamp [NUMBER_OF_DTC] =


{


   #define   FAULT_ENLAMP


   #include "fault_list.h"


};


 


这里,可以看到我们通过T_FAULT 枚举常量,可以定位后面的 FLT_u32MaskArray ,FLT_u8FaultType 等常量。


程序的引用采用与实际表示的对象对应。简单,明了。



 

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
taurus3g_834678180 2012-05-30 22:47
经常访问的嵌入式网页荟萃
WEB LEVEL         |        COMMENT A                             | AA-                        ...
taurus3g_834678180 2012-03-25 13:21
汽车电子 行业的BOOTLOADER 技术解析
随着开发周期的日益缩短,软件开发的方式逐渐转变为动态更新,从而使得汽车电子模块使得顺应时代的潮流。目的: 1) 产品开发周期中,某一阶段需要释放对应的功能需要。 2)应对产品售后阶段,产品...
taurus3g_834678180 2012-03-23 08:48
【博客大赛】CANBUS 物理信号的测试?
最近,在一个项目测试中,测试工程师提交一个ISSUE. 发现CANBU S 的物理信号 不服规范。   介绍: 速率:125KHZ. CAN Transceiver: TJA104...
taurus3g_834678180 2012-03-23 08:43
汽车零部件的可靠性的反思 (二)
失效分析的三步骤 1. 寻找根源 2. 分析问题 3. 制定措施         samon在一家知名的汽车电子零部件公司做产品设计开发。最近他开发的部件收到客户的失效反馈。客户返...
taurus3g_834678180 2012-03-22 19:23
TPMS --不带LFI 的自动定位技术疑问?
最近一个接到一个GLOBAL 的项目,要求不带LFI 的TPMS 系统,实现轮胎的自动定位。 和同事们沟通后,得出需要借用整车的一些其他传感器信息才可以达到,当前TPMS SENSOR 本身要...
taurus3g_834678180 2012-02-26 23:03
转发--关于王立军--一个才女的文章
  一点愚见只为军  (一)  本人一介女流,素来相夫教子,对政治本无半点兴趣,前日忽闻立军之事,却心中不免阵痛。往日不论贪官下马还是清官提升,都觉与我一介布衣无关,自觉愚钝不敢妄论国事,...
我要评论
0
0
广告