三大帮助命令:
man -a XXX
info XXX
arm-elf-XXX 工具集是用于uclinux的。
设备驱动程序的开发过程:
1.查看原理图,理解设备的工作原理。
2.定义设备号。
3.实现初始化函数。驱动的注册和卸载。
4.设计所要实现的文件操作,定义file_operations结构。
5.实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。
6.编译该驱动程序到内核中,或者用insmod命令加载模块。
7.测试该设备,编写应用程序,对驱动程序进行测试。
与中断和内存不同,使用一个没有申请的I/O端口不会使处理器产生异常,也就不会导致诸如“segmentationfault”一类的错误发生。由于任何进程都可以访问任何一个I/O端口,此时系统无法保证对I/O端口的操作不会发生冲突,甚至因此而使系统崩溃。因此,在使用I/O端口前,也应该检查此I/O端口是否已有别的程序在使用,若没有,再把此端口标记为正在使用,在使用完以后释放它。在设备驱动程序中,一般都需要用到计时机制。在Linux系统中,时钟是由系统接管的,设备驱动程序可以向系统申请时钟。printk打印的信息不仅出现在屏幕上,同时还记录在文件syslog里。
内核模块与系统中其他程序一样是已链接的目标文件,但不同的是它们被链接成可重定位映像。内核将为其分配一个新的module结构,以及足够的内核内存,并将新模块添加在内核模块链表的尾部,然后将新模块标记为uninitialized。
老的:
ret = devfs_register_chrdev(GPIO_LED_MAJOR,"led_drv", &GPIO_LED_ctl_ops);
混杂设备:
ret= misc_register(&misc);
块设备驱动程序的编写与字符设备驱动程序的编写有很大不同,块设备驱动最具特色的就是其请求队列。块设备一般有个通用块层。一个bio结构体是在通用块层或更底层对块设备i/o操作的的表示单位。通常1个bio对应1个I/O请求。
查看可执行映像的大小:size
得到映像文件或目标文件中的符号列表:objdump -syms test.o
反汇编映像文件:objdump -disassemble test.o
编译一个源文件:gcc test.c -o test 或者 gcc -o image first.c second.c thrid.c
包含头文件编译:gcc test.c -I../inc/ -I../../inc2 -o test
在源文件中定义的符号常量(使用:#define)可以在编译的时候使用:gcc -D TEST_CONFIGURATION test.c -o test
一些调试选项加上 -g
检查普通警告的选项是-Wall
此外,还有一些优化等级选项。