CHAPTER 04 / FIELD GUIDE
够用的 C 语言复习
读懂驱动配置和状态变量。
先掌握会立即用到的部分
| 写法 | 意义 | 本课用途 |
|---|---|---|
| int / bool / uint8_t | 整数、布尔值、8 位无符号数 | 计数、开关、屏幕字节 |
| struct | 把相关字段放在一起 | GPIO / PWM 配置 |
| &x | 变量 x 的地址 | 让函数读取配置或写回结果 |
| *p | 通过指针访问对象 | 理解 API 参数 |
| static | 局部变量跨函数调用保留值 | 按键上一次状态 |
| const | 不能经此名字修改 | 初始化命令表 |
| 1ULL << n | 把第 n 位设为 1 | 选择 GPIO 位掩码 |
gpio_config_t cfg = {
.pin_bit_mask = 1ULL << 4,
.mode = GPIO_MODE_OUTPUT,
};
gpio_config(&cfg);上面先创建一个配置对象,再把地址交给驱动函数。未显式给出的结构体字段按零初始化。1ULL 是足够宽的无符号整数,不能随意改成普通 1 后再移到很高的位。
整数除法是常见陷阱
int raw = 2048;
int wrong = raw / 4095 * 100; // 先除后乘,结果为 0
int percent = raw * 100 / 4095; // 先乘后除,结果为 50
float ratio = raw / 4095.0f; // 浮点比例本例乘法不会溢出 int;更大计数值要先分析范围,必要时用 int64_t。数组下标从 0 开始,长度为 10 的数组最后一项是 [9]。局部数组不能在函数返回后继续通过旧指针访问。
练习:只改 hello 工程
- 添加 int count = 0,在循环里递增并打印。
- 增加 bool enabled,每次循环取反,打印它的状态。
- 先算出 raw 为 0、2048、4095 时 percent 的结果,再用日志验证。
- 把重复计算提取为函数 int to_percent(int raw)。
停下来想一想
一个函数里的 int count = 0 与 static int count = 0 有什么不同?
查看推导与答案
普通局部 count 每次进入时重新初始化;static 局部对象在程序运行期间保留状态。但 static 不提供线程同步,多任务同时写它仍可能出错。
本章验收
本章一手资料
卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。