05 Linux驱动基本开发.pptVIP

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
05 Linux驱动基本开发

Linux驱动基本开发 Andrew Huang bluedrum@163.com Gcc的用法 Andrew Huang bluedrum@163.com 宏里的# #表示源码里字符强制转成字符串 int xy , #xy --xy 宏里面的## ##用来做符号表的链接,一般用来在宏里动态定义变量和函数 标准C的结构初始化 缺点 1.中间错一个,后面全错 2.如果成员较多,必须全部初始化 GCC的结构初始化 gcc可以使用 .成员名 = 值 来初始化. 优点1,没有前后顺序 优点2,不须要全部初始化 Gcc字节对齐相关 在应用程序使用 __attribute__((packed)) 取消字节对齐 = __attribute__((aligned((1))));, 在内核里可以调整对齐字节数 __attribute__((aligned((n))));, n为2的次方数, __section() __section(.init.text)表示强制所放.init.text段而非缺省.text段当中 以下把testSec函数链接到.init.text段中\ 可以readelf -a mymod.ko mymod.txt module Andrew Huang bluedrum@163.com 最简单动态模块框架 只需要用 module_init()注册模块初始化函数 module_exit(),注册模块注销函数 关于module_init 独立模块Makefile $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 用make是使用内核的Makefile,并且创建环境变量M,它的等于当前目录,并第一个执行modules这个规则 在模块目录下执行make 测试模块 不能移出模块的bug rmmod mymod rmmod: chdir(): No such file or directory 错误原因 rmmod会先要找目录/lib/modules/版本号. 其中版本号是 uname -r 的值 所以解决办法是在根文件系统建立这个目录 这rmmod找不到,但是不影响rmmod,主要是rmmod在lib/modules/版本号目录下找不到对应.ko 增加调试输出 在内核的输出用不是printf,而是printk. printf使用标准C库,让代码增加很多 printf在并发输出容易发生混乱. printk没有上述缺点,专门针对内核优化。 printk输出一个内存环形队列。它可以由dmesg反复查看这个队列. dmesg 查看自启动以来所有printk的信息 dmesg | tail #查看最后十行输出 printk输出格式 基本跟printf一样,可以接可变参数,但多一个输出级别 printk(3hello);输出级别为3的信息 printk(KERN_INFO Process accounting resumed\n);//用宏输出,增加可读性 printk(KERN_INFO Converted Value: %03d\n, adc_value); printk(hello\n); //表示用缺省级别 printk测试 关于在驱动里的IO地址 ARM程序一般用物理地址。 LINUX已经打开MMU,所以必须要虚拟地址。 使用虚拟地址方法: 使用LINUX预先定义的好虚拟地址宏 #define S3C64XX_GPFCON (S3C64XX_GPF_BASE + 0x00) 使用ioremap临时动态申请一个页来映射 关I/O地址读写 CPU关于I/O地址(外设寄存器)的访问有两种模式: 一种端口映射,以X86为代表,它的I/O地址与内存是分离的,必须用专门汇编来访问 另外一种内存映射,以ARM为代表,的I/O地址与内存是统一编址.这种编程只需要用指针来操作. Linux的I/O读写 它建议writel/readl/writew/readw/writeb/readw来操作I/O地址,这样是可以多个CPU下的移植的工作量最小。 *(volatile unsigned char *)(a) = (v)) 1.为什么定义unsigned ? 2. volatile是什么用处? 3. *(volatile unsigned char *)(a) ,第一个*表示什么含意? 为什么定义unsigned 防止算术移位造成值不确定 请编程确定在LINUX的算术右移的补位规则。 volatile是什么用处 表示禁止编成器对于变量/地址的读写优化 应用场合 多线程共享变量 硬件地址 汇编/C共同处理变量。 中断里变量 Leds硬件分析 接在GPM0-GPM3上面,它输出脚为1,用三极管打开接地,在VDD_IO

文档评论(0)

118zhuanqian + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档