编程技巧之如何让一份代码多适应底层硬件
来源:互联网 发布:淘宝怎样装修店铺 编辑:程序博客网 时间: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;
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
#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);
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
}
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
}
{
#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);
}
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
- 编程技巧之如何让一份代码多适应底层硬件
- 如何让测试代码适应多个版本
- 如何让不同的HTML代码适应不同的浏览器
- 如何阅读一份代码?
- 硬件以及编程的一些底层概念
- 让图片适应屏幕大小[原创代码]
- 如何让iframe自动适应内容高度
- 如何让网页适应不同分辨率
- SEO如何让蜘蛛适应你
- 如何让android app适应不同分辨率
- 如何让iframe自动适应内容高度
- 如何从零开始写一份标准的TensorFlow代码(面向小白编程)
- 底层网络编程代码总结
- 如何让图片居中显示。让图片只适应居中。
- 让网页版面自动适应屏幕分辨率的技巧
- 让网页版面自动适应屏幕分辨率的技巧
- 坚持编程:如何找到一份工程师工作
- 坚持编程:如何找到一份工程师工作
- Java强引用、 软引用、 弱引用、虚引用
- Android布局优化之Merge Include ViewStub使用与源码分析
- Codeforces 368B
- android-Implementing Effective Navigation,Creating Swipe Views with Tabs
- C#中DataTable排序、检索、合并等操作实例
- 编程技巧之如何让一份代码多适应底层硬件
- android 常用action和category
- Linux中Mysql的卸载方法
- 全排列问题
- 下一代超大规模软件定义网络技术实践
- PHP中ob系列函数整理
- fedora下编译运行java傻瓜入门级教程
- 网络遇到“QQ能登录但是不能打开浏览器”的问题
- nyoj--127--星际之门(一)(生成树的数量)