动手写linux驱动(6)--Apple的学习笔记

一,前言

动手写linux驱动(5)--Apple的学习笔记后,今天开始做中断和定时器,中断涉及到硬件,之前反正key中断也做过练习,那么就选择用内核定时器做个小驱动吧。

工程8我自定义了需求,就是fifo驱动写入字符串后,字符读取是一个个每隔2s弹出来的效果。
工程源码在我的gitee上https://gitee.com/applecai/linux-driver-study。

二,遇到的问题

  1. init_timer函数编译不过
    书上用的4.0的内核介绍的init_timer我当前用的5.4内核已经被删除了。timer_list结构体看上去也稍微有变换。所以我先看了help貌似没有api的example,我直接通过timer.h的头文件看注释里面有timer_setup,然后就在c文件中搜索timer_setup,简单看看内核其它模块是如何使用它的,就依样画葫芦,暂时我设计的任务是不遇到问题则不去看源码,之后还会安排一轮内核源码学习专题的。好了用timer_setup代替init_timer解决了。
  2. read驱动是经过了2s弹出一个info,但是app中的%c最后是一下子输出的。另外数据为空时候定时器没有关闭。
    解决方法:我也不去看源码,通过打印效果,给我的感觉就是内核线程优先级高,先运行的是驱动中的read然后再运行用户进程。一下子答应出来。
    所以修改代码app中不打印。直接在kernel中打印解决问题。另外2s的timer中断函数中判断若buffer不为空则重启2s定时器,否则不再重启。定时器是在write驱动中开启的。之后就可以解决如下问题
# insmod applepaper8.ko
[   19.625782] applepaper8: loading out-of-tree module taints kernel.
[   19.634970] Registered character driver
[   19.639145] Registered character driver
[   19.644214] Registered character driver
# ./applepaper8 /dev/applepaper6 &
# [   27.799097] applepaper is set to zero

# echo "applecai">/dev/applepaper6
[   35.734338] written 9 bytes,current_len:9
# [   35.742796] a
[   35.743146] read 1 bytes,current_len:8
[   37.762742] a
[   37.762796] read 1 bytes,current_len:7
[   39.842732] a
[   39.842781] read 1 bytes,current_len:6
[   41.922731] a
[   41.922783] read 1 bytes,current_len:5
[   44.002741] a
[   44.002823] read 1 bytes,current_len:4
[   46.082734] a
[   46.082883] read 1 bytes,current_len:3
[   48.162732] a
[   48.162936] read 1 bytes,current_len:2
[   50.242734] a
[   50.242904] read 1 bytes,current_len:1
[   52.322732] a
[   52.322921] read 1 bytes,current_len:0
applecai
[   54.402732] a
[   54.402779] read 0 bytes,current_len:0
[   56.482737] a
[   56.482788] read 0 bytes,current_len:0
[   58.562750] a
[   58.562801] read 0 bytes,current_len:0

三,测试效果

如下就是我想看到的,写入字符串后,每隔2s从fifo中一个个蹦出来,好玩吧!这就是能灵活运用后的小创造发明~好有成就感,想让他改成什么样就能改成什么样!
最后一个字节为结束符,所以为空,其实我打印的时候可以判断下,是否结束符就不打印。不过打印下也挺好~


image.png

你可能感兴趣的:(动手写linux驱动(6)--Apple的学习笔记)