2018-2019-1 20165211 實驗四 外設驅動程序設計

2018-2019-1 20165211 實驗四 外設驅動程序設計

任務一

1.實驗要求
學習資源中全課中的“hqyj.嵌入式Linux應用程序開發標準教程.pdf”中的第十一章
提交康奈爾筆記的照片(可以多張)
2. 任務完成

任務二

1. 實驗要求
在Ubuntu完成資源中全課中的“hqyj.嵌入式Linux應用程序開發標準教程.pdf”中的第十一章的test試驗
提交編譯,加載模塊,卸載模塊,測試運行的截圖(要多張,全屏,體現學號信息)
2. 實驗代碼

test_drv.c

/* test_drv.c */
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#define     TEST_DEVICE_NAME    "test_dev"
#define     BUFF_SZ         1024
static struct cdev test_dev;
unsigned int major =0;
static char *data = 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 = strlen(data);count = (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 = (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 = (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 = NULL;}return 0;
}
static void test_setup_cdev(struct cdev *dev, int minor,struct file_operations *fops)
{int err, devno = MKDEV(major, minor);cdev_init(dev, fops);dev->owner = THIS_MODULE;dev->ops = fops;err = cdev_add (dev, devno, 1);if (err){printk (KERN_NOTICE "Error %d adding test %d", err, minor);}
}
static struct file_operations test_fops = 
{.owner   = THIS_MODULE,.read    = test_read,.write   = test_write,.open    = test_open,.release = test_release,
};
int init_module(void)
{int result;dev_t dev = MKDEV(major, 0);if (major){result = register_chrdev_region(dev, 1, TEST_DEVICE_NAME);}else {result = alloc_chrdev_region(&dev, 0, 1, TEST_DEVICE_NAME);major = 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.c

/* test.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#define     TEST_DEVICE_FILENAME        "/dev/test_dev"
#define     BUFF_SZ             1024
int main()
{int fd, nwrite, nread;char buff[BUFF_SZ];fd = open(TEST_DEVICE_FILENAME, O_RDWR);if (fd < 0){perror("open");exit(1);}do{printf("Input some words to kernel(enter 'quit' to exit):");memset(buff, 0, BUFF_SZ);if (fgets(buff, BUFF_SZ, stdin) == NULL){perror("fgets");break;}buff[strlen(buff) - 1] = '\0';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);
}

Makefile

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/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_drv_load

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

test_drv_load

#!/bin/sh
module="test_drv"
device="test_dev"# invoke rmmod with all arguments we got
sudo /sbin/rmmod $module $* || exit 1# remove nodes
rm -f /dev/${device}exit 0
3. 實驗步驟
  • 在虛擬設備驅動源碼目錄下編譯并加載驅動模塊

    $ make clean;make
    $ ./test_drv_load
  • 編譯并運行測試程序

    $ gcc –o test test.c
    $ ./test
  • 卸載驅動程序

    $ ./test_drv_unload
  • 通過dmesg命令查看內核打印的消息

    $ dmesg|tail –n 10
    ……
    The major of the test device is 250 
    This is open operation 
    This is release operation 
    Test device uninstalled 
4. 實驗截圖

1043647-20181202225812305-365355929.jpg

1043647-20181202225755906-63723098.jpg

轉載于:https://www.cnblogs.com/akashi/p/10056082.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《ASP.NET Core 6框架揭秘》實例演示[31]:路由高階用法

ASP.NET的路由是通過EndpointRoutingMiddleware和EndpointMiddleware這兩個中間件協作完成的&#xff0c;它們在ASP.NET平臺上具有舉足輕重的地位&#xff0c;MVC和gRPC框架&#xff0c;Dapr的Actor和發布訂閱編程模式都建立在路由系統之上。Minimal API更是將提升到了前所未有…

java中文亂碼解決之道(五)—–java是如何編碼解碼的

編碼&解碼 1&#xff1a;I/O操作 2&#xff1a;內存 3&#xff1a;數據庫 4&#xff1a;javaWeb 下面主要介紹前面兩種場景&#xff0c;數據庫部分只要設置正確編碼格式就不會有什么問題&#xff0c;javaWeb場景過多需要了解URL、get、POST的編碼&#xff0c;servlet的解碼…

java反射--Class類

面向對象的世界里&#xff0c;萬事萬物皆對象。 1&#xff09;類是誰的對象呢&#xff1f; 類是對象&#xff0c;類是java.lang.Class類的實例對象。 2&#xff09;這個對象如何表示呢&#xff1f; package com.reflect;public class ClassDemo1 {public static void main(Stri…

win10系統按esc會彈出計算機,win10系統版本2004控制面板多出ESC是什么原因?

如果我們的電腦在升級了win102004控制面板多出ESC什么情況方法一&#xff1a;“干凈啟動”&#xff0c;排除第三方軟體的影響1.停止非核心的程序運作(包括第三方殺毒、優化軟體)2.情況允許的話&#xff0c;卸載設備中的第三方殺毒、管家、優化軟件3.同時按【4.點擊【服務】>…

CentOS6/7 配置守護進程

CentOS6.xCentOS6中轉用Upstrat代替以前的init.d/rcX.d的線性啟動方式。一、相關命令通過initctl help可以查看相關命令[rootlocalhost ~]# initctl help Job commands:start Start job.stop Stop job.restart …

Vue源碼解析之數組變異

力有不逮的對象 眾所周知&#xff0c;在 Vue 中&#xff0c;直接修改對象屬性的值無法觸發響應式。當你直接修改了對象屬性的值&#xff0c;你會發現&#xff0c;只有數據改了&#xff0c;但是頁面內容并沒有改變。 這是什么原因&#xff1f; 原因在于&#xff1a; Vue 的響應式…

linux守護進程的編寫

linux監控一個進程進行 代碼如下: #!/bin/shcd /home/autoprocess/ autopgrep -f autoProcessNew.php | wc -l if [ "$auto" 0 ] then nohup php autoProcessNew.php & fi 監視autoProcessNew.php,使他一直監視轉載于:https://www.cnblogs.com/matengfei123/p/…

微軟2014編程之美初賽第一場——題目3 : 活動中心

【來源】 題目3 : 活動中心 【分析】 本題採用的是三分法。 輸入的一組點中找出左右邊界。作為起始邊界。 while(右邊界-左邊界<精度){將左右邊界構成的線段均勻分成3段&#xff0c;推斷切割點的距離關系&#xff0c;抹去距離大的一段。更新左右邊界。 } 輸出左(右)邊界 【…

windows10計算機里輸入法,win10電腦上輸入法不見了怎么辦

好的輸入法可以加快我們的工作效率&#xff0c;當電腦上輸入法不見時&#xff0c;你會調出來嗎?下面小編告訴你win10電腦上輸入法不見時弄出來的一些訣竅吧。win10電腦上輸入法不見了的解決方法win10電腦上輸入法不見了的解決方法&#xff1a;Win10系統輸入法圖標不見了的找回…

Java并發(二十一):線程池實現原理

一、總覽 線程池類ThreadPoolExecutor的相關類需要先了解&#xff1a; &#xff08;圖片來自&#xff1a;https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8%A7%88&#xff09; Executor&#xff1a;位于最頂層&#xff0c;只有一個 execute(Runnable runnable) 方法&a…

進程池

轉自&#xff1a;https://www.cnblogs.com/kaituorensheng/p/4465768.html 在利用Python進行系統管理的時候&#xff0c;特別是同時操作多個文件目錄&#xff0c;或者遠程控制多臺主機&#xff0c;并行操作可以節約大量的時間。當被操作對象數目不大時&#xff0c;可以直接利用…

gulp版本號管理插件注意事項

2019獨角獸企業重金招聘Python工程師標準>>> 打開node_modules\gulp-rev\index.js 第144行 manifest[originalFile] revisionedFile; 更新為: manifest[originalFile] originalFile ?v file.revHash; 打開node_modules\rev-path\index.js 第10行 return filena…

bigfile.to服務器位置,Cloudera Manager 遷移服務器

Cloudera Manager還是比較耗資源的&#xff0c;想把Cloudera Manager&#xff0c;移動到比較好的機器上。在這篇文章中&#xff0c;Cloudera Manager安裝在bigserver1上面&#xff0c;bigserver1是奔騰雙核的CPU。1&#xff0c;Cloudera Manager占資源比較多cloudera manager占…

vue定時ajax獲取數據,vue 中使用 AJAX獲取數據的方法

在VUE開發時&#xff0c;數據可以使用jquery和vue-resource來獲取數據。在獲取數據時&#xff0c;一定需要給一個數據初始值。看下例&#xff1a;new Vue({el:#app,data:{data:""},created:function(){var url"json.jsp";var _selfthis;$.get(url,function…

轉:shell awk

簡單使用&#xff1a; awk &#xff1a;對于文件中一行行的獨處來執行操作 。 awk -F &#xff1a;{print $1,$4} :使用‘&#xff1a;’來分割這一行&#xff0c;把這一行的第一第四個域打印出來 。 詳細介紹&#xff1a; AWK命令介紹 awk語言的最基本功能是在文件或字符串中基…

Mac使用crontab來實現定時任務

crontab 定時執行 配置文件都在/etc/crontab下&#xff0c;如果沒有就創建 語法&#xff1a; crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 說明&#xff1a; crontab 是用來讓使用者在固定時間或固定間隔執行程序之用&#xff0c;換句話說&#…

前端技術周刊 2018-12-03:DOM

前端快爆 Chrome 71 開始將試用 SXG 功能&#xff0c;它是由 IETF 提出&#xff0c;Web Package 協議規范下的 Signed HTTP Exchanges 功能的縮寫。該技術使得一個第三方服務器可以直接向用戶提供可靠資源&#xff0c;且不用與原站共享 HTTPS 證書密鑰。?點評&#xff1a;一項…

公司新來了一位阿里P9,在全員大會上講葷段子!還是上個世紀的老段子,太爛了!...

阿里P9在坊間的名聲一向不好&#xff0c;這幾年在業界出了不少令人無語的新聞&#xff0c;今天又來了一個&#xff1a;公司新來了一位阿里P9偽高管&#xff0c;全員大會上來先講了一個葷段子&#xff0c;這個破段子還是上個世紀的&#xff0c;太爛了&#xff01;關于這個段子&a…

【轉】博客美化(1)基本后臺設置與樣式設置

閱讀目錄 1.博客園后臺設置2.自定義樣式的設置博客園美化相關文章目錄&#xff1a;博客園博客美化相關文章目錄 一直都拜膜那些博客園的皮膚設計高手&#xff0c;由于本人對前端研究甚少&#xff0c;所以js,css這種東西只能看得懂最基本的&#xff0c;會簡單改改。然后一直對自…

Airdoc創始人:工智能可以在醫療領域多個環節發揮作用 但有局限性

7月1日&#xff0c;在由武漢國家生物產業基地建設管理辦公室主辦、火石創造承辦、光谷健康智慧園協辦的醫療大數據與醫學人工智能高峰論壇上&#xff0c;Airdoc創始人兼董事長張大磊做了題為《AI在醫療領域中應用的問題與局限》的演講。 Airdoc是醫療領域人工智能領軍企業&…