回调函数
首先,什么是回调函数?回调函数在个人理解来看就是自己定义了一个函数,然后将自己定义的这个函数的入口地址(即函数名字)当做另外一个函数(中间函数)的参数传入进行对应的处理,那么中间函数在哪里被调用呢?中间函数会在应用层的函数里被调用。
上伪代码例子
//回调函数1(驱动层)
void Led_On(uint8_t Led_Num)
{
if (Led_Num == 1)
//实现LED1灯的点亮
else if (Led_Num == 2)
//实现LED2灯的点亮
//....
}
//回调函数2
void Led_Off(uint8_t Led_Num)
{
if (Led_Num == 1)
//实现LED1灯的熄灭
else if (Led_Num == 2)
//实现LED2灯的熄灭
//....
}
//中间函数(中间层)
void Led_Fun(uint8_t Led_Num, void (*CallBack)(uint8_t))
{
(*CallBack)(Led_Num);
}
//应用层
int main(void)
{
//系统初始化
while(1)
{
//点亮LED1
Led_Fun(1, Led_On);
delay_ms(500);
//熄灭LED1
Led_Fun(1, Led_Off);
delay_ms(500);
}
}
在上述伪代码中,Led_Fun函数被主循环调用了,Led_Fun函数中又会根据传入的函数指针变量去调用对应的函数。这样做的目的是提高了代码的可复用性,例如我可以用Led_Fun进行LED1的闪烁同时我也可以使用此函数对LED2进行闪烁,而不用重新写一个函数对LED2进行闪烁,减少了代码的冗余性提高了代码可阅读性。
其逻辑关系如上图,
应用层:是一些应用层的逻辑处理或者算法处理。
中间层:单纯只是一个函数调用,如此处理的原因是希望通过一个函数指针的方式辨别传入不同的函数入口地址执行不同的函数,从而节省单片机的RAM以及ROM的开支。
驱动层(回调函数):对接硬件,也可以叫做硬件接口层,在这里主要是对具体硬件的处理。
以上纯属个人见解,有误之处还望大家指正。
上述内容是观看B站UP主硬件家园的相关视频有感而做的记录,大家有兴趣可以去B站搜索硬件家园也有相关视频讲解。