Linux 内核的引导
引导包括很多阶段。一般的SoC嵌入了bootrom,上电时bootrom运行。bootrom会去引导bootloader。
CPU0会发中断唤醒CPU1.之后CPU0和cpu1共同承担这些负载。进行负载均衡。
嵌入式Linux领域最著名的bootloader是U-Boot,关于内核启动,与驱动关系比较大的部分是每个平台的
是设备回掉函数和设备属性信息,他们通常包装在DT_MACHINE_START 和 MACHINE_END之间。包含reserve(),
map_io()、int_machine()、int_late()、smp等回掉函数或者属性,这些函数会在内核启动过程中被调用,
用户空间的init程序常用的有busybox init ,SysVinit,systemd,功能是把整个系统启动,最后形成
一个进程树,例如ubuntu上的pstree、
Linux 下C编程的特点
Linux编码风格
在windows程序当中,习惯以如下的方式命名宏、变量和函数。
#define PI 3.1415926 /*用大写字母表示宏*/
int minValue,maxValue /*变量:第一个单词全小写,其后单词的第一个字母大写*/
void SendData(void); /*所有单词第一个字母大写*/
在Linux中,下划线大行其道,不按照Windows的命名方式来命名。在linux下应保持同样的特性。
if 和 else 混用的情况下, else 语句不另起一行,例如:
if (x == y) {
...
} else if (x > y) {
...
} else {
...
}
Linux 建议 switch 和 case 对齐。
在工程阶段,一般可以在SCM软件的服务器端使能pre-commit hook,自动检查工程师的代码是否符合Linux
的规范。如果不符合,则自动拦截。
GNU C对标准的C进行一系列的扩展,以增强C的功能。
零长度和变长数组
GNU C中也可以使用1个变量定义数组。
GNU C 支持 case x…y 这样的语法。
语句表达式
GNU C 把包含在括号中的符合语句看成是一个表达式。他可以出现在任何允许表达式的地方。
define min_t(type,x,y) /
({type __x = (x);type __y = (y);__x < __y? __x:__y})
typeof关键字
获得x的类型,借助typedof重新定义的min函数。
#define min(x,y) ({ \
const typeof(x) _x = (x); \
const typeof(y) _y = (y); \
(void)(&_x == & -y); \ //用于检查_x和_y是否一致
_x < _y? _x:_y;
})
当前函数名
GNU C 中预定义了两个标识符保存当前的函数名,__FUNCTION__保存函数在源代码中的名字,
__PRETTY_FUNCTION__保存带有语言特色的名字。
特殊属性申明
GNU C允许申明函数、变量和类型的属性,以便手动优化代码和定制代码检查的方法。要指定一个申明的属性
__attribute__((ATTRIBUTE))
如果存在多个属性,以逗号分隔,支持的属性有noreturn、format、section、aligned、packed十多个属性。
unused属性用于函数和变量,表示该函数或变量可能不会被用到,这个属性可以避免编辑器产生警告信息。
aligned属性用于变量、结构体或者联合体,指定对其的方式,以字节为单位。
内建函数
GNU C 提供了大量的内建函数,其中大部分是标准C库函数的GNU C编译器内建版本,例如memorycpy()等
他们与标准的C库功能相同。
不属于库函数的内建函数的命名通常以__builtin开始,
内建函数__builtin_return_address(LEVEL)返回当前函数或者其调用者的返回地址。参数LEVEL指定调用栈的
级数。
内建函数__builtin_constant_p(EXP)用于判断一个值是否为编译时常数,如果是常数,则返回1,否则返回0.
内建函数__builtin_expect(EXP,C)用于为编译器提供分支预测信息,其返回值是整数表达式EXP的值。
若代码中出现分支,则可能中断流水线。我们可以通过likely(),unlickly()暗示分支容易成立还是不容易成立。
在Linux中,经常会用到do{}while(0)语句,用法主要是在宏定义当中。如下
#define SAFE_FREE(p) do(free(p);p = NULL;)while(0)
Linux对于goto的语句一般只限于错误处理当中。
在错误处理时注销,资源释放,与正常的注册,资源申请相反。
引导包括很多阶段。一般的SoC嵌入了bootrom,上电时bootrom运行。bootrom会去引导bootloader。
CPU0会发中断唤醒CPU1.之后CPU0和cpu1共同承担这些负载。进行负载均衡。
嵌入式Linux领域最著名的bootloader是U-Boot,关于内核启动,与驱动关系比较大的部分是每个平台的
是设备回掉函数和设备属性信息,他们通常包装在DT_MACHINE_START 和 MACHINE_END之间。包含reserve(),
map_io()、int_machine()、int_late()、smp等回掉函数或者属性,这些函数会在内核启动过程中被调用,
用户空间的init程序常用的有busybox init ,SysVinit,systemd,功能是把整个系统启动,最后形成
一个进程树,例如ubuntu上的pstree、
Linux 下C编程的特点
Linux编码风格
在windows程序当中,习惯以如下的方式命名宏、变量和函数。
#define PI 3.1415926 /*用大写字母表示宏*/
int minValue,maxValue /*变量:第一个单词全小写,其后单词的第一个字母大写*/
void SendData(void); /*所有单词第一个字母大写*/
在Linux中,下划线大行其道,不按照Windows的命名方式来命名。在linux下应保持同样的特性。
if 和 else 混用的情况下, else 语句不另起一行,例如:
if (x == y) {
...
} else if (x > y) {
...
} else {
...
}
Linux 建议 switch 和 case 对齐。
在工程阶段,一般可以在SCM软件的服务器端使能pre-commit hook,自动检查工程师的代码是否符合Linux
的规范。如果不符合,则自动拦截。
GNU C对标准的C进行一系列的扩展,以增强C的功能。
零长度和变长数组
GNU C中也可以使用1个变量定义数组。
GNU C 支持 case x…y 这样的语法。
语句表达式
GNU C 把包含在括号中的符合语句看成是一个表达式。他可以出现在任何允许表达式的地方。
define min_t(type,x,y) /
({type __x = (x);type __y = (y);__x < __y? __x:__y})
typeof关键字
获得x的类型,借助typedof重新定义的min函数。
#define min(x,y) ({ \
const typeof(x) _x = (x); \
const typeof(y) _y = (y); \
(void)(&_x == & -y); \ //用于检查_x和_y是否一致
_x < _y? _x:_y;
})
当前函数名
GNU C 中预定义了两个标识符保存当前的函数名,__FUNCTION__保存函数在源代码中的名字,
__PRETTY_FUNCTION__保存带有语言特色的名字。
特殊属性申明
GNU C允许申明函数、变量和类型的属性,以便手动优化代码和定制代码检查的方法。要指定一个申明的属性
__attribute__((ATTRIBUTE))
如果存在多个属性,以逗号分隔,支持的属性有noreturn、format、section、aligned、packed十多个属性。
unused属性用于函数和变量,表示该函数或变量可能不会被用到,这个属性可以避免编辑器产生警告信息。
aligned属性用于变量、结构体或者联合体,指定对其的方式,以字节为单位。
内建函数
GNU C 提供了大量的内建函数,其中大部分是标准C库函数的GNU C编译器内建版本,例如memorycpy()等
他们与标准的C库功能相同。
不属于库函数的内建函数的命名通常以__builtin开始,
内建函数__builtin_return_address(LEVEL)返回当前函数或者其调用者的返回地址。参数LEVEL指定调用栈的
级数。
内建函数__builtin_constant_p(EXP)用于判断一个值是否为编译时常数,如果是常数,则返回1,否则返回0.
内建函数__builtin_expect(EXP,C)用于为编译器提供分支预测信息,其返回值是整数表达式EXP的值。
若代码中出现分支,则可能中断流水线。我们可以通过likely(),unlickly()暗示分支容易成立还是不容易成立。
在Linux中,经常会用到do{}while(0)语句,用法主要是在宏定义当中。如下
#define SAFE_FREE(p) do(free(p);p = NULL;)while(0)
Linux对于goto的语句一般只限于错误处理当中。
在错误处理时注销,资源释放,与正常的注册,资源申请相反。
建立交叉工具链。。。
爱你,YZ