
嵌入式C语言自我修养
文章平均质量分 82
嵌入式、Linux内核、系统编程中的GNU C 扩展语法精讲
宅学部落-王利涛
这个作者很懒,什么都没留下…
展开
-
如何快速构建嵌入式全栈知识体系
嵌入式是一门交叉学科。一个嵌入式电子产品(比如手机)从底层到上层,一般会涉及半导体芯片、电子电路、计算机、操作系统、多媒体等不同专业领域的知识。很多从事嵌入式开发的朋友,通常来自不同的专业(电子、电气、计算机、机械、自动化、物理,甚至一些文科专业),在实际学习和开发中,由于专业背景的限制,经常会遇到各种技术壁垒:搞硬件的不懂软件,搞软件的不懂硬件,搞底层芯片的不懂上层软件,搞上层软件的不懂底层芯片。嵌入式技术栈太深,除了极少数人,一般人很难实现“技术破圈”,将整个技术栈从上到下捋一遍,彻底打通。相对于桌原创 2021-04-27 08:16:40 · 4345 阅读 · 11 评论 -
【新书出版】《嵌入式C语言自我修养》预售正在进行中...
几年前,专门为嵌入式工程师打造的C语言进阶视频教程:C语言嵌入式Linux高级编程,收到了几千名学员的中肯建议和好评。如今,纸质书籍也要出版啦!书籍名为:《嵌入式C语言自我修养:从芯片、编译器到操作系统》,在原版视频教程的基础上,又增加了新的干货:新增了芯片设计流程、芯片制造、封装等技术、CPU内部架构与工作原理、异构计算、GPU、NPU等新知识。从底层芯片到编译器,从编译器到操作系统,从操作系统到进程、线程、协程,意在帮大家构建一个更加完整的嵌入式全栈知识体系。独家GNU C 扩展语法精讲原创 2021-04-23 00:20:40 · 2751 阅读 · 13 评论 -
跟涛哥一起学嵌入式 30:C语言枚举类型深入剖析
枚举(enum)是C语言的一种特殊类型。当我们在编程中遇到定义一些固定长度或范围的数值时,可以考虑使用枚举类型。使用枚举可以让我们的程序可读性更强、看起来更加直观。举个例子,如果我们在编程中需要使用数字0~6分别表示星期日~星期六,程序的可读性就不高,我们需要翻手册或者看程序注释才能知道每个数字具体代表什么意思。如果我们使用枚举呢,基本上不需要看注释或手册就可知晓其大意。enum week ...原创 2020-03-06 15:30:55 · 1350 阅读 · 0 评论 -
嵌入式C语言自我修养 (01):Linux 内核中的 C 语言语法扩展
1.1 Linux 内核驱动中的奇怪语法大家在看一些 GNU 开源软件,或者阅读 Linux 内核、驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”。说它是C语言吧,貌似又跟教材中的写法不太一样;说它不是 C 语言呢,但是这些程序确确实实是在一个 C 文件中。此时,你肯定怀疑你看到的是一个“假的 C 语言”!比如,下面的宏定义:#define mult...原创 2019-01-26 15:26:11 · 2531 阅读 · 0 评论 -
嵌入式C语言自我修养 (02):Linux 内核驱动中的指定初始化
2.1 什么是指定初始化在标准 C 中,当我们定义并初始化一个数组时,常用方法如下:int a[10] = {0,1,2,3,4,5,6,7,8};按照这种固定的顺序,我们可以依次给 a[0] 和 a[8] 赋值。因为没有对 a[9] 赋值,所以编译器会将 a[9] 默认设置为0。当数组长度比较小时,使用这种方式初始化比较方便。当数组比较大,而且数组里的非零元素并不连续时,这时候再按...原创 2019-01-26 15:34:32 · 954 阅读 · 0 评论 -
嵌入式C语言自我修养 (03):宏构造利器:语句表达式
3.1 基础复习:表达式、语句和代码块表达式表达式和语句是 C 语言中的基础概念。什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子。操作符可以是 C 语言标准规定的各种算术运算符、逻辑运算符、赋值运算符、比较运算符等。操作数可以是一个常量,也可以是一个变量。表达式也可以没有操作符,单独的一个常量甚至是一个字符串,也是一个表达式。下面的字符序列都是表达式:2 + 3 2 i...原创 2019-01-26 15:39:12 · 926 阅读 · 1 评论 -
嵌入式C语言自我修养 (04):Linux 内核第一宏:container_of
4.1 typeof 关键字ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数。GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型。这里使用关键字可能不太合适,因为毕竟 typeof 还没有被写入 C 标准,是 GCC 扩展的一个关键字。为了方便,我们就姑且称之为关键字吧。通过使用 typeof,我们可以获取一个变量或表达...原创 2019-01-26 15:44:08 · 995 阅读 · 6 评论 -
嵌入式C语言自我修养 (05):零长度数组
5.1 什么是零长度数组顾名思义,零长度数组就是长度为0的数组。ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的。在ANSI C 中定义一个数组的方法如下:int a[10];C99 新标准规定:可以定义一个变长数组。int len;int a[len];也就是说,数组的长度在编译时是未确定的,在程序运行的时候才确定...原创 2019-01-26 15:49:09 · 1633 阅读 · 0 评论 -
嵌入式C语言自我修养 (06):U-boot镜像自拷贝分析:section属性
6.1 GNU C 的扩展关键字:attributeGNU C 增加一个 atttribute 关键字用来声明一个函数、变量或类型的特殊属性。声明这个特殊属性有什么用呢?主要用途就是指导编译器在编译程序时进行特定方面的优化或代码检查。比如,我们可以通过使用属性声明指定某个变量的数据边界对齐方式。__attribute__的使用非常简单,当我们定义一个函数、变量或类型时,直接在它们名字旁边添...原创 2019-01-26 15:57:44 · 1874 阅读 · 2 评论 -
嵌入式C语言自我修养 (07):地址对齐那些事儿
7.1 属性声明:alignedGNU C 通过 attribute 来声明 aligned 和 packed 属性,指定一个变量或类型的对齐方式。这两个属性用来告诉编译器:在给变量分配存储空间时,要按指定的地址对齐方式给变量分配地址。如果你想定义一个变量,在内存中以8字节地址对齐,就可以这样定义。int a __attribute__((aligned(8));通过 aligned...原创 2019-01-26 16:04:28 · 1264 阅读 · 0 评论 -
嵌入式C语言自我修养 (08):变参函数的格式检查
8.1 属性声明:formatGNU 通过 attribute 扩展的 format 属性,用来指定变参函数的参数格式检查。它的使用方法如下:__attribute__(( format (archetype, string-index, first-to-check)))void LOG(const char *fmt, ...) __attribute__((format(p...原创 2019-01-26 16:10:07 · 875 阅读 · 5 评论 -
嵌入式C语言自我修养 (09):链接过程中的强符号和弱符号
9.1 属性声明:weakGNU C 通过 attribute 声明weak属性,可以将一个强符号转换为弱符号。使用方法如下。void __attribute__((weak)) func(void);int num __attribte__((weak);编译器在编译源程序时,无论你是变量名、函数名,在它眼里,都是一个符号而已,用来表征一个地址。编译器会将这些符号集中...原创 2019-01-26 16:15:50 · 1105 阅读 · 0 评论 -
嵌入式C语言自我修养 (10):内联函数探究
10.1 属性声明:noinline & always_inline这一节,接着讲 attribute 属性声明,attribute可以说是 GNU C 最大的特色。我们接下来继续讲一下跟内联函数相关的两个属性:noinline 和 always_inline。这两个属性的用途是告诉编译器:编译时,对我们指定的函数内联展开或不展开。它们的使用方法如下。static inline...原创 2019-01-26 16:21:44 · 1131 阅读 · 0 评论 -
嵌入式C语言自我修养 (11):有一种函数,叫内建函数
11.1 什么是内建函数内建函数,顾名思义,就是编译器内部实现的函数。这些函数跟关键字一样,可以直接使用,无须像标准库函数那样,要 #include 对应的头文件才能使用。内建函数的函数命名,通常以 __builtin 开头。这些函数主要在编译器内部使用,主要是为编译器服务的。内建函数的主要用途如下。用来处理变长参数列表; 用来处理程序运行异常; 程序的编译优化、性能优化;...原创 2019-01-27 07:55:32 · 5147 阅读 · 0 评论 -
嵌入式C语言自我修养 (12):有一种宏,叫可变参数宏
12.1 什么是可变参数宏在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list、va_start、va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理;要么继续调用其它函来处理。void print_num(int count, ...){ va_list args; va...原创 2019-01-27 08:08:14 · 998 阅读 · 0 评论 -
嵌入式C语言自我修养 (13):总结
13.1 总结前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析。GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化。而通过 C 标准的发展过程我们又发现,对于一些编译器扩展的一些特性,或者其它编程语言(如:C++)中的好的特性和语法,C 标准也会适时地吸收进来,作为新的 C 语言标准。在 GNU C 的这些扩展语法中,__at...原创 2019-01-27 08:12:19 · 2255 阅读 · 0 评论