type
status
date
slug
summary
tags
category
icon
password
解析回调的调用
继续向内部寻找
u8g2_SetupDisplay(u8g2,u8x8_d_ssd1306_128x64_noname,u8x8_cad_ssd13xx_fast_i2c, byte_cb, gpio_and_delay_cb);这里使用了宏函数,
u8g2_SetupDisplay 实际上调用的u8x8_Setup 函数,继续向内查找官方函数描述:
设置 u8x8 并分配回调函数。如果不需要回调函数,可以设置回调函数 "u8x8_dummy_cb"。此设置不会与显示屏本身通信。使用 u8x8_InitDisplay() 向显示屏发送启动代码。
参数描述:
u8x8 一个空的 u8x8 结构
display_cb 显示器/控制器专用回调函数
cad_cb 显示控制器特定的通信回调函数
byte_cb 显示控制器/通信特定回调函数
gpio_and_delay_cb 特定于环境的回调函数,即不同平台的回调
可以找到这些回调函数的使用关键
u8x8_msg_cb 是一个函数指针,其原型是:那么 45个参数来进行驱动,那么我的疑问就在于它们具体是什么框架来进行运行的?
u8x8_msg_cb、gpio_and_delay_cb 回调都是基于u8x8_msg_cb这个函数指针的 从参数上看,驱动对象、信息、参数数量、参数指针。那么关键就在于这几个参数的协调运行。
所以需要知道msg具体是什么,它的类型是uint8_t,理论上值0~255,结合驱动对象、参数数量、参数指针,那么一个无符号整数类型怎么作为钥匙,驱动参数和参量的运行呢。很容易想到的就是switch-case语句,通过msg对应的分支id,执行分支。从这里看,十分有趣的想法。在
u8x8.h 中找到了一些宏定义佐证了这个想法从这里看命名的意思是一些功能,每个功能对应一个常量,最高255。
结论上就很清楚了,在setup函数中填入引脚初始化、通信的时序,回调函数以switch-case的框架根据宏定义功能表进行跳转运行。
但是这里的最终作用是将u8x8_msg_cb、gpio_and_delay_cb传入u8x8_t的对应对调指针上,也就是注册,并没有运行。所以接下来则探究这个msg量的变化,变化时机或条件,以及回调时如何触发的。
setup函数里面有一个值得关注的注册display_cb,因为setup回调注册之后有一个u8g2_InitDisplay(&u8g2);操作,我认为setup的倒数第一个初始化回调可能在这里执行。
这里注册的display_cb是官方给的一个回调,是针对设备编写的一个回调函数:
u8g2_InitDisplay(&u8g2) 在宏定义中使用的实际是 u8x8_InitDisplay 这个函数:这里显性的运行了上面注册的
u8x8_d_ssd1306_128x64_noname 函数,执行了这一行指令:函数原型:
从上面代码看出,这里显性的执行了gpio_and_delay_cb函数,即GPIO的初始化和延时。
更加直观的:
这里大致意思是对显示芯片进行初始化操作。
关于倒数第二个回调是对于外设各个引脚的操作,包含数据的收发。
这个操作推测是使用
u8g2_SendBuffer(&u8g2); 时触发的,因为参数编辑好后,使用该函数就可以更新图像。- 作者:乌龟の笔记
- 链接:https://tangly1024.com/article/250f5488-98bd-8054-8001-ccbe73260c27
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



