CHAPTER 04 / FIELD GUIDE

够用的 C 语言复习

读懂驱动配置和状态变量。

建议用时 45 分钟先预测,再实验,再解释

先掌握会立即用到的部分

写法意义本课用途
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 工程

  1. 添加 int count = 0,在循环里递增并打印。
  2. 增加 bool enabled,每次循环取反,打印它的状态。
  3. 先算出 raw 为 0、2048、4095 时 percent 的结果,再用日志验证。
  4. 把重复计算提取为函数 int to_percent(int raw)。
停下来想一想

一个函数里的 int count = 0 与 static int count = 0 有什么不同?

查看推导与答案

普通局部 count 每次进入时重新初始化;static 局部对象在程序运行期间保留状态。但 static 不提供线程同步,多任务同时写它仍可能出错。

本章验收

本章一手资料

卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。