关键词不能为空

当前您在: 主页 > 英语 >

嵌入式系统设计实验五

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 08:38
tags:

-

2021年2月9日发(作者:headache怎么读)



P.


1



专业:测控技术与仪器








实验名称:
























姓名:















学号:







姓名:颜睿

































学号:


3130103850












日期:


2018.3.28













实验报告




地点:创客空间
















课程名称:



嵌入式系统设计











指导老师:马永昌
















成绩:


________________

< br>实验名称:实验五


Linux


字符驱动开发



实验类型:验证型









同组学生姓名:


__


孙凡原


_______


一、实验目的和要求(必填)








二、实验内容和原理(必填)



三、主要仪器设备(必填)








四、操作方法和实验步骤



五、实验数据记录和处理









六、实验结果与分析(必填)



七、讨论、心得





一、实验目的和要求



1.


掌握字符设备驱动程序的基本结构和开发方法



2.


掌握用户空间调用设备驱动的方法




二、实验内容和原理



1.


编写字符驱动实现按键驱动,控制


LED


2.


编写应用程序调用驱动




三、主要仪器设备



树莓派、


PC





四、操作方法和实验步骤



1


编译运行所给样例驱动程序,验证实验现象,熟悉驱动开发过程。编译 时注意修改


Makefile


中的相关路





1


) 将编译得到的可执行文件


demo


和模块



放入树莓派


SD


< br>



2


)将树莓派


SD


卡中的内核镜像文件



替 换为第二次实验所编译得到的内核镜像



3


)运行树莓派,用串口或


SSH


登录到树莓派,使用


insmod


命令加载模块




4


)将

< br>8


按键模块和


LED


灯接到相应 的


GPIO


口,运行


demo


观察现象



2


修改样例 驱动程序,实现对超声波传感器的控制,并编写相应的应用程序读取超声波传感器的数据,显

示距离。




五、实验数据记录和处理




1.


超声波传感器驱动


demo.c



#include


#include


#include


#include


#include


#include


#include


#include














线



P.


2



实验名称:
























姓名:















学号:






















#include


#include


#include


#define DRIVER_NAME


#define DEVICE_NAME



static dev_t demo_devno; //


设备号



static struct class *demo_class;


static struct cdev demo_dev;




static struct gpio_config{



int trig_num;



int echo_num;



long time;


}config;

//


结构体用于用户态和内核态之间传递数据





static int flag = 0;



struct timeval tv1;


struct timeval tv2;



//open


函数,应用程序调用


o pen


系统调用时会调用本函数



static int demo_open(struct inode *inode,struct file *filp)


{



printk(KERN_INFO



return 0;



}



//release


函数,应用程 序调用


close


系统调用时会调用本函数


static int demo_release(struct inode *inode, struct file *filp)


{




if(flag){




gpio_free(_num);




gpio_free(_num);




flag = 0;



}




printk(KERN_INFO



return 0;


}



//ioctl


控制函数,应用程序调用

ioctl


系统调用时会调用本函数














线



P.


3



实验名称:
























姓名:















学号:






















static long demo_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)


{



int err = 0;



long start;



long stop;




switch(cmd){




case 0://0


表示命令号,一般都用宏定义来控制



//GPIO


口进行初始化






{






if(copy_from_user(&config,(void


*)arg,sizeof(struct


gpio_config))){


//


从用户程序中获取配


置数据








printk(KERN_ERR







return -EFAULT;






}






printk(KERN_INFO


%d]:


Get


trig


gpio


num:


%d


and


echo


gpio


num:


%dn







err = gpio_request_one(_num,GPIOF_IN,






if(err){







printk(KERN_ERR







return -EFAULT;






}






err = gpio_request_one(_num,GPIOF_OUT_INIT_LOW,






if(err){







printk(KERN_ERR







gpio_free(_num);






}






flag = 1;






break;





}




case 1:




{






gpi o_direction_output(_num,0);


//


设置


GPIO


口方向







gpio_direction_input(_num);






gpi o_set_value(_num,0)


;//


根据传感器时 序图进行操作







udelay(10);






gpio_set_value(_num,1);






udelay(20);






gpio_set_value(_num,0);






while(gpio_get_value(_num)==0)






{}






do_gettimeofday(&tv1);

< p>
//


获取声波开始时间







while(gpio_get_value(_num)==1)






{}













线



P.


4



实验名称:
























姓名:















学号:


























do_ gettimeofday(&tv2);


//


获取声波返回时 间







start=_sec*1000000+_usec;


//


数据转换为微妙










stop= _sec*1000000+_usec;






=stop-start;









if(copy_to_user((void


*)arg,&config,sizeof(struct


gpio_config))){printk(KERN_ERR


%d]


:


copy


to user failed !n


//


数据由内核传送至用户








return -EFAULT;






}






flag=1;









break;




}




default:





printk(KERN_INFO





break;



}



return 0;


}





static struct file_operations demo_fops = {



.owner = THIS_MODULE,



.open



= demo_open,



.release



= demo_release,



.unlocked_ioctl = demo_ioctl,


};




static int __init demo_init(void)


{



int err;




printk(KERN_INFO




err = alloc_chrdev_region(&demo_devno,0,1,DRIVER_NAME);






if(err < 0){




goto err;



}



cdev_init(&demo_dev,&demo_fops);




err = cdev_add(&demo_dev,demo_devno,1);




if(err < 0)













线


-


-


-


-


-


-


-


-



本文更新与2021-02-09 08:38,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/620078.html

嵌入式系统设计实验五的相关文章