终章:自动注册与 Linux 内核 OOP 结构
13 终章:自动注册与 Linux 内核 OOP 结构 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 ⇐ 当前位置 到这里,C 语言层面的对象、继承、函数指针、ops 和多态都已经就位。最后看一个更接近大型工程的问题:模块越来越多时,谁负责把它们接进系统? 普通项目里,初始化可能集中写在 main(): 1234567891011int...
完整框架:抽象层与硬件解耦
12 完整框架:抽象层与硬件解耦 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 ⇐ 当前位置 终章:自动注册与 Linux 内核 OOP 结构 前面讲的封装、继承、函数指针、ops、多态,单看都像局部技巧。真正放进项目里,它们会拼成一个目标:应用层不直接依赖具体硬件。 如果应用层直接写底层 API: 123456void app_run(void){ gpio_write(5,...
接口设计:ops 合同与默认实现
11 接口设计:ops 合同与默认实现 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 ⇐ 当前位置 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 ops 表把 C 语言带到了虚函数层级,但它也带来一个新风险:函数指针可能是 NULL。 例如操作表定义如下: 123456typedef struct { int (*on)(LedBase_t *me); int...
多态与转型:base 指针与 dispatch
10 多态与转型:base 指针与 dispatch C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch ⇐ 当前位置 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 现在我们已经有了两个零件:公共字段 base,以及行为表 ops。 多态要解决的问题是:上层不想知道这颗 LED 到底是 GPIO LED、PWM LED 还是 RGB...
ops/vtable:行为表与对象绑定
09 ops/vtable:行为表与对象绑定 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 ⇐ 当前位置 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 上一篇讲了函数指针。它能把一个动作传来传去,但真实对象通常不止一个动作。 一颗 LED 至少有 on、off、set_brightness、deinit。文件对象有 open、read、write、release。网卡有...
函数指针:把行为作为参数
08 函数指针:把行为作为参数 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ⇐ 当前位置 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 继承复用了公共字段,但还没有解决行为差异。 GPIO LED 的开灯是写电平,PWM LED 的开灯是设置占空比,RGB LED 的开灯可能要同时驱动三个通道。它们都叫“开灯”,但具体动作不同。 如果把动作写死: 1234void...
继承:struct 嵌套复用公共字段
07 继承:struct 嵌套复用公共字段 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 ⇐ 当前位置 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 封装能组织好单个对象。但项目里经常会出现“一类设备的多种实现”:GPIO LED、PWM LED、RGB LED、呼吸灯。 它们的点亮方式不同,但都有一些共同状态:引脚、亮度、是否点亮、是否初始化。 如果每种 LED...
HAL 映射:工业库的封装结构
06 HAL 映射:工业库的封装结构 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 ⇐ 当前位置 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 学完 struct + me + static + init/deinit 后,再看 STM32 HAL,会发现它并不是一堆随便命名的函数。它只是把同样的设计放到了更大的硬件库里。 HAL GPIO...
数据归位:struct 成员与 static 变量
05 数据归位:struct 成员与 static 变量 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 数据归位:struct 成员与 static 变量 ⇐ 当前位置 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 很多新人听到“不要用全局变量”,会以为这是代码风格问题。其实更准确地说:不要让数据失去主人。 下面这种写法把 LED 模块的所有数据都放在全局: 12345int g_pin = 0;int g_brightness = 0;int...
类的组织:前缀、init/deinit 与生命周期
04 类的组织:前缀、init/deinit 与生命周期 C 语言 OOP 系列导航 本系列面向会 C 和单片机基础、刚进入企业项目的同学,从 struct 封装一路讲到 ops、多态和类 Linux 驱动框架。 C 语言面向对象设计路线 封装:struct 数据与 me 指针 信息隐藏:static 与头文件边界 类的组织:前缀、init/deinit 与生命周期 ⇐ 当前位置 数据归位:struct 成员与 static 变量 HAL 映射:工业库的封装结构 继承:struct 嵌套复用公共字段 函数指针:把行为作为参数 ops/vtable:行为表与对象绑定 多态与转型:base 指针与 dispatch 接口设计:ops 合同与默认实现 完整框架:抽象层与硬件解耦 终章:自动注册与 Linux 内核 OOP 结构 企业项目里,一个模块通常不是只有一个函数。LED 模块可能有初始化、开灯、关灯、设置亮度、释放资源;电机模块也有初始化、启动、停止、设置速度。 如果大家都写短名字: 123int init(void);int...









