做耳机开发,需要掌握哪些 C 语言知识

TWS 应用层的大部分工作,最后还是要落到 C 代码上。这篇整理开发中经常用到、也容易混淆的内容,方便需要时快速回顾。 一、数据类型与类型转换 嵌入式代码经常使用 uint8_t、uint16_t 和 uint32_t,因为它们的位宽是明确的。 int 占多少字节,由芯片架构和编译器决定。在常见的 32 位平台上,int 通常占 4 字节;在部分嵌入式平台上,也可能只占 2 字节。可以使用 sizeof 查看当前平台上的实际大小: printf("int size: %u\n", (unsigned int)sizeof(int)); sizeof 返回的是 size_t 类型。这里先把结果转换成 unsigned int,再使用 %u 输出,适合常见的嵌入式 printf。 普通计算和循环计数可以使用 int。通信协议、Flash 数据、文件格式和寄存器字段需要明确长度时,优先使用固定位宽类型。 类型转换主要注意下面几种情况: 情况 需要注意什么 大类型转小类型 高位可能被截断 有符号转无符号 负数会变成很大的正数 无符号与有符号比较 有符号数可能先被转成无符号数 指针类型转换 只改变读取内存的方式,不会改变原来的数据 注意:有符号数和无符号数比较前,尽量把两边统一成合适的类型。进行指针类型转换时,要确认原内存长度不小于目标类型的大小。例如原数据只有 1 字节,转换成 uint32_t * 后却按照 4 字节读取,就会读到不属于它的内存。 二、指针、数组与生命周期 指针保存的是地址。使用前主要检查四件事: 指针是否为空。 指向的内存是否仍然有效。 访问长度是否越界。 指针指向的数据类型是否正确。 void update_state(uint8_t *state) { if (state == NULL) { return; } *state = 1; } 数组传入函数后通常会退化成指针,函数内部无法再通过 sizeof 得到原数组长度。因此传递缓冲区时,最好同时传入长度。 ...