美文网首页BB-black开发板[Linux arm-v8]
动手写驱动(3)--Apple的学习笔记

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

作者: applecai | 来源:发表于2020-10-27 22:11 被阅读0次

    一,前言

    动手写驱动(2)--Apple的学习笔记之前已经做完了锁,现在做阻塞和非阻塞练习。

    工程5是一个fifo来模拟阻塞。就是写入后才能读,读完清空后就阻塞不能读了。主要就是测试这个效果。另外驱动的功能包括写满后阻塞写,需要读取清空后才可以继续写。通过宏定义可以修改为非阻塞,用户主动请求尝试不断读取信息,这样很耗费CPU,正常不会使用的,只是为了和阻塞休眠情况做对比。

    工程5源码上传在gitee上https://gitee.com/applecai/linux-driver-study

    二,遇到的问题

    1.signal_pending没有添加头文件。通过在include文件夹中搜索到头文件如下。另外发现一个signal_pending(current)的宏定义。


    image.png

    2.APP中while一直读,read应该按返回值长度判断来读取,我一开始读取的最后一个byte都为D,比我也如的内容要多一个字节,原因是没有判断EOF,所以不正确,应该判断readval==1后读取一个%c。

    三,测试效果

    工程5的阻塞效果
    define SUPPORT_NONBLOCK 为0。阻塞的话,读取不到数据则进程休眠,让出cpu,通过top看到cpu占用率为0.

    # cd /usr/study/
    # insmod applepaper5.ko
    [   16.628345] applepaper5: loading out-of-tree module taints kernel.
    [   16.636220] Registered character driver
    [   16.640318] Registered character driver
    [   16.645580] Registered character driver
    # ./applepaper5 /dev/applepaper6 &
    # echo "Hi AppleCai" > /dev/applepaper6
    [   35.646176] written 12 bytes,current_len:12
    [   35.650472] read 1 bytes,current_len:11
    # [   35.656943] read 1 bytes,current_len:10
    [   35.660827] read 1 bytes,current_len:9
    [   35.665313] read 1 bytes,current_len:8
    [   35.669103] read 1 bytes,current_len:7
    [   35.673411] read 1 bytes,current_len:6
    [   35.677197] read 1 bytes,current_len:5
    [   35.680971] read 1 bytes,current_len:4
    [   35.685707] read 1 bytes,current_len:3
    [   35.689499] read 1 bytes,current_len:2
    [   35.693801] read 1 bytes,current_len:1
    [   35.697587] read 1 bytes,current_len:0
    Hi AppleCai
    
    # echo "Good night!" > /dev/applepaper6
    [   57.438287] written 12 bytes,current_len:12
    [   57.442583] read 1 bytes,current_len:11
    # [   57.449291] read 1 bytes,current_len:10
    [   57.453405] read 1 bytes,current_len:9
    [   57.457184] read 1 bytes,current_len:8
    [   57.460958] read 1 bytes,current_len:7
    [   57.465580] read 1 bytes,current_len:6
    [   57.469370] read 1 bytes,current_len:5
    [   57.473769] read 1 bytes,current_len:4
    [   57.477553] read 1 bytes,current_len:3
    [   57.481326] read 1 bytes,current_len:2
    [   57.485669] read 1 bytes,current_len:1
    [   57.489453] read 1 bytes,current_len:0
    Good night!
    
    # top
    Mem: 20816K used, 482640K free, 44K shrd, 0K buff, 1952K cached
    CPU:   0% usr  10% sys   0% nic  90% idle   0% io   0% irq   0% sirq
    Load average: 0.06 0.03 0.01 1/53 114
      PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
      114   110 root     R     1500   0%  10% top
      110     1 root     S     1536   0%   0% -sh
        1     0 root     S     1500   0%   0% init
       81     1 root     S     1492   0%   0% /sbin/syslogd -n
       85     1 root     S     1488   0%   0% /sbin/klogd -n
      113   110 root     S      688   0%   0% ./applepaper5 /dev/applepaper6
       49     2 root     IW       0   0%   0% [kworker/0:3-nfs]
       60     2 root     IW<      0   0%   0% [kworker/u3:2-xp]
       48     2 root     IW       0   0%   0% [kworker/0:2-eve]
       65     2 root     IW<      0   0%   0% [kworker/u3:3-xp]
       15     2 root     IW       0   0%   0% [kworker/0:1-rcu]
       10     2 root     IW       0   0%   0% [rcu_sched]
       62     2 root     IW       0   0%   0% [kworker/u2:3-rp]
       13     2 root     SW       0   0%   0% [kdevtmpfs]
       63     2 root     IW       0   0%   0% [kworker/u2:4-rp]
       61     2 root     IW       0   0%   0% [kworker/u2:2-rp]
        7     2 root     IW       0   0%   0% [kworker/u2:0-rp]
        9     2 root     SW       0   0%   0% [ksoftirqd/0]
       45     2 root     IW       0   0%   0% [kworker/u2:1-rp]
       41     2 root     IW<      0   0%   0% [kworker/u3:0-xp]
    

    define SUPPORT_NONBLOCK 为1。通过open函数设置阻塞,非阻塞的话,就是不断的读,用户需要主动查询io状态,通过top看到cpu占用率为92%

    # cd /usr/study/
    # insmod applepaper5.ko
    [   17.386455] applepaper5: loading out-of-tree module taints kernel.
    [   17.395648] Registered character driver
    [   17.399782] Registered character driver
    [   17.404778] Registered character driver
    # ./applepaper5 /dev/applepaper6 &
    # echo "hello AppleCai" > /dev/applepaper6
    [   44.461110] written 15 bytes,current_len:15
    [   44.465535] read 1 bytes,current_len:14
    [   44.469499] read 1 bytes,current_len:13
    # [   44.476826] read 1 bytes,current_len:12
    [   44.480756] read 1 bytes,current_len:11
    [   44.485496] read 1 bytes,current_len:10
    [   44.489440] read 1 bytes,current_len:9
    [   44.493746] read 1 bytes,current_len:8
    [   44.497531] read 1 bytes,current_len:7
    [   44.501307] read 1 bytes,current_len:6
    [   44.505793] read 1 bytes,current_len:5
    [   44.509579] read 1 bytes,current_len:4
    [   44.513816] read 1 bytes,current_len:3
    [   44.517597] read 1 bytes,current_len:2
    [   44.521371] read 1 bytes,current_len:1
    [   44.525670] read 1 bytes,current_len:0
    hello AppleCai
    
    # top
    Mem: 20824K used, 482632K free, 44K shrd, 0K buff, 1952K cached
    CPU:  16% usr  83% sys   0% nic   0% idle   0% io   0% irq   0% sirq
    Load average: 0.42 0.11 0.04 2/54 115
      PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
      114   111 root     R      688   0%  92% ./applepaper5 /dev/applepaper6
      115   111 root     R     1500   0%   8% top
      111     1 root     S     1536   0%   0% -sh
        1     0 root     S     1500   0%   0% init
       82     1 root     S     1492   0%   0% /sbin/syslogd -n
       86     1 root     S     1488   0%   0% /sbin/klogd -n
       48     2 root     IW       0   0%   0% [kworker/0:2-eve]
       49     2 root     IW       0   0%   0% [kworker/0:3-nfs]
       41     2 root     IW<      0   0%   0% [kworker/u3:0-xp]
       68     2 root     IW<      0   0%   0% [kworker/u3:3-xp]
       15     2 root     IW       0   0%   0% [kworker/0:1-rcu]
       64     2 root     IW       0   0%   0% [kworker/u2:5-rp]
       10     2 root     IW       0   0%   0% [rcu_sched]
        7     2 root     IW       0   0%   0% [kworker/u2:0-rp]
       60     2 root     IW<      0   0%   0% [kworker/u3:2-xp]
        9     2 root     SW       0   0%   0% [ksoftirqd/0]
       45     2 root     IW       0   0%   0% [kworker/u2:1-rp]
       13     2 root     SW       0   0%   0% [kdevtmpfs]
        5     2 root     IW       0   0%   0% [kworker/0:0-rcu]
        8     2 root     IW<      0   0%   0% [mm_percpu_wq]
    

    相关文章

      网友评论

        本文标题:动手写驱动(3)--Apple的学习笔记

        本文链接:https://www.haomeiwen.com/subject/rvcfvktx.html