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 word_count.ko 查看驱动的信息

驱动源代码

#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 int word_count = 0;
#define TRUE 255
#define FALSE 0

//  判断指定字符是否为空格(包括空格符、制表符、回车符和换行符)
static unsigned char is_spacewhite(char c)
{
	if (c == 32 || c == 9 || c == 13 || c == 10)
		return TRUE;
	else
		return FALSE;
}

static int get_word_count(const char *buf)
{
	int n = 1;
	int i = 0;
	char c = ' ';

	char flag = 0; // 处理多个空格分隔的情况,0:正常情况,1:已遇到一个空格
	if (*buf == '\0')
		return 0;
	//  第1个字符是空格,从0开始计数
	if (is_spacewhite(*buf) == TRUE)
		n--;

	//  扫描字符串中的每一个字符
	for (; (c = *(buf + i)) != '\0'; i++)
	{
		//  只由一个空格分隔单词的情况
		if (flag == 1 && is_spacewhite(c) == FALSE)
		{

			flag = 0;
		}
		//  由多个空格分隔单词的情况,忽略多余的空格
		else if (flag == 1 && is_spacewhite(c) == TRUE)
		{

			continue;
		}
		//  当前字符为空格是单词数加1
		if (is_spacewhite(c) == TRUE)
		{
			n++;
			flag = 1;
		}
	}
	//  如果字符串以一个或多个空格结尾,不计数(单词数减1)
	if (is_spacewhite(*(buf + i - 1)) == TRUE)
		n--;
	return n;
}

static ssize_t word_count_read(struct file *file, char __user *buf,
        size_t count, loff_t *ppos)
{
	unsigned char temp[4];

	temp[0] = word_count >> 24;
	temp[1] = word_count >> 16;
	temp[2] = word_count >> 8;
	temp[3] = word_count;
	if (copy_to_user(buf, (void*) temp, 4))
	{
		return -EINVAL;
	}
	printk("read:word count:%d", (int) count);

	return count;
}

static ssize_t word_count_write(struct file *file, const char __user *buf,
        size_t count, loff_t *ppos)
{
	ssize_t written = count;

	if (copy_from_user(mem, buf, count))
	{
		return -EINVAL;
	}
	mem[count] = '\0';
	word_count = get_word_count(mem);
	printk("write:word count:%d\n", (int) word_count);

	return written;
}

//  描述与设备文件触发的事件对应的回调函数指针
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 __init word_count_init(void)
{
	int ret; 

	//  建立设备文件
	ret = misc_register(&misc);

	//  输出日志信息
	printk("word_count_init_success\n");

	return ret;
}

// 卸载Linux驱动
static void __exit word_count_exit(void)
{
	//  删除设备文件
	misc_deregister(&misc);

	//  输出日志信息
	printk("word_count_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");

测试代码

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
	int testdev;
	unsigned char buf[4];

	testdev = open("/dev/wordcount", O_RDWR);
	if (testdev == -1)
	{
		printf("Cann't open file \n");
		return 0;
	}
	if (argc > 1)
	{

		write(testdev, argv[1], strlen(argv[1]));
		printf("string:%s\n", argv[1]);
	}

	read(testdev, buf, 4);

	int n = 0;
	//  将4个字节还原成int类型的值
	n = ((int) buf[0]) << 24 | ((int) buf[1]) << 16 | ((int) buf[2]) << 8
	        | ((int) buf[3]);
	printf("word byte display:%d,%d,%d,%d\n", buf[0], buf[1], buf[2], buf[3]);
	printf("word count:%d\n", n);
	close(testdev);
	return 0;
}

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

时间: 2024-10-11 18:54:46

Linux驱动程序:统计单词个数的相关文章

第6章: 第一个Linux驱动程序统计单词个数

6章: 第一个Linux驱动程序统计单词个数 编写Linux驱动的程序的步骤: 第1步:建立 Linux 驱动骨架(装载和卸载 Linux 驱动) 第2步:注册和注销设备文件 第3步:指定与驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步:编写 Makefile 文件 第7步:编译 Linux 驱动程序 第8步:安装和卸载 Linux 驱动 Linux驱动测试的方法多种多样: 1.使用Ubuntu Linux测试Linux驱动 2.在Android模拟器上通过原(Native)

第一个Linux驱动程序统计单词个数

