嵌入式C语言(一)

简介: 嵌入式C语言(一)

最初我是golang出生,当时做项目的时候java、c++、js、python都折腾过,但是关于c语言的接触,基本上都停留在大一的那个暑假。

后面一个项目需要写驱动,再到后门需要做DFX,再到我打开内核的源码,我一脸懵逼,这都是啥?

说它不是c吧,这玩意又在.c文件放着,说它是吧,这都是啥,我开始想念多年前那个下天的c语言了

因为内核和底层是挨着很近的,所以在靠近这个地方,有很多的代码有一些约定成俗的写法,下面一起来瞅瞅?

学了这个,可以帮助我们在阅读内核代码的障碍大大减退,而Linux这谁能避开不用呢?

于是这几个部分就成了面试关键的点。

1、C语言的标准

C语言在1989年发布–>C89或者C90或者ANSI C标准

● K&R C.● ANSI C.● C99.● C11.

K&R

K&R C一般也称为传统C

ANSI C

ANSI C是ANSI在K&R C的基础上进行规范统一,以及一定的拓展。

● 增加了signed、volatile、const关键字。
● 增加了void*数据类型。
● 增加了预处理器命令。
● 增加了宽字符、宽字符串。
● 定义了C标准库。● ……

C99标准

新增了一些关键字,支持新的数据类型。

● 布尔型:_Bool。
● 复数:_Complex。
● 虚数:_Imaginary。
● 内联:inline。
● 指针修饰符:restrict。
● 支持long long、long double数据类型。
● 支持变长数组。
● 允许对结构体特定成员赋值。
● 支持十六进制浮点数、float_Complex等数据类型。
● ……

C11

C11标准是ANSI在2011年发布的最新C语言标准,C11标准修改了C语言标准的一些bug,增加了一些新特性。

包括_Noreturn _Generic等

现在很多编译器还不支持

关于以上不同的编译器支持成都不一样,目前对C99支持最好的是GUN C(99%的特性)

C语言定制

不知道你们有没有发现,平时的C语言和你在玩keil、IAR这些里面的有些不一样。这是因为编译器会在特定的环境下对c语言进行一些拓展。

这个环境包括开发环境、硬件平台、性能优化的需要。

所以在我们需要使用到一些特性的时候,要判断我们使用的编译器是否支持我们的操作哦。

下面就进入正文,关于嵌入式C语言的特性

2、指定初始化

提到C语言中的数组初始化,脑子里:

int a[10] = {0,1,2,3,4,5,6,7};

其中未赋值的会默认为0,但是当我们一个很大的数组,a[10000],这个时候我想赋值第三个和第9998,脑壳痛。

于是C99有了

int b[100] = {[10] = 10, [23] = 21};
int b[100] = {[10...20] = 10, [23] = 21};

这样就解决了我们的问题,在结构体中也可以指定赋值。(但是真的感觉还是蛮丑的诶咳咳)

struct student stu1={"wit",20};//旧版
struct student stu2=
{
  .name = "www"
  .age = 99
}//新版

这里在GUN C中…是代表一个范围的意思,这个还可以应用在其他的方面:

switch(i):
  case 1:
  case 2...8:
  default:

3、Linux内核驱动注册

在Linux内核驱动中,有大量使用上面指定初始化方式,通过结构体指定变量来初始化结构体变量。

在驱动程序中,这个file_operations结构体会经常拿来注册我们开发的驱动然后系统通过回调的方式执行驱动实现。

来来来一起看看这个美丽的结构体:

其实看到这些,不要排斥,一个个的去看,其实还是蛮清晰的。

这些你看一下这些函数名,其实每个有其对应的功能,可能是站一起集合有点壮观,其实分散开就是各自干各自的时候,刚刚开始的时候在一起开个会,安排一下任务。

我们可以看到结构体file_operations里定义了很多结构体成员,而当我们在使用这个驱动时,我们只初始化了部分成员变量。

通过访问结构体的各个成员域来指定初始化,当结构体成员很多时优势就体现出来了,初始化会更加方便。

还有就是因为在工程中,想内核这样的大型项目,在文件中有超级多的地方文件在使用file_operation,如果比如按照顺序,想想你要增加一个或者删除一个,牵一发而动全身啊,怕怕。

第一篇先写到这里,感觉现在大家都不喜欢看很长的东西,喜欢碎片化的,可能是因为节奏太快,生活太忙。

无论如何,希望你开心快乐。


目录
相关文章
|
2月前
|
存储 编解码 编译器
嵌入式C语言(四)
嵌入式C语言(四)
27 0
|
27天前
|
编译器 Linux C语言
嵌入式C语言(八)
嵌入式C语言(八)
20 0
|
27天前
|
存储 编译器 C语言
嵌入式C语言(六)
嵌入式C语言(六)
22 0
|
27天前
|
存储 编译器 程序员
嵌入式C语言(七)
嵌入式C语言(七)
18 0
|
27天前
|
编译器 C语言 芯片
嵌入式C语言(九)
嵌入式C语言(九)
18 0
|
27天前
|
缓存 小程序 编译器
嵌入式C语言(十)
嵌入式C语言(十)
25 0
|
6天前
|
安全 算法 开发工具
【C 言专栏】基于 C 语言的嵌入式系统开发
【5月更文挑战第1天】本文探讨了C语言在嵌入式系统开发中的核心作用。嵌入式系统作为专用计算机系统广泛应用于家电、汽车、医疗等领域,具备实时性、低功耗等特点。C语言因其高效性、可移植性和灵活性成为开发首选。文章介绍了开发流程,包括需求分析、硬件选型、软件设计至部署维护,并强调中断处理、内存管理等关键技术。C语言在智能家居、汽车电子和医疗设备等领域的应用实例展示了其广泛影响力。面对硬件限制、实时性要求和安全挑战,开发者需不断优化和适应新技术趋势,以推动嵌入式系统创新发展。
【C 言专栏】基于 C 语言的嵌入式系统开发
|
7天前
|
传感器 算法 C语言
C语言在嵌入式系统开发中的优化策略与代码实现
C语言在嵌入式系统开发中的优化策略与代码实现
19 1
|
27天前
|
存储 编译器 Linux
嵌入式C语言(五)
嵌入式C语言(五)
16 0
|
1月前
|
Linux API C语言
lua 如何在嵌入式Linux中与c语言结合
lua 如何在嵌入式Linux中与c语言结合
12 1