工欲善其事必先利其器-C语言拓展–嵌入式C语言(一)

简介: 工欲善其事必先利其器-C语言拓展–嵌入式C语言(一)

工欲善其事必先利其器-C语言拓展–嵌入式C语言(一)

我是golang出生,当时做项目的时候java、c++、js、python都折腾过,但是关于c语言的接触,基本上都停留在大一的那个暑假。后来因为要学习协议栈,也捡了一点基础关于c语言,自我感觉还可以啊,直到我打开内核的源码,我一脸懵逼,这都是啥?

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

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

学了这个,可以帮助我们在阅读内核代码的障碍大大减退哦。

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,如果比如按照顺序,想想你要增加一个或者删除一个,牵一发而动全身啊,怕怕。

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

下一篇讲讲Linux内核中的宏,这个可太精彩了。

[学习资料]:《嵌入式C语言自我修养:从芯片、编译器到操作系统》

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
52 1
|
2月前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
82 1
|
7月前
|
C语言
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
7月前
|
安全 Unix Linux
嵌入式C语言(十四)
嵌入式C语言(十四)
48 0
|
5月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
195 2
|
5月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
99 1
|
5月前
|
算法 IDE 程序员
C语言与嵌入式系统:嵌入式C编程基础。
C语言与嵌入式系统:嵌入式C编程基础。
98 0
|
7月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
70 1
|
7月前
|
C语言
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
|
7月前
|
安全 Linux 编译器
嵌入式C语言(十二)
嵌入式C语言(十二)
42 1