Linux驱动的工作和访问方式是Linux的亮点之一,Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易,当然也比访问LinuxAPI更容易. 编写Linux驱动的程序的步骤: 第1步:建立 Linux 驱动骨架(装载和卸载 Linux 驱动) 第2步:注册和注销设备文件 第3步:指定与驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步:编写 Makefile

第六章第一个Linux驱动程序:统计单词个数

第六章介绍如何在多种平台,使用多种方法测试Linux驱动. 本章主讲统计单词个数的算法的实现技术:Linux驱动.统计单词个数的功能是封装在Linux驱动中的.驱动不一定是直接和硬件打交道的,还可以喝普通的library一样提供其他程序的调用来实现特定功能的. 第一节Linux驱动到底是个什么东西 Linux驱动和普通的Linux API没有本质上的区别,只是使用Linux驱动的方式和使用Linux API的方法不同. Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,

第六章 第一个Linux驱动程序:统计单词个数 心得笔记

一.Linux系统将每个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这使得与Linux驱动进行交互就向与普通文件进行交互一样容易.大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据变成与驱动设备交换数据. 二.编写Linux驱动程序 1.建立Linux驱动骨架           Linux内核在使用驱动时需要装载与卸载驱动        装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化        

第六章 第一个Linux驱动程序:统计单词个数

在本章将进入了最令人激动的时刻,为了是读者在刚开始学习Linux驱动开发时充满期待,没有只提供Helloworld程序. 首先介绍Linux驱动到底是个什么东西,它和我们以前接触过的windows类型差不多,但是操作和工作方式有很大的区别,Linux系统将每一个驱动都映射成一个文件.这些文件成为设备文件或这驱动文件,都保存在/dev目录中. 接下来给出编写Linux驱动程序的步骤:第一步:建立Linux驱动骨架,Linux驱动程序中需要提供两个函数来分别处理驱动初始化和退出的工作.这两个函数分别

六、第一个Linux驱动程序:统计单词个数 ——学习笔记

第6章 第一个Linux驱动程序:统计单词个数 ——学习笔记 一.首先了解一下: 打印机驱动写入数据:对于打印机驱动来说,需要接收这些被写入的数据,并将它们通过PC的并口.USB等端口发送给打印机.要实现这一过程就需要Linux驱动可以响应应用程序传递过来的数据.这就是Linux驱动的事件,虽然在C语言里没有事件的概念,但却有与事件类似的概念,这就是回调(callback)函数.因此,编写Linux驱动最重要的一步就是编写回调函数,否则与设备文件交互的数据将无法得到处理.图6-1是应用软件.设备

第六章:第一个Linux驱动程序:统计单词个数

Linux驱动的工作和访问方式是Linux的亮点之一,Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.Linux驱动交换数据就就是设备文件交换数据.在进行设备文件交互时,必须编写回调函数,否则设备文件无法得到处理.编写Linux驱动程序的步骤如下:1.建立Linux驱动骨架(装载和卸载Linux驱动).2.注册和注销设备文件.3.指定与驱动相关的信息.4.指定回调函数.5.

第六章、第一个Linux驱动程序:统计单词个数

通过对这一章的学习,我学会了一个完整的Linux驱动:统计单词数的word_count驱动,并学会了如同使用不同的方法来测试Linux驱动,也对Linux的驱动开发过程有了更深刻的了解. 一.编写Linux驱动程序的步骤 1.建立Linux驱动骨架 Module_init处理驱动初始化,module_exit处理驱动退出 2.注册和注销设备文件   Misc_register函数创建和misc_deregister移除设备文件 3.指定与驱动相关的信息 4.指定回调函数 5.编写业务逻辑 6.编

第六章、第一个linux驱动程序:统计单词个数 读书笔记

第六章.第一个linux驱动程序:统计单词个数 一.编写Linux驱动程序的步骤 1.建立Linux驱动骨架(装载和卸载Linux驱动) Module_init处理驱动初始化,module_exit处理驱动退出 2.注册和注销设备文件 Misc_register函数创建和misc_deregister移除设备文件 3.指定与驱动相关的信息 modinfo 4.指定回调函数 5.编写业务逻辑 6.编写makefile文件 7.编译Linux驱动程序 8.安装和卸载Linux驱动 二.Linux驱动