Linux设备驱动开发之编写代码前准备

在git中添加pre-commit

一般情况下我们编写linux内核的代码,我们要符合源码的编写规范。所以当我们使用git仓库来开发代码时,可以使用pre-commit这个脚本来检查我们每次提交的代码是否符合规范。linux内核的代码格式检查脚本的路径在linux内核源码目录下:

scripts/checkpatch.pl

那么我们现在可以在pre-commit中添加上面脚本的执行路径:

#!/bin/sh
#
# pre-commit hook to run check-patch on the output and stop any commits
# that do not pass. Note, only for git-commit, and not for any of the
# other scenarios
#
# Copyright 2010 Ben Dooks, <[email protected]>
if git rev-parse --verify HEAD 2>/dev/null >/dev/null
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
git diff --cached $against -- | ./scripts/checkpatch.pl --no-signoff -

这上面的例子是Ben Docks完成的一个版本,当我们要改写pre-commit时,可以直接把原来的commit脚本中检查代码语句替换成/scripts/checkpatch.pl这个脚本检查就可以了。

do{}while(0)语句

linux内核中的宏定义中我们随处可见do{}while(0)语句,那为啥要加这条语句呢?首先我们想一下这条语句在语法上是一句,或者说是一个代码块,当别的代码引用这个代码段的时候,可以直接当一句代码处理不用做其它的防护措施。所以do{}while(0)的使用完全是为了保证宏定义的使用者能无编译错误地使用宏,它不对其使用者做任何假设。

工具链

我们修改好linux内核代码后,是需要编译的。那么用哪种工具链进行编译呢?这里我们讨论一下arm的linux工具链。
一般一个典型的arm linux工具链包括arm-linux-gnueabihf-gcc、strip、objdump、ld、gprof、nm、readelf、addr2line等。我们来介绍大部分的用法:

strip:可以用strip删除可执行文件中的符号表和调试信息等以此来实现缩减程序体积的目的。

gprof:gprof在编译过程中在函数入口处插入计数器以收集每个函数的被调用情况和被调用次数,检查程序计数器并在分析时找出与程序计数器对应的函数来统计函数占用的时间。

objdump:objdump是反汇编工具。

nm:nm则用于显示关于对象文件、可执行文件以及对象文件库里的符号信息。

对于arm-linux-gnueabihf前缀中hf显示该工具链是完全的硬浮点,由于目前主流的ARM芯片都自带VFP或者NEON等浮点处理单元(FPU),所以对硬浮点的需求就更加强烈。Linux的浮点处理可以采用完全软浮点,也可以采用与软浮点兼容,但是使用FPU硬件的softfp,以及完全硬浮点。具体的ABI(Application Binary Interface,应用程序二进制接口)通过-mfloat-abi=参数指定,3种情况下的参数分别是-mfloat-abi=soft/softfp/hard。在以前,主流的工具链采用“与软浮点兼容,但是使用FPU硬件的softfp”。softfp使用了硬件的FPU,但是函数的参数仍然使用整型寄存器来传递,完全硬浮点则直接使用FPU的寄存器传递参数。经测试,显示一个含有浮点运算的程序若使用hard ABI会比softfp ABI快5%~40%,如果浮点负载重,结果可能会快200%以上。

实验室建设

有时候在自己的电脑上编译一个linux内核需要的时间很长,所以可以想办法把这个编译的步骤移植到服务器上,这样编译时间大大减少。然后把编译好的程序通过网络再传输回自己的电脑上或者目标开发板上。

总结

详情请参考宋宝华老师的书

猜你喜欢

转载自blog.csdn.net/m0_38099380/article/details/89785013