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

本文介绍了C语言的不同标准,如C89、C99、C11,并探讨了它们在嵌入式系统中的应用,特别是C99的指定初始化特性如何简化数组和结构体初始化。此外,还提到了在Linux内核驱动中如何利用结构体成员初始化来注册驱动,并强调了理解这些概念对于阅读内核代码的重要性。
摘要由CSDN通过智能技术生成

工欲善其事必先利其器-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语言自我修养:从芯片、编译器到操作系统》

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值