热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

201820191201653032016531620165335实验四外设驱动程序设计

实验四外设驱动程序设计-1学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章提交康奈尔笔记的照片(可以多张)实验四

实验四外设驱动程序设计-1

  • 学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章
    提交康奈尔笔记的照片(可以多张)
    1296850-20181202191027086-1799440137.jpg

1296850-20181202191033478-712078270.jpg

1296850-20181202191040048-65644097.jpg

实验四外设驱动程序设计-2

  • 在Ubuntu完成资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章的test试验
    提交编译,加载模块,卸载模块,测试运行的截图(要多张,全屏,体现学号信息)
    Makefile

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/3.2.0-24-generic/build
PWD := $(shell pwd)
modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
elseobj-m := test_drv.o
endif

test.c

/* test.c */#include #include #include #include #include #include #include #define TEST_DEVICE_FILENAME "/dev/test_dev"#define BUFF_SZ 1024int main(){int fd, nwrite, nread;char buff[BUFF_SZ];fd &#61; open(TEST_DEVICE_FILENAME, O_RDWR);if (fd <0){perror("open");exit(1);}do{printf("Input some words to kernel(enter &#39;quit&#39; to exit):");memset(buff, 0, BUFF_SZ);if (fgets(buff, BUFF_SZ, stdin) &#61;&#61; NULL){perror("fgets");break;}buff[strlen(buff) - 1] &#61; &#39;\0&#39;;if (write(fd, buff, strlen(buff)) <0){perror("write");break;}if (read(fd, buff, BUFF_SZ) <0){perror("read");break;}else{printf("The read string is from kernel:%s\n", buff);}} while(strncmp(buff, "quit", 4));close(fd);exit(0);}

test_drv.c

/* test_drv.c */#include #include #include #include #include #include #include #include #include #define TEST_DEVICE_NAME "test_dev"#define BUFF_SZ 1024static struct cdev test_dev;unsigned int major &#61;0;static char *data &#61; NULL;/*º¯ÊýÉùÃ÷*/static ssize_t test_read(struct file *file, char *buf, size_t count, loff_t *f_pos);static ssize_t test_write(struct file *file,const char *buffer, size_t count,loff_t *f_pos);static int test_open(struct inode *inode, struct file *file);static int test_release(struct inode *inode,struct file *file);static ssize_t test_read(struct file *file, char *buf, size_t count, loff_t *f_pos){int len;if (count <0 ){return -EINVAL;}len &#61; strlen(data);count &#61; (len > count)?count:len;if (copy_to_user(buf, data, count)){return -EFAULT;}return count;}static ssize_t test_write(struct file *file, const char *buffer, size_t count, loff_t *f_pos){if(count <0){return -EINVAL;}memset(data, 0, BUFF_SZ);count &#61; (BUFF_SZ > count)?count:BUFF_SZ;if (copy_from_user(data, buffer, count)){return -EFAULT;}return count;}static int test_open(struct inode *inode, struct file *file){printk("This is open operation\n");data &#61; (char*)kmalloc(sizeof(char) * BUFF_SZ, GFP_KERNEL);if (!data){return -ENOMEM;}memset(data, 0, BUFF_SZ);return 0;}static int test_release(struct inode *inode,struct file *file){printk("This is release operation\n");if (data){kfree(data);data &#61; NULL;}return 0;}static void test_setup_cdev(struct cdev *dev, int minor,struct file_operations *fops){int err, devno &#61; MKDEV(major, minor);cdev_init(dev, fops);dev->owner &#61; THIS_MODULE;dev->ops &#61; fops;err &#61; cdev_add (dev, devno, 1);if (err){printk (KERN_NOTICE "Error %d adding test %d", err, minor);}}static struct file_operations test_fops &#61; {.owner &#61; THIS_MODULE,.read &#61; test_read,.write &#61; test_write,.open &#61; test_open,.release &#61; test_release,};int init_module(void){int result;dev_t dev &#61; MKDEV(major, 0);if (major){result &#61; register_chrdev_region(dev, 1, TEST_DEVICE_NAME);}else {result &#61; alloc_chrdev_region(&dev, 0, 1, TEST_DEVICE_NAME);major &#61; MAJOR(dev);}if (result <0) {printk(KERN_WARNING "Test device: unable to get major %d\n", major);return result;}test_setup_cdev(&test_dev, 0, &test_fops);printk("The major of the test device is %d\n", major);return 0;}void cleanup_module(void) {cdev_del(&test_dev);unregister_chrdev_region(MKDEV(major, 0), 1);printk("Test device uninstalled\n");}

test_drv_load

