stm32实现回调功能

打印 上一主题 下一主题

主题 1048|帖子 1048|积分 3144

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为了代码易维护 可读性 将app和设备驱动功能分开 不直接调用函数
而是接纳回调和注册回调方式
dev_io.h
  1. #ifndef __DEV_IO__H__
  2. #define __DEV_IO__H__
  3. #include "main.h"
  4. //回调
  5. typedef void (*Fun)(uint16_t GPIO_Pin);                // 回调函数类型
  6. uint8_t BatAdd(Fun func);                                        //注册回调
  7. #endif
复制代码
dev_io.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //#include "stdio.h"
  4. #include <string.h>
  5. #include <stdarg.h>
  6. #include "dev_io.h"
  7. //当前app是否打印
  8. #if 1
  9. #define debug  printf
  10. #else
  11. static void debug(const char *format, ...){}
  12. #endif
  13. //打印16进制
  14. static void debugH(uint8_t *buf,int len){
  15.         for(int i=0; i < len; i++){
  16.                 debug("0x%0X ",buf[i]);
  17.         }
  18.         debug("\n");
  19. }
  20. //*********************回调 */
  21. typedef struct {  
  22.         //EventID ID;                 // 回调事件标志id
  23.     Fun fun;                         // 指向函数的指针  
  24. } CallbackStruct;                  //回调结构
  25. CallbackStruct *Bat = NULL;        //回调表
  26. uint8_t BatLen = 0;                                //回调表成员数
  27. //释放回调 表
  28. void BatFree(void) {
  29.     free(Bat);
  30.     Bat = NULL;
  31.     BatLen = 0;
  32. }
  33. /****************
  34. 注册回调函数,成功返回ID 失败返回0
  35. ****************/
  36. uint8_t BatAdd(Fun func) {
  37.     if (Bat == NULL) {                                                                                //分配初始内存
  38.         Bat = malloc(sizeof(CallbackStruct));
  39.         if (Bat == NULL) {
  40.             return 0;                                                                                 // 内存分配失败,返回0或错误代码
  41.         }
  42.         BatLen = 0;                                                                                 // 初始化大小为0(但实际上在第一次添加时会被加1)
  43.     }
  44.     CallbackStruct *temp =
  45.         realloc(Bat, (BatLen + 1) * sizeof(CallbackStruct));        // 为回调表分配更多内存
  46.     if (temp == NULL) {
  47.         return 0;                                                                                         // realloc失败,返回0或错误代码
  48.     }
  49.     Bat = temp;
  50.     Bat[BatLen].fun = func;                                                                        // 添加回调并更新大小
  51.     BatLen++;
  52.     return BatLen;                                                                                        // 返回回调的ID(索引+1)
  53. }
  54. /****************
  55. 触发回调
  56. ****************/
  57. static void CallFun(uint16_t GPIO_Pin) {
  58.         for(uint8_t i=0;i < BatLen;i++){                                        //遍历储存在变量的回调函数
  59.                 if (Bat[i].fun != NULL ) {
  60.                         Bat[i].fun(GPIO_Pin);                                                //调用
  61.                 }
  62.         }
  63. }
  64. //*********************回调 */
  65. // 外部中断回调函数
  66. /*
  67.     - UART8 作为输出,当io倍触发时通过UART发出数据
  68. */
  69. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  70. {
  71.         CallFun(GPIO_Pin);
  72. }
复制代码
在app上利用
  1. //io回调
  2. static void Callio(uint16_t GPIO_Pin){
  3.        
  4. }
  5. BatAdd(Callio);                                                                                //注册io回调
复制代码
这样每设备驱动文件回调都不会直接调用app的函数
app主动接纳注册回调方式
实现设备驱动和app彻底分开

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表