linux驱动开发之前篇1

来源:互联网 发布:ios开发 耗电量优化 编辑:程序博客网 时间:2024/05/22 00:14

1:交叉开发工具

交叉工具链概念:
在宿主机上进行预处理、编译、汇编、链接等工作,以生成能在目标机上运行的程序的过程称为交叉编译。在宿主机上执行预处理、编译、汇编、链接等工作的一系列工具称为交叉工具链。
嵌入式设备不具备二次开发能力,所以一般是在PC机上对嵌入式设备做开发。pc机大多都是x86的架构,而嵌入式设备则不缺定!我今天要说的是arm架构(平台是飞凌的OK6410开发板)。
嵌入式开发人员必定会熟悉编译工具gcc,这是一款x86下的编译器,编译的c或c++程序只能在x86机器下执行;为了能够让pc机能够编译出arm架构下的可执行程序,飞凌官方给出了交叉编译工具:arm-linux-gcc等工具。需要对c原码使用arm-linux-gcc编译才能在arm板子上执行,接下来讨论如何配置的问题:
1)首先找到交叉开发工具包:比如我的是arm-linux-4.2.2-eabi.tar.gz;
2)解压到/usr/local/arm/;当然arm是我自己建的文件夹。使用命令:tar -xzf arm-linux-4.2.2-eabi.tar.gz
其实到这里,arm-linux-gcc 已经可以使用了,但是仅限于此目录下:/usr/local/arm/4.2.2-eabi/usr/bin,这样看起来不是很方便,为了达到和gcc使用一样方便的效果,在此还需要进行第三步:
3)修改配置文件:/etc/profie
在文件最后加上:export PATH=$PATH:/usr/local/arm/4.2.2-eabi/usr/bin。(注意加压路径和文件名字的正确)。
当然还有一些配置方法,比如修改/etc/environment也可以实现。
4)测试:重新打开一个终端,在终端中输入:arm-,然后按tab,可以看到在终端中列出了以arm-开头的交叉编译工具链,这说明交叉工具链已经安装成功并可以使用了。
总结:嵌入式系统构建之工具链的安装,只有安装好工具链之后才能谈嵌入式的开发。这里还需要注意的是,对于不同版本的u-boot或者内核,可能需要选择不同版本的交叉工具链,特别是对于一些老的u-boot,较新版本的交叉工具链可能可能无法编译通过,这时因为较老的u-boot的makefile中可能使用了一些已经不再使用的编译选项。

2:驱动模块编译

在嵌入式驱动开发过程中,模块化的驱动编译,给我们带来了极大的便利。(如果没有模块化的编译机制必将浪费宝贵的时间)。在编译驱动模块之前,先介绍一种方法:make menuconfig的使用:这是内核编译中的图形界面非常好用,图形界面中出现的内容是和文件kconfig相关的,修改了kconfig后menuconfig图形界面便会显示已经配置的选项。Makefile的使用:在顶层目录下执行命令:make zImage 便会对内核进行编译

以下步骤可以实现驱动程序的模块化的编译机制:
1)将写好的驱动程序拷到(原码)内核代码树中。(比如我将写好的驱动程序:hello.c放到linux-3.0.1/drivers/char目录下)
2)修改Kconfig:按照原有的格式加入自己的驱动程序,比如加入我的hello的驱动:config CONFIG_6410_HELLO(此文件名称需要与对应目录下的Makefile变量保持一至)
3)修改Makefile:打开与修改好的Kconfig目录下的Makefil文件,在文件尾添加:obj -$(CONFIG_6410_HELLO) +=hello.o
4)编译内核模块:不需要编译整个内核模块,只需要指定编译就可以;执行命令:make modules SUBDIRS=drivers/char(driver/char是hello.c所在的内核目录)
编译完成后会在drivers/char/目录下生成hello.ko的内核模块
5)加载:将编译好的.ko模块拷贝到开发板上,使用命令:insmod hello.ko ,如果内核版本匹配那么则就加载上去了。
显然按照上诉步骤做是可以编译好内核模块的,可是步骤有些繁琐,再此,引用一种经典的Makefile加载方法:

ifneq ($(KERNELRELEASE),)    obj-m := led_driver.oelse    KDIR := /home/linux-3.0.1all:    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-clean:    rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*endif

3:ctags的使用

对于Linux下的C/C++的程序员,使用 vim+ctags的组合来写程序也许是最佳的选择。本节我们主要讲一下ctags这个程序。尽管ctags也可以支持其它编辑器,但是它正式支持的只有vim。并且vim中已经默认安装了 ctags,它可以帮助程序员很容易地浏览源代码。熟练的使用ctags仅需记住下面七条命令:1)$ ctags –R * ($为Linux系统Shell提示符)

参数说明:
“$ ctags –R ”:“-R”表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录。 “”表示所有文件。
作用:
这条命令会在当前目录下产生一个“tags”文件, 当用户在当前目录中运行vim时,会自动载入此tags文件。tags文件中包括这些对象的列表:用#define定义的宏枚、举型变量的值、函数的定义、原型 和声明名字空间(namespace)、类型定义(typedefs)、变量(包括定义和声明)类(class)、结构(struct)、枚举类型(enum)和联合(union)类、结构和联合中成员变量或函数。vim用这个“tags”文件来定位上面这些做了标记的对象。
2)vimttag(tag) vim –t tag” :在运行vim的时候加上“-t”参数,
例如:[/usr/src]$ vim -t main这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。
3)ts (ts 助记字:tags list, “:”开头的命令为vim中命令行模式命令)
如果这个变量或函数有多处定义,在vim命令行模式“:ts” 命
令就能列出一个列表供用户选择,输入数字定位到相关文件。
4)tp (tp 助记字:tags preview)此命令不常用,可以不用记。
5)tn (tn 助记字:tags next) 此命令不常用,可以不用记
“:tp”为上一个tag标记文件,“:tn”为下一个tag标记文件。当然,若当前tags文件中用户所查找的变量或函数名只有一 个,“:tp,:tn”命令不可用。
6)Ctrl + ]
7)Ctrl + T
(最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中,并把光标定位到这一行。用 “Ctrl+t”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个变量,按N次“Ctrl+t”也能回到最初打开的文件,它会按原路返 回 。

特别注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件 的路径,这样vim才能找到“tags”文件。在完成编码时,可以手工删掉tags文件。设置方法:用vim打开一个文件,在莫行模式下:set tags=/home/xxx/linux-3.0.1/tags
0 0
原创粉丝点击