Android培训班(90)内核解压过程3

时间:2022-01-25 12:44:03

下面这段代码,就是设置使用串口作为调试输入输出手段了,因为这种方式是最通用的,目前来说,所有嵌入式处理器都带有串口的,这个是基本配置,因此这种方式最通用,又不用添加什么其它的资源,使用起来非常方便,成为嵌入式软件、操作系统内核必选的调试方式。下面来细细地品读这段代码:

#else



#include<mach/debug-macro.S>

当看到这行代码时,也许你会问,为什么汇编代码里也可以使用C语言的include关键字呢?其实,这是linux下编译系统的一大特色,在汇编代码里,当把后缀名写成大写时,它不是汇编器直接可以编译的代码,而是需要使用C预处理的文件。因此,在这个汇编文件里是可以使用C的预处理指令,这样可以提高汇编代码编写的灵活性,同时也可以让代码处理更加强大的功能。比如包含这个头文件mach/debug-macro.S,就可以根据不同的目录路径来选择同样名称的文件,但这个文件里的处理方式可能不一样,不同的ARM处理器,是使用不一样的输出端口的。像我这里的内核源码目录,就有很多不同开发板,比如mach-s3c6400mach-s3c6410等目录。具体编译时,调用那一个文件是根据makefile文件里定义的参数来决定的。在这个内核里是选择下面的目录文件:

kernel\arch\arm\mach-s3c6400\include\mach

在这个文件里主要是提供了串口的一些宏定义,比如实现怎么样输出到串口,怎么样从串口读取内容。


.macro writeb, ch,rb

senduart\ch, \rb

.endm

在这段代码里,主要就是定义一个宏,这个宏的作用是输出一个字节到某个串口上。上面也看到宏的定义,在linuxARM汇编里,它是使用.macro.endm来构造成一个宏的开始和结束。宏定义的具体形式如下所示:

.macro宏名 参数名列表 @ 伪指令.macro定义一个宏

宏体

.endm @.endm表示宏结束

根据这个格式,就可以知道上面的宏是这样的:宏名称是writeb,参数名列表是chrb。宏体就是senduart\ch,\rb了。这个宏比较简单,就是调用另外一宏senduart来实现这个功能,参数ch是调用宏输出的字节,参数rb是调用宏时选择的串口,比如串口1,还是串口2。这个宏senduart定义在那里呢?找遍整个文件也没有,其实它是定义在下面路径的文件:

arch/arm/plat-s3c/include/plat/debug-macro.S

也就是通过上面的包括的头文件来引入这个宏定义的。


在宏体里使用参数,也是需要注意的,它是在参数前面添加“\“来识别的,像上面的\ch\rb。在宏里想要使用注释代码,只需要空格后面添加@,然后写上注释字符串,就实现一行代码的注释了。

通过这一段代码的学习,认识ARM的汇编代码的格式,包括头文件,预处理,宏的定义,以及宏参数引用,宏的注释等相关知识。因此要编写出来代码,需要学习很多知识才可以成为一个合格的开发人员,不像一般人想像的那么简单的,这种知识就是技术的实力,需要多学习,多记,还需要多练习,才会心神意会,达到“身无彩凤双飞翼,心有灵犀一点通”。


//QQ:9073204 EMAIL:9073204@qq.com

//蔡军生  2012-2-19

//培训文档100元一份