#!/bin/sh
module&#61;"test_drv"
device&#61;"test_dev"
mode&#61;"664"
group&#61;"linux"# remove stale nodes
rm -f /dev/${device} # invoke insmod with all arguments we got
# and use a pathname, as newer modutils don&#39;t look in . by default
/sbin/insmod -f ./$module.ko $* || exit 1major&#61;&#96;cat /proc/devices | awk "\\$2&#61;&#61;\"$device\" {print \\$1}"&#96;mknod /dev/${device} c $major 0# give appropriate group/permissions
chgrp $group /dev/${device}
chmod $mode /dev/${device}

test_drv_unload

#!/bin/sh
module&#61;"test_drv"
device&#61;"test_dev"# invoke rmmod with all arguments we got
/sbin/rmmod $module $* || exit 1# remove nodes
rm -f /dev/${device}exit 0

1296850-20181202191943456-1367881429.png

1296850-20181202191950850-1519041435.png

  • 遇到的问题
    首先要注意Makefile文件中的空格和tab 的区别
    其次要在test_drv_load中把组改成虚拟机用户所在的组&#xff0c;老师给的虚拟机所在的组就是linux,不能用原来的David&#xff0c;否则会出现无效的组
    再有Makefile中要改成这个KERNELDIR ?&#61; /lib/modules/3.2.0-24-generic/build

转:https://www.cnblogs.com/Vventador/p/10054715.html



推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 欢迎来到Netgen新时代:探索网络生成技术的无限可能
    欢迎进入Netgen的新时代:探索网络生成技术的无限潜力。本文将详细介绍如何编译下载的Netgen源代码,生成Netgen程序,并提供开发所需的库nglib。此外,还将探讨Netgen在现代网络设计与仿真中的应用前景,以及其在提高网络性能和可靠性方面的关键作用。 ... [详细]
  • 软件开发史上最具影响力的十位编程大师(附图解)
    在软件开发领域,有十位编程大师对行业发展产生了深远影响。本文基于国外知名社区的一项评选,通过图文并茂的形式,详细介绍了这十位杰出人物,包括游戏开发先驱John Carmack等,为读者呈现了他们卓越的技术贡献与创新精神。 ... [详细]
  • 简书: https:www.jianshu.comp5c3938ce2cf61.官网下载https:nginx.orgendownload.html  2.上传CentOS服务略3 ... [详细]
  • 如何提高工程编译速度
    点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~     文章首发  公众号——Pou光明公众号还在维护,大家莫慌~LinuxQt平台为例测试编译 ... [详细]
  • [ipsec][strongswan]strongswan源码分析(五)plugin的配置文件的添加方法与管理架构解析
    我们知道,strongswan是基于插件式管理的。不同的插件有不同的配置文件,在这下面,我们以netlink的插件为例:etcstrongswan.dcharonkernel-ne ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • C++ 进阶:类的内存布局与虚函数类的实现细节
    C++ 进阶:类的内存布局与虚函数类的实现细节 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 本文详细探讨了C语言中`extern`关键字的简易编译方法,并深入解析了预编译、`static`和`extern`的综合应用。通过具体的代码示例,介绍了如何在不同的文件之间共享变量和函数声明,以及这些关键字在编译过程中的作用和影响。文章还讨论了预编译过程中宏定义的使用,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文深入探讨了romfs与rootfs在概念上的区别及其应用场景。romfs通常作为只读文件系统存储在Flash的特定分区中,其起始地址为0x46000000。相比之下,rootfs是系统的根文件系统,负责管理和加载操作系统的核心组件及应用程序。两者在功能和使用场景上存在显著差异,romfs主要用于存储固件和配置文件,而rootfs则涵盖了更广泛的操作系统资源。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • Java新手求助:如何优雅地向心仪女生索要QQ联系方式(附代码示例与技巧)
    在端午节后的闲暇时光中,我无意间在技术社区里发现了一篇关于如何巧妙地向心仪女生索取QQ联系方式的文章,顿时感到精神焕发。这篇文章详细介绍了源自《啊哈!算法》的方法,不仅图文并茂,还提供了实用的代码示例和技巧,非常适合 Java 新手学习和参考。 ... [详细]
  • 如何在Linux系统中无root权限下高效安装Perl模块?
    在Linux系统中,若没有root权限,可以通过使用`local::lib`模块来高效地安装Perl模块。这一方法在Perl官方文档`perlfaq8`中有详细记录,并且是StackOverflow上常见的讨论话题之一。通过`local::lib`,用户可以在本地目录中安装和管理Perl模块,从而避免权限问题,提高开发效率。此外,该方法还支持多个用户在同一系统上独立安装和使用不同的模块版本,增强了灵活性和安全性。 ... [详细]
  • Maven入门指南深入解析了Maven的核心概念与基本功能。本文详细介绍了Maven在项目构建、文档生成、报告生成、依赖管理、源代码控制(SCM)、项目发布与分发以及邮件列表管理等方面的应用。Maven通过采用标准目录结构和“约定优于配置”的原则,简化了项目的配置与管理,提高了开发效率。 ... [详细]
author-avatar
小菠萝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有