这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» 总结嵌入式C语言知识点

共2条 1/1 1 跳转至

总结嵌入式C语言知识点

高工
2022-09-23 09:48:15 打赏
引言

怎么才能做好嵌入式开发?学好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)

这些关键字共同构成了嵌入式平台的C语言语法。嵌入式的应用从逻辑上可以抽象为三个部分:
  • 数据的输入,如传感器,信号,接口输入

  • 数据的处理,如协议的解码和封包,AD采样值的转换等

  • 数据的输出,如GUI的显示,输出的引脚状态,DA的输出控制电压,PWM波的占空比等

对于数据的管理就贯穿着整个嵌入式应用的开发,它包含数据类型,存储空间管理,位和逻辑操作,以及数据结构,C语言从语法上支撑上述功能的实现,并提供相应的优化机制,以应对嵌入式下更受限的资源环境。 数据类型 C语言支持常用的字符型,整型,浮点型变量,有些编译器如keil还扩展支持bit(位)和sfr(寄存器)等数据类型来满足特殊的地址操作。C语言只规定了每种基本数据类型的最小取值范围,因此在不同芯片平台上相同类型可能占用不同长度的存储空间,这就需要在代码实现时考虑后续移植的兼容性,而C语言提供的typedef就是用于处理这种情况的关键字,在大部分支持跨平台的软件项目中被采用,典型的如下:


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 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但同时遇到问题也最多。

这里先看个简单的C语言实例。


//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;