LV01-13-C语言-函数指针的应用
本文主要是C语言基础——函数指针的应用相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
--- | --- |
前边在《LV01-06-C语言-指针》中的第五部分已经学习了函数指针的概念和基本的应用,本篇笔记主要是函数指针的应用,在这里需要完成一个命令执行的过程。
1.命令处理函数
1.1函数定义
接收到命令的时候,需要使用函数指针指向对应的命令处理函数,我们的命令处理函数如下:
1 | unsigned int func_name(int arg, int *pParam, void *pBuf) |
【参数说明】
- arg :int类型参数,调用命令处理函数时传入。
- pParam :int类型指针变量,调用命令处理函数时传入。
- pBuf :void 类型指针变量,指向一块内存区域,用于接收命令下达时命令中的信息,可以自定义。
1.2函数声明
上边的函数定义之后肯定是需要声明的呀,如下所示:
1 | unsigned int func_name(int arg, int *pParam, void *pBuf); |
会发现,这样是有些长,当命令多起来的时候,他们唯一的区别就是函数名不同,这样我们可以使用一个宏定义,定义一下函数的声明格式:
1 |
【注意】注意这里不要写成下边这样:
1 |
这样可能会报以下问题:
1 | error: expected identifier or ‘(’ before ‘unsigned’ |
【声明实例】
1 | HOST_CMD_PROCESS_FUNC(HostTest1); |
这就等价于:
1 | unsigned int HostTest1(int arg, int *pParam, void *pBuf); |
1.3函数指针定义
当我们需要调用命令处理函数的时候,就需要用到函数指针,我们可以定义如下:
1 | typedef unsigned int (*Host_Cmd_Process_Func)(int arg, int *pParam, void *pBuf); // 定义指向主机命令处理函数的指针 |
(1)(*Host_Cmd_Process_Func)中,Host_Cmd_Process_Func是一个指针变量;
(2)再看后边的括号,里边有三个参数,所以Host_Cmd_Process_Func可以指向一个带有三个参数的函数;
(3)最后看前边的unsigned int,说明函数返回值为 unsigned int 类型;
总的来说,Host_Cmd_Process_Func 可以指向一个返回值为 unsigned int 类型,含有三个参数的函数。
【使用实例】
1 | Host_Cmd_Process_Func pFunc = NULL; |
2.命令信息
2.1命令描述
每一条命令都包含以下信息:
1 | // 命令描述结构体——存放在命令数组中的每条命令要包含的信息数据 |
2.2命令信息组合
我们定义一个宏,来组合在写命令的时候想给命令的参数:
1 | // 命令数组的成员组合——将数据组合,方便存放在命令数组中 |
2.3命令数组定义
我们收到命令后,回到这些数组中寻找对应的命令信息,命令的处理函数也将在这里获取,这里:
1 | // 保存每一条命令信息的数组 |
2.4命令编号定义
1 | // 命令的编号——每个命令的编号 |
2.5命令区分
我们会有不同的命令,我们通过不同的值区间:
1 |
3.使用实例
3.1 sys_cmd_info.h
点击查看详情
1 |
|
3.2 sys_cmd.h
点击查看详情
1 |
|
3.3 sys_cmd.c
点击查看详情
1 |
|
3.4 debug_printf.h
点击查看详情
1 | /** ===================================================== |
3.5 测试结果
我们通过以下命令编译:
1 | gcc sys_cmd.c -Wall |
运行结果如下:
1 | hk@vm:~/6temp/test$ ./a.out 101 |