此实例代码旨在提供一种处理类似事务时的一种函数映射关系。
函数功能不同,但函数结构一样,通过数组和结构体进行函数功能的映射,在函数体内处理数据,实现对变量的赋值,通过函数指针调用函数,因为结构类似可以用for循环遍历所有映射函数。
当修改功能时,只需要修改函数,映射结构不用改变,为代码的维护提供了很大的方便。
1)实现代码
下面代码模拟下AD通道采样,转换的映射调用方式,只是模拟,没有实际的应用价值,大家根据需要进行修改就可以移植到自己的工程中去了。
下面代码重要的是结构和思路,很有必要学习下哈,。
#include <stdio.h>
#include <stdlib.h>
#define uint32_t unsigned int
/* 此宏的顺序要与结构RawToVal_Map_t中变量顺序一一对应,不然会报错 */
#define VAL_SWAP(Ch, Convert) { &(Ch.wRawInValue), Convert, &(Ch.dwInValue) }
// 函数声明
void AD_CH1(uint32_t *pRawValue, uint32_t *pValue);
void AD_CH2(uint32_t *pRawValue, uint32_t *pValue);
void AD_CH3(uint32_t *pRawValue, uint32_t *pValue);
void AD_CH4(uint32_t *pRawValue, uint32_t *pValue);
typedef struct _AD_Ch_t
{
uint32_t dwInValue; // 转换值
uint32_t wRawInValue; // 原始值
} AD_Ch_t;
// 定义不同通道数据的结构变量
AD_Ch_t in_AD_1,in_AD_2,in_AD_3,in_AD_4;
// 定义函数指针
typedef void (*RawToVal_t)(uint32_t *pRawValue, uint32_t *pValue);
// 数组数据对应的映射结构
typedef struct _RawToVal_Map_t
{
uint32_t *pRawValue;
RawToVal_t RawToVal;
uint32_t *pValue;
} RawToVal_Map_t;
/* 数据映射数组 */
RawToVal_Map_t MapArray[2][2] =
{ // 下面映射一一对应,可以根据需要进行交叉映射
{
VAL_SWAP(in_AD_1,AD_CH1), // 通道1映射到通道1的功能
VAL_SWAP(in_AD_2,AD_CH2) // 通道2映射到通道2的功能
},
{
VAL_SWAP(in_AD_3,AD_CH3), // 通道3映射到通道3的功能
VAL_SWAP(in_AD_4,AD_CH4) // 通道4映射到通道4的功能
}
};
int main(int argc, char *argv[])
{
uint32_t i, j, ch = 1,bCh;
RawToVal_Map_t *pMap;
for(j = 0; j < 2; j++)
{
for(i = 0; i < 2; i++)
{
pMap = &(MapArray[j][i]); // 指向映射数组中的数据
(*(pMap->RawToVal))(pMap->pRawValue,pMap->pValue); // 函数调用
printf("\nCh%d RawVal is %d.",ch,*(pMap->pRawValue)); // 打印原始值
printf("\nCh%d SwapVal is %d. \n",ch,*(pMap->pValue)); // 打印转换值
// 专门给通道一个变量,用于上面的打印
if(ch <= 4)
{
ch++;
}
else
{
ch = 1;
}
}
}
return 0;
}
/* 下面四个函数特别简单,只做系数乘法和赋值,实际中可以变为实际的工程运算*/
void AD_CH1(uint32_t *pRawValue, uint32_t *pValue)
{
*pRawValue = 1;
*pValue = *pRawValue * 2;
in_AD_1.wRawInValue = *pRawValue;
in_AD_1.dwInValue = *pValue;
}
void AD_CH2(uint32_t *pRawValue, uint32_t *pValue)
{
*pRawValue = 1;
*pValue = *pRawValue * 4;
in_AD_2.wRawInValue = *pRawValue;
in_AD_2.dwInValue = *pValue;
}
void AD_CH3(uint32_t *pRawValue, uint32_t *pValue)
{
*pRawValue = 1;
*pValue = *pRawValue * 8;
in_AD_3.wRawInValue = *pRawValue;
in_AD_3.dwInValue = *pValue;
}
void AD_CH4(uint32_t *pRawValue, uint32_t *pValue)
{
*pRawValue = 1;
*pValue = *pRawValue * 16;
in_AD_4.wRawInValue = *pRawValue;
in_AD_4.dwInValue = *pValue;
}
2)运行结果
总结
今天给大家介绍了一种用宏封装结构体变量和函数入口,实现函数功能映射,遍历调用的方式,感兴趣的小伙伴,赶紧把代码撸下来去试试吧。
有问题可以后台留言,公众号18年后新申请的,文章后不支持留言功能的。
以上就是本次的分享,如果觉得文章不错,转发、在看,也是我们继续更新的动力。
猜你喜欢:
2020年精选原创笔记汇总
干货 | protobuf-c之嵌入式平台使用
1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。在公众号聊天界面回复1024,即可免费获取!