[#0x0046] callback释义

  最近接触到了HibernateTemplate,用到了HibernateCallback,决定把callback的逻辑关系彻底搞清楚,以前总是不明白这个call到底是谁call的谁,这个back到底是从哪里back到哪里。

 

  要搞清楚英文原文的逻辑,还是wikipedia好使,反正我关键字“回调函数”搜了半天也没搞清楚……

 

  In computer programming, a callback is a reference to executable code, or a piece of executable code, that is passed as an argument to other code. This allows a lower-level software layer to call a subroutine (or function) defined in a higher-level layer.

 

  

  从这个解释和图来看,callback function的指针会传递给library function,然后library function calls callback function, from library level back to appliaction level。callback function实质是回调的函数。

 

  callback在MFC中体现得很明显。我们设计的dialog、button什么的都是Main program,写的onButtonOK()、onWindowClose()这类的事件处理函数就是Callback function,它们都是我们开发的Application program;MFC底层运行机制就是Library function,是属于Software library的。

 

  这个层次关系在HibernateTemplate中并不是很明显,因为HibernateCallback也是library的一部分,相当于是给了application一个默认实现。

#include "RTX51TNY.H" #include "Fingerprint.h" // 任务ID定义 #define MAIN_TASK_ID 0 #define FP_TASK_ID 1 // 指纹操作结果回调函数 void fp_callback(u8 status, u16 id) { if(status) { printf("Operation success! ID: %d\n", id); P13 = 0; } else { printf("Operation failed! ID: %d\n", id); P13 = 1; } } void setup() { EAXSFR(); EA = 1; ZW101_init(); ZW101_set_callback(fp_callback); } void main_task() _task_ MAIN_TASK_ID { setup(); printf("Fingerprint System Start\n"); os_create_task(FP_TASK_ID); os_delete_task(MAIN_TASK_ID); } void fp_task() _task_ FP_TASK_ID { // 这里需要添加实际的按钮检测代码 // 使用临时变量代替按钮状态 u8 check_button = 0; u8 enroll_button = 0; u8 sleep_button = 0; while(1) { // 示例:检测按钮按下触发指纹检测 if(check_button) { if(!ZW101_is_busy()) { ZW101_start_check(); } } // 示例:录入按钮按下触发指纹录入 else if(enroll_button) { if(!ZW101_is_busy()) { ZW101_start_enroll(1); } } // 示例:休眠按钮按下进入低功耗 else if(sleep_button) { ZW101_sleep(); } // 处理接收数据 if(ZW101_is_busy()) { ZW101_receive_data(); } os_wait2(K_IVL, 10); } } 这是指纹模块的main.c文件 #ifndef _ZW101_H_ #define _ZW101_H_ /* 包含必要的头文件 */ #include "STC8G_H_GPIO.h" #include "STC8G_H_UART.h" #include "STC8G_H_Switch.h" #include "STC8G_H_NVIC.h" #include "STC8G_H_Delay.h" /* 操作模式定义 */ #define FP_MODE_IDLE 0 /* 空闲模式 */ #define FP_MODE_CHECK 1 /* 指纹验证模式 */ #define FP_MODE_ENROLL 2 /* 指纹录入模式 */ #define FP_MODE_SLEEP 3 /* 休眠模式 */ /* 协议定义 */ #define FP_SYNO_FIRST_HEAD 0xEF /* 包头第一字节 */ #define FP_SYNO_SECOND_HEAD 0x01 /* 包头第二字节 */ #define FP_SYNO_CMD_PKG 0x01 /* 命令包标识 */ #define FP_SYNO_DATA_PKG 0x02 /* 数据包 */ #define FP_SYNO_EOF_PKG 0x08 /* 结束包 */ #define GET_ARRAY_LEN(arr) (sizeof(arr)/sizeof((arr)[0])) /* 计算数组长度 */ /* 定义函数指针类型 */ typedef void (*fp_callback_t)(u8 status, u16 id); /* 函数声明 */ void ZW101_init(void); void ZW101_set_mode(u8 mode); u8 ZW101_is_busy(void); void ZW101_receive_data(void); void ZW101_sleep(void); void ZW101_wakeup(void); void ZW101_start_enroll(u16 id); void ZW101_start_check(void); void ZW101_set_callback(fp_callback_t callback); void ZW101_process_response(unsigned char* data, unsigned char len); #endif 这是指纹模块的Fingerprint.h文件 #include "Fingerprint.h" /* 指令定义 */ static const u8 cmd_sleep[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x03,0x33,0x00,0x37}; static const u8 cmd_wakeup[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x03,0x34,0x00,0x38}; static const u8 cmd_check[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x08,0x32,0x02,0xFF,0xFF,0x00,0x01,0x02,0x3C}; static const u8 cmd_enroll_start[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x04,0x31,0x00,0x36}; static const u8 cmd_enroll1[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x04,0x31,0x01,0x37}; static const u8 cmd_enroll2[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x04,0x31,0x02,0x38}; static const u8 cmd_enroll3[] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x04,0x31,0x03,0x39}; /* 模块状态变量 */ static u8 connected = 0; static u8 current_mode = FP_MODE_IDLE; static u16 enroll_id = 0; static u8 enroll_step = 0; static fp_callback_t user_callback = NULL; void ZW101_GPIO_config(void) { /* 配置GPIO引脚 */ P4_MODE_IO_PU(GPIO_Pin_3 | GPIO_Pin_4); P13 = 1; /* 低功耗模式,拉高启动 */ } void ZW101_UART_config(void) { /* 配置UART串口 */ COMx_InitDefine init; init.UART_Mode = UART_8bit_BRTx; init.UART_BaudRate = 115200UL; init.UART_RxEnable = ENABLE; init.BaudRateDouble = DISABLE; init.UART_BRT_Use = BRT_Timer1; UART_Configuration(UART1, &init); UART1_SW(UART1_SW_P30_P31); NVIC_UART1_Init(ENABLE, Priority_0); } void ZW101_send_cmd(const u8 *cmd, u8 len) { /* 发送指令到指纹模块 */ u8 i; for(i = 0; i < len; i++) { TX2_write2buff(cmd[i]); } } void ZW101_init(void) { /* 初始化指纹模块 */ ZW101_GPIO_config(); ZW101_UART_config(); current_mode = FP_MODE_IDLE; } void ZW101_set_mode(u8 mode) { /* 设置当前操作模式 */ current_mode = mode; } u8 ZW101_is_busy(void) { /* 检查模块是否忙 */ return (current_mode != FP_MODE_IDLE && current_mode != FP_MODE_SLEEP); } void ZW101_sleep(void) { /* 进入低功耗模式 */ ZW101_send_cmd(cmd_sleep, sizeof(cmd_sleep)); current_mode = FP_MODE_SLEEP; } void ZW101_wakeup(void) { /* 从低功耗模式唤醒 */ ZW101_send_cmd(cmd_wakeup, sizeof(cmd_wakeup)); current_mode = FP_MODE_IDLE; } void ZW101_start_check(void) { /* 开始指纹检测 */ ZW101_send_cmd(cmd_check, sizeof(cmd_check)); current_mode = FP_MODE_CHECK; } void ZW101_start_enroll(u16 id) { /* 开始指纹录入 */ enroll_id = id; enroll_step = 0; ZW101_send_cmd(cmd_enroll_start, sizeof(cmd_enroll_start)); current_mode = FP_MODE_ENROLL; } void ZW101_set_callback(fp_callback_t callback) { /* 设置结果回调函数 */ user_callback = callback; } void ZW101_process_response(u8* data, u8 len) { /* 处理模块响应 */ u8 cmd; u8 param; u16 fid; /* 检查响应长度是否足够 */ if(len < 12) { return; } /* 验证包头 */ if(data[0] != FP_SYNO_FIRST_HEAD || data[1] != FP_SYNO_SECOND_HEAD) { return; } cmd = data[9]; param = data[10]; /* 根据当前模式处理响应 */ switch(current_mode) { case FP_MODE_CHECK: if(param == 0x05) { if(cmd == 0x00) { /* 修正数组访问语法 */ fid = (u16)((data[11] << 8) | data[12]); if(user_callback != NULL) { user_callback(1, fid); } } else { if(user_callback != NULL) { user_callback(0, 0); } } } current_mode = FP_MODE_IDLE; break; case FP_MODE_ENROLL: if(param == 0x31) { if(cmd == 0x00) { enroll_step++; if(enroll_step == 1) { ZW101_send_cmd(cmd_enroll1, sizeof(cmd_enroll1)); } else if(enroll_step == 2) { ZW101_send_cmd(cmd_enroll2, sizeof(cmd_enroll2)); } else if(enroll_step == 3) { ZW101_send_cmd(cmd_enroll3, sizeof(cmd_enroll3)); } else { if(user_callback != NULL) { user_callback(1, enroll_id); } current_mode = FP_MODE_IDLE; } } else { if(user_callback != NULL) { user_callback(0, enroll_id); } current_mode = FP_MODE_IDLE; } } break; default: break; } } void ZW101_receive_data(void) { /* 接收并处理数据 */ u8 i; u8 rx_cnt; /* 将RX_Cnt值保存到局部变量 */ if(COM2.RX_TimeOut > 0) { COM2.RX_TimeOut--; if(COM2.RX_TimeOut == 1) { rx_cnt = COM2.RX_Cnt; if(rx_cnt > 0) { /* 初始连接确认 */ if(!connected) { for(i = 0; i < rx_cnt; i++) { if(RX2_Buffer[i] == 0x55) { connected = 1; break; } } } /* 处理有效数据包 */ if(rx_cnt >= 12) { ZW101_process_response(RX2_Buffer, rx_cnt); } } COM2.RX_Cnt = 0; } } } 这是指纹模块的Fingerprint.c文件,我使用的编译器是C89版,我在Type_def.h中定义了 typedef unsigned char u8; // 8 bits typedef unsigned int u16; // 16 bits typedef unsigned long u32; // 32 bits typedef signed char int8; // 8 bits typedef signed int int16; // 16 bits typedef signed long int32; // 32 bits typedef unsigned char uint8; // 8 bits typedef unsigned int uint16; // 16 bits typedef unsigned long uint32; // 32 bits 而我在Fingerprint.h里面include了STC8G_H_GPIO.h,而STC8G_H_GPIO.h里面include了config.h,而config.h里面include了type_def.h。 现在我在main.c文件中进行编译结果出现错误,错误主要在Fingerprint.h中的void ZW101_process_response(unsigned char* data, unsigned char len); 显示以下错误:Fingerprint.h(38): error C141: syntax error near &#39;,&#39;, expected &#39;<id>&#39;,请改正
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值