开发可统计单词个数的Android驱动程序(下)

八、 指定回调函数

本节讲的内容十分关键。不管Linux驱动程序的功能多么复杂还是多么“酷”,都必须允许用户空间的应用程序与内核空间的驱动程序进行交互才有意义。而最 常用的交互方式就是读写设备文件。通过file_operations.read和file_operations.write成员变量可以分别指定读写 设备文件要调用的回调函数指针。

在本节将为word_count.c添加两个函数:word_count_read和word_count_write。这两个函数分别处理从设备文件读 数据和向设备文件写数据的动作。本节的例子先不考虑word_count要实现的统计单词数的功能,先用word_count_read和 word_count_write函数做一个读写设备文件数据的实验,以便让读者了解如何与设备文件交互数据。本节编写的word_count.c文件是 一个分支,读者可在word_count/read_write目录找到word_count.c文件。可以用该文件覆盖word_count目录下的同 名文件测试本节的例子。

本例的功能是向设备文件/dev/wordcount写入数据后,都可以从/dev/wordcount设备文件中读出这些数据(只能读取一次)。下面先看看本例的完整的代码。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>   

#define DEVICE_NAME "wordcount"         //  定义设备文件名
static unsigned char mem[10000];                //  保存向设备文件写入的数据
static char read_flag = 'y';                    //  y:已从设备文件读取数据   n:未从设备文件读取数据
static int written_count = 0;                   // 向设备文件写入数据的字节数   

//  从设备文件读取数据时调用该函数
//  file:指向设备文件、buf:保存可读取的数据   count:可读取的字节数  ppos:读取数据的偏移量
static ssize_t word_count_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
    //  如果还没有读取设备文件中的数据,可以进行读取
    if(read_flag == 'n')
    {
        //  将内核空间的数据复制到用户空间,buf中的数据就是从设备文件中读出的数据
        copy_to_user(buf, (void*) mem, written_count);
        //  向日志输出已读取的字节数
        printk("read count:%d", (int) written_count);
        //  设置数据已读状态
        read_flag = 'y';
        return written_count;
    }
    //  已经从设备文件读取数据,不能再次读取数据
    else
    {
        return 0;
    }
}
//  向设备文件写入数据时调用该函数
//  file:指向设备文件、buf:保存写入的数据   count:写入数据的字节数  ppos:写入数据的偏移量
static ssize_t word_count_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
    //  将用户空间的数据复制到内核空间,mem中的数据就是向设备文件写入的数据
    copy_from_user(mem, buf, count);
    //  设置数据的未读状态
    read_flag = 'n';
    //  保存写入数据的字节数
    written_count = count;
    //  向日志输出已写入的字节数
    printk("written count:%d", (int)count);
    return count;
}
//  描述与设备文件触发的事件对应的回调函数指针
//  需要设置read和write成员变量,系统才能调用处理读写设备文件动作的函数
static struct file_operations dev_fops =
{ .owner = THIS_MODULE, .read = word_count_read, .write = word_count_write };   

//  描述设备文件的信息
static struct miscdevice misc =
{ .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops };   

//  初始化Linux驱动
static int word_count_init(void)
{
    int ret;
    //  建立设备文件
    ret = misc_register(&misc);
    //  输出日志信息
    printk("word_count_init_success\n");
    return ret;
}   

// 卸载Linux驱动
static void word_count_exit(void)
{
    //  删除设备文件
    misc_deregister(&misc);
    //  输出日志信息
    printk("word_init_exit_success\n");
}   

//  注册初始化Linux驱动的函数
module_init( word_count_init);
//  注册卸载Linux驱动的函数
module_exit( word_count_exit);   

MODULE_AUTHOR("lining");
MODULE_DESCRIPTION("statistics of word count.");
MODULE_ALIAS("word count module.");
MODULE_LICENSE("GPL");

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 数据
, 函数
, static
, 统计单词出现个数
, count
, count()
, 设备
, word读取
, 读取word数据
, 读取Word
, count(*)
, read函数
单词数
android驱动开发、android底层驱动开发、android驱动开发书籍、android usb驱动开发、android音频驱动开发,以便于您获取更多的相关知识。

时间: 2024-10-02 19:41:40

开发可统计单词个数的Android驱动程序(下)的相关文章

开发可统计单词个数的Android驱动程序(中)

五.指定与驱动相关的信息 虽然指定这些信息不是必须的,但一个完整的Linux驱动程序都会指定这些与驱动相关的信息.一般需要为Linux驱动程序指定如下信息. 1. 模块作者:使用MODULE_AUTHOR宏指定. 2. 模块描述:使用MODULE_DESCRIPTION宏指定. 3. 模块别名:使用MODULE_ALIAS宏指定. 4. 开源协议:使用MODULE_LICENSE宏指定. 除了这些信息外,Linux驱动模块自己还会包含一些信息.读者可以执行下面的命令查看word_count.ko

