编程技巧之如何让一份代码多适应底层硬件

来源:互联网 发布:淘宝怎样装修店铺 编辑:程序博客网 时间:2024/06/06 09:17

命题来源,假设需要写一个通用底层代码,他可以出来只有一个channel的数据,可以处理多个channel的数据。

PS:这份代码最大的价值在于可以最后用到配置生成代码上。


1. 首先定义enable/disable多通道的宏。

/* Multi-channel enable or disable macro definition */
#define ENABLE_MULTI_CHANNEL  
/* or */
#define DISABLE_MULTI_CHANNEL

注意:这里的宏在真正代码中有且只有一个。

2. 定义channel的type以及变量

/* Channel typedef  */
typedef unsigned char tChannel;
/* Current avaiable channel */
tChannel uChannelNum;


3. 定义区分多通道和单通道的宏

/* Macro used for function's parameter or decale a local variable */
#ifdef (DISABLE_MULTI_CHANNEL)
#define CHANNEL_TYPE_ONLY void
#define CHANNEL_TYPE_FIRST
#define CHANNEL_TYPE_DECALE
#define CHANNEL_PARAM_ONLY  
#define CHANNEL_PARAM_FIRST
#define CHANNEL_PARAM_DECALE    
#else
#define CHANNEL_TYPE_ONLY tChannel uChannelNum
#define CHANNEL_TYPE_FIRST tChannel uChannelNum,
#define CHANNEL_TYPE_DECALE tChannel uChannelNum;
#define CHANNEL_PARAM_ONLY   uChannelNum
#define CHANNEL_PARAM_FIRST uChannelNum,
#define CHANNEL_PARAM_DECALE    uChannelNum;
#endif



4. 实现具体的处理函数

4.1 申明处理函数
/* Decale functions */
void channel_proc1(CHANNEL_TYPE_ONLY);
void channel_proc2(CHANNEL_TYPE_FIRST unsigned int data);

4.2 函数实现
channel_proc1()的实现如下:
/* function implementions */
void channel_proc1(CHANNEL_TYPE_ONLY){
#ifdef DISABLE_MULTI_CHANNEL
//Process do not need depended on channel number 
#else
if(0 == uChannelNum){
// Process channel_1
}else if(1 == uChannelNum){
// Process channe_2
}else{
// Invalid channel
}
#endif
}
根据当前是Multi-channel或不是,分别做不同的处理,参考CHANNEL_TYPE_ONLY的定义可知,是Multi-channel的时候,传入的参数为tChannel uChannelNum,而如果是单channel,则为void

channel_proc2()的实现如下:
void channel_proc2(CHANNEL_TYPE_FIRST unsigned int data)
{
#ifdef DISABLE_MULTI_CHANNEL
static unsigned int backup;
#else
static unsigned int backup[2];
#endif


#ifdef DISABLE_MULTI_CHANNEL
// Process do not need depended on channel number
backup = data;
#else
if( (0 <= uChannelNum) || (uChannelNum < 2))
{
backup[uChannelNum] = data;
}
#endif
}
我们假设其功能即为保存channel的数据到backup区域。因为是举例,所以这里的backup[2]是用的魔法数字,真正的工程中,通道数应该可配置的。

5. 使用

写一个main函数,来看看应该如何使用这两个函数,示例代码如下:

/* How to used them? */
void main(void){
unsigned int data = 0x02; /* Application data for channel */
CHANNEL_PARAM_DECALE


/* called proc1 */
channel_proc1(CHANNEL_PARAM_ONLY);


/* called proc2 */
channel_proc2(CHANNEL_PARAM_FIRST data);
}







0 0
原创粉丝点击