怎么才能做好嵌入式开发?学好C语言吧!今天就来推荐一篇大佬写的嵌入式C语言知识点总结。C语言中的关键字C语言中的关键字按照功能分为:
数据类型(常用char, short, int, long, unsigned, float, double)
运算和表达式(=, +, -, *, while, do-while, if, goto, switch-case)
数据存储(auto, static, extern,const, register,volatile,restricted),
结构(struct, enum, union,typedef),
位操作和逻辑运算(<<, >>, &, |, ~,^, &&),
预处理(#define, #include, #error,#if...#elif...#else...#endif等),
平台扩展关键字(__asm, __inline,__syscall)
数据的输入,如传感器,信号,接口输入
数据的处理,如协议的解码和封包,AD采样值的转换等
数据的输出,如GUI的显示,输出的引脚状态,DA的输出控制电压,PWM波的占空比等
typedef unsigned char uint8_t;typedef unsigned short uint16_t;typedef unsigned int uint32_t;......typedef signed int int32_t;既然不同平台的基本数据宽度不同,那么如何确定当前平台的基础数据类型如int的宽度,这就需要C语言提供的接口sizeof,实现如下。
printf("int size:%d, short size:%d, char size:%d\n", sizeof(int), sizeof(char), sizeof(short));这里还有重要的知识点,就是指针的宽度,如:
char *p;printf("point p size:%d\n", sizeof(p));其实这就和芯片的可寻址宽度有关,如32位MCU的宽度就是4,64位MCU的宽度就是8,在有些时候这也是查看MCU位宽比较简单的方式。
内存管理和存储架构 C语言允许程序变量在定义时就确定内存地址,通过作用域,以及关键字extern,static,实现了精细的处理机制,按照在硬件的区域不同,内存分配有三种方式(节选自C++高质量编程):
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中 ,效率很高,但是分配的内存容量有限。
从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但同时遇到问题也最多。
//main.c#include#include
static int st_val; //静态全局变量 -- 静态存储区int ex_val; //全局变量 -- 静态存储区int main(void){int a = 0; //局部变量 -- 栈上申请int *ptr = NULL; //指针变量static int local_st_val = 0; //静态变量local_st_val += 1;a = local_st_val;