开发可统计单词个数的Android驱动程序(3)

开发可统计单词个数的Android驱动程序(1) 五.指定与驱动相关的信息 虽然指定这些信息不是必须的,但一个完整的Linux驱动程序都会指定这些与驱动相关的信息.一般需要为Linux驱动程序指定如下信息. 1. 模块作者:使用MODULE_AUTHOR宏指定. 2. 模块描述:使用MODULE_DESCRIPTION宏指定. 3. 模块别名:使用MODULE_ALIAS宏指定. 4. 开源协议:使用MODULE_LICENSE宏指定. 除了这些信息外,Linux驱动模块自己还会包含一些信息.读

开发可统计单词个数的Android驱动程序(上)

Android本质上是基于Linux内核的系统,也就是说Android就是一种Linux操作系统.只不过大多数时候都会运行在ARM架构的设备上,例如,Android手机.平板等.Android驱动实际上就是Linux驱动,只是这里使用Android深度探索(卷1):安装C/C++交叉编译环境 介绍的交叉编译器将Linux驱动编译成了ARM架构的,所以驱动可以安装在Android模拟器.Android手机(需要root)或平板上(这些设备 都要使用给予ARM架构的CPU),当然,使用传统的GCC也

《Android深度探索(卷1):HAL与驱动开发》——6.3节第一个Linux驱动:统计单词个数

6.3 第一个Linux驱动:统计单词个数Android深度探索(卷1):HAL与驱动开发源程序目录:<光盘根目录>/sources/word_count本节将给出我们的第1个Linux驱动的例子.这个驱动程序并没有访问硬件,而是利用设备文件作为介质与应用程序进行交互.应用程序通过向设备文件传递一个由空格分隔的字符串(每一个被空格隔开的子字符串称为一个单词),然后从设备文件读出来的是该字符串包含的单词数.本例的驱动程序使用C语言实现,源代码文件路径如下. 6.3.1 编写Linux驱动程序前的

Linux驱动程序:统计单词个数

本例为Android升读探索(卷1):HAL与驱动开发 一书中附带的示例程序.现粘贴出来,以便查阅. 终端操作,可能用到的命令: insmond word_count.ko lsmod | grep word_count 查看驱动是否安装成功 rmmod word_count dmesg | grep word_cout | tail -n 2 查看有linux驱动输出的日志信息 cat /var/log/syslong | grep word_count | tail -n 2 modinfo

C语言编程中统计输入的行数以及单词个数的方法_C 语言

统计输入的行数 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束.因此,统计行数等价于统计换行符的个数. #include <stdio.h> /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } 在该程序中,while 循环语句的循环体是一个 if 语句,它控

Python实现统计单词出现的个数

  这篇文章主要介绍了Python实现统计单词出现的个数,本文给出了实现代码以及使用方法,需要的朋友可以参考下 最近在看python脚本语言,脚本语言是一种解释性的语言,不需要编译,可以直接用,由解释器来负责解释.python语言很强大,而且写起来很简洁.下面的一个例子就是用python统计单词出现的个数. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import sys import string #import collectio

AMD开发针对AMD硬件产品的Android驱动程序

在对Google Android系统平台观察良久之后,AMD终于正式启程,并且已经开始招募工程师,开发针对AMD硬件产品的Android驱动程序.AMD在其官方网站上连续张贴了两份招聘启事,都属于软件工程方面,其一是寻求"Linux驱动程序开发工程师",加入其Linux基础图形团队,主要工作是为Android平台开发驱动程序堆栈,并且要符合Android生态系统的开发趋势,尤其需要应聘者具备在Android网络浏览器或者视频播放器软件中的视频解码加速开发经验,再有webm和/或Open

安卓(Android)开发之统计App启动时间_Android

前言 作为 Android 开发者,想必多多少少要接触启动速度优化相关的事情,当用户越来越多,产品的功能也随着迭代越来越多,App 逐渐变得臃肿是一件很常见的现象,甚至可以说是不可避免的现象,随之而来的工作就是优化 App 性能,其中最主要的一项就是启动速度优化.但本文的主角并不是启动速度优化,而是启动时间统计. 一.启动类型 工欲善其事,必先利其器.想要优化 App 的启动速度,必须有准确衡量启动时间的方法,否则优化完之后效果怎样,自己都不知道,说出去别人也不信服不是.在做 App 启动时间统