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,结果才是 1 | 5 & 3 得到 1 |
按位或 | | 有一位是 1,结果就是 1 | 5 | 3 得到 7 |
按位异或 ^ | 两位不同为 1,相同为 0 | 5 ^ 3 得到 6 |
按位取反 ~ | 0变1,1变0 | a = ~a; |
左移 << | 向左移动,右边补 0 | 1 << 2 得到 4 |
右移 >> | 向右移动,移出的位丢弃 | 8 >> 1 得到 4 |
6. volatile
常用于中断标志位,为了防止编译器优化。
volatile uint8_t flag = 0;
volatile 告诉编译器,这个变量的值可能被其他地方改变,每次需要实实在在地去读取内存中地值,而不能偷懒用CPU中对应的缓存。