跳到主要内容

08 C语言标准库

嵌入式常用标准库​

提示

CMSIS 内核头文件core_cm*.h 里面 #include 了 <stdint.h>,然后被 stm32xx.h / stm32xx_hal.h 间接包含,所以我们写STM32代码的时候经常用到<stdint.h>但很少需要主动包含它

头文件常用内容用途
<stdint.h>uint8_t、uint16_t、uint32_t定义固定宽度的整数
<stdbool.h>bool、true、false表示开关和状态
<stdio.h>printf、sprintf、snprintf打印信息、格式化文字
<string.h>memcpy、memset、strlen、strcmp处理缓冲区和字符串
<stdlib.h>strtol、abs、malloc、free数值转换、动态内存管理
<math.h>fabsf、sqrtf、sinf、cosf绝对值、开方、三角函数

在 STM32 中,printf 输出到串口需要重定向;sprintf 写入字符数组时要留够空间;malloc、free 需要包含对应头文件。

复制 清空一块数据​

int source[3] = {10, 20, 30};
int target[3];

memcpy(target, source, sizeof(source));
memset(target, 0, sizeof(target));
  • memcpy 把 source 的内容复制到 target;

  • memset 把 target 的每个字节填成 0;

位运算​

可以打开电脑上的计算器,切到程序员模式,对照十进制和二进制。

位从右往左、从 0 开始编号。

运算规则最简示例
按位与 &两位都是 1,结果才是 15 & 3 得到 1
按位或 |有一位是 1,结果就是 15 | 3 得到 7
按位异或 ^两位不同为 1,相同为 05 ^ 3 得到 6
按位取反 ~0变1,1变0a = ~a;
左移 <<向左移动,右边补 01 << 2 得到 4
右移 >>向右移动,移出的位丢弃8 >> 1 得到 4

6. volatile​

常用于中断标志位,为了防止编译器优化。

volatile uint8_t flag = 0;

volatile 告诉编译器,这个变量的值可能被其他地方改变,每次需要实实在在地去读取内存中地值,而不能偷懒用CPU中对应的缓存。

代码
正在准备编辑器…
运行结果