实验5 键盘中断实验
实验日期: 年 月 日
–
实验目的 | 对键盘设备驱动程序和应用软件源代码的剖析,使学生深入理解嵌入式系统中键盘设备的工作原理及其软件设计方法,以便进行后续的综合实验及开发工作。 |
实验仪器 | PC机、嵌入式系统实验箱、网线、串口线 |
实验原理 | 查询方式会浪费大量的处理器有效时间,而中断方式是多任务操作系统中与外设进行数据交互的最有效的方式。当CPU进行主程序操作时,如果外设数据已存入端口的数据输入寄存器,或端口的数据输出寄存器已空,此时由外设通过接口电路向CPU发出中断请求信号。CPU在满足一定条件下,暂停当前正在执行的主程序,转入执行该设备的中断处理子程序,待中断处理完毕之后,CPU再返回并继续执行原来被中断的主程序。这样,CPU就避免了把大量时间耗费在等待、查询外设状态的操作上,使其工作效率得以大大提高。 |
实验内容及步骤 | 实验内容: 本实验由学生完成对键盘设备驱动程序及应用程序的导入、运行及功能验证工作,使学生理解嵌入式系统中常用的键盘扫描方法。 实验步骤: 1.ARM开发板上已经默认加载了LED与按键的驱动程序,在开发板的/dev目录下可以找到leds和button两个设备文件。设计应用程序时可以通过open、read、 write、 ioctl 这些文件函数来访问设备文件。程序6.5和程序6.6分别演示了流水灯和按键状态读取的功能,两个应用程序的示例代码如下。 程序6.5流水灯示例程序 #include <stdio. h>#define IOCTL LED ON #define IocTl LED OFF 0 int main(int argc, char** argv) { printf("Hello leds!\n"); int fd = open("/dev/leds", 0);if (fd>0){ inti,n=100; while (n-- > 0) { // 1分钟流水灯 for (i=0;i< 6; ++i) { octl (fd, IOCTL_ LED OFF, 0) ; ioctl (fd, IOCTL_ LED OFF, 1) ; ioctl(fd, IOCTL LED OFF, 2) ; ioctl (fd, IOCTL LED_ OFF, 3) ; ioctl(fd, IOCTL_ LED _ON, (i >= 4)?((6-i)%4):i);usleep (100000); //延时100ms
close (fd) ;} return O;} 程序6.6按键响应示例程 序 #include <stdio.h>#include <stdlib.h> #include <unistd.h> 决#include <fcntl.h>#include <errno.h>int main (void) { int i, btn fd; char cbtns[6], obtns[6] ={'0', 'O', '0', 'O', 'O', 'O'}; btn fd = open ("/dev/buttons", 0) ; LE btn _fd< 0) ( perror("open deVIce buttons"); exit(l); ) for (i:) { if (readbtn_ fd, cbtns, 6) != 6) { perror("read buttons:"); exit(1); } for(i=O;i<6;++i){ if (obtns[i] != cbtns[i]) { obtns[i] = cbtns[i]; printf("key %d is %s\n",i+1, obtns[i] == 'O’? "up”: "down") ; if {obtns[2] == '1') { // KEY3按下肘退出死循坏 printf ("buttons test end!\n"); break; } } close (btn fd) ; return O; } |
数据处理及结论 |
|
实验心得体会 | 通过本次中断实验,让我知道了对键盘设备驱动程序和应用软件源代码的剖析,使学生深入理解嵌入式系统中键盘设备的工作原理及其软件设计方法,以便进行后续的综合实验及开发工作。 |