嵌入式系统实验指导书.doc
《嵌入式系统实验指导书.doc》由会员分享,可在线阅读,更多相关《嵌入式系统实验指导书.doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目 录目 录1实验一 ARM的中断实验2实验二 Linux驱动程序的编写7实验三 Linux的应用程序的编写13实验一 ARM的中断实验一、实验目的(1) 掌握ARM9 的中断原理,能够对S3C2410 的中断资源及其相关中断寄存器的进行合理配置;(2) 掌握对S3C2410 中断的编程的方法二、实验内容1、学习响应外部中断请求的配置方法,并通过定时器中断,执行中断服务子程序,使CPU板上的LED指示灯LED1、LED2闪烁发光。三、实验设备1、EL-ARM-830 教学实验箱,PentiumII 以上的PC 机,仿真调试电缆。2、PC操作系统、ADS1.2集成开发环境。四、实验原理(一)AR
2、M的中断原理在ARM 中,有两类中断,一类是IRQ,一类是FIQ。IRQ 是普通中断,FIQ 是快速中断,在进行大批量的复制、数据转移等工作时,常使用此类中断。FIQ 的优先级高于IRQ。同时,它们都属于ARM 的异常模式,当一旦有中断发生,不管是外部中断,还是内部中断,正在执行的程序都会停下,PC 指针进而跳入异常向量的地址处,若是IRQ 中断,则PC 指针跳到0x18 处,若是FIQ 中断,则跳到0x1C 处。异常向量地址处,一般存有中断服务子程序的地址,所以,接下来PC 指针跳入中断服务子程序中。当完成中断服务子程序后,PC 指针会返回到被打断的程序的下一条地址处,继续执行程序。这就是A
3、RM 中断操作的基本原理。但是,通常由于生产ARM 处理器的各厂家都集成了很多中断请求源,比如,串口中断、AD 中断、外部中断、定时器中断、DMA 中断等等,所以,很多中断可能同时请求中断,因此,为区分它们,更准确的完成任务,这些中断都有相应的优先级别,以及当发生中断时,它们都有相应的中断标志位,通过在发生中断是判断中断优先级,和访问中断标志位的状态来识别到底哪一个中断发生了。(二)S3C2410中断的使用首先,ARM920T CPU 的PSR 寄存器中的F 位为1,则CPU 不会响应中断控制器的FIQ 中断,同样,ARM920T CPU 的PSR 寄存器中的I 位为1,则CPU 也不会响应中
4、断控制器的IRQ 中断,为使CPU 响应中断,须在启动代码中将其设为0,以及使INTMSK 寄存器中的相应位置0。S3C2410 共有56个中断源,有26个中断控制器,外部中断EXTIN823 共用一个中断控制器,外部中断EXTIN47 共用一个中断控制器,9个UART 中断分成3 组,共用3 个中断控制器,ADC和触摸屏共用一个中断控制器。中断的优先级是由主组号和从ID号的级别控制的。中断系统有6个分仲裁器和1个总仲裁器,每一个仲裁器可以处理6路中断。中断优先级产生模块如图1-1所示。图1-1中断控制器原理图从图1-1可以看出,中断优先级产生模块共有7个判优器,每个判优器是否使能由寄存器PR
5、IORITY6:0决定,每个判优器下面有46个中断源,这些中断源对应着REQ0REQ5 这6个优先级,这些优先级由寄存器PRIORITY20:7的相应位决定。要正确使用这些中断,必须对以下中断寄存器做设置:各个寄存器具体位定义与使用说明,可参考课堂讲义。(三)S3C2410定时器的特点S3C2410有5个16bit定时器。定时器0-3有脉宽调制功能(Pulse Width Modulation,PWM),定时器4是内部定时器,没有输出引脚。定时器0-1共用一个8bit prescaler,定时器2-4共用另外一个。每个定时器有一个时钟分频器,可以选择5种分频方法。每个定时器从各自的时钟分频器获
6、取时钟信号。prescaler是可编程的,并依据TCFG0-1寄存器数值对PCLK进行分频。当定时器被使能之后,定时器计数缓冲寄存器(TCNTBn)中初始的数值就被加载到递减计数器中。定时器比较缓冲寄存器(TCMPBn)中的初始数值被加载到比较寄存器中,以备与递减计数器数值进行比较。这种双缓冲特点可以让定时器在频率和占空比变化时输出的信号更加稳定。每个定时器都有一个各自时钟驱动的16bit递减计数器,当计数器数值为0时,产生一个定时中断,同时TCNTBn中的数值被再次载入递减计数器中再次开始计数。只有关闭定时器才不会重载。TCMPBn的数值用于PWM,当递减计数器的数值和比较寄存器数值一样时,
7、定时器改变输出电平,因此,比较寄存器决定了PWM输出的开启和关闭。自动加载功能被打开后,当TCNTn数值递减到0时,芯片自动将TCNTBn的数值拷贝到TCNTn,从而开始下一次循环,若TCNTBn数值为0,则不会有递减操作,定时器停止。如图1-2,给出了本试验的程序流程图。图1-2中断处理程序实验原理图(四)实验电路图1-3给出了本试验的参考电路连接图。图1-3硬件原理图如图1-3所示,在G端口第8位和第9位的外部各连接了一个发光二极管。五、实验内容与步骤(一)实验内容1试验例子如图1所示,在定时器0的1秒钟中断服务程序中,根据FLAG的标志,设置端口G的第8和第9位的数值,从而改变发光二极管
8、的显示状态。即每个发光二极管交替点亮和熄灭,但在任一时刻,两个灯一个点亮,一个熄灭。2设计要求要求每个发光二极管交替点亮和熄灭,但在任一时刻,两个灯同时点亮,或同时熄灭。(二)实验步骤及参考程序1实验步骤1) 本实验仅使用实验教学系统的核心CPU 板。在进行本实验时,LCD 电源开关,音频的左右声道开关、AD 通道选择开关、触摸屏中断选择开关等均应处在关闭状态。2) 在PC 机并口和实验箱的CPU 板上的JTAG 接口之间,连接仿真调试电缆。3) 检查连接是否可靠,可靠后,接入电源线,系统上电。4) 打开ADS1.2 开发环境, 从里面打开 实验程序HARDWAREADS 实验六Interru
9、pt.mcp 项目文件,进行编译。5) 编译通过后,进入ADS1.2 调试界面,加载实验程序HARDWAREADS实验六Interrupt_DataDebug 中的映象文件程序映像Interrupt.axf。6) 在ADS 调试环境下全速运行映象文件。观察LED1 和LED2 的变化!LED1 和LED2 灯会由于定时中断的1 秒钟发生一次,而一秒钟闪烁一次!也可以改变闪烁的频率,即改变Startup2410target.c 文件内的void Timer1_init(void)函数里的rTCNTB1 = 48828;的赋值,数字量越小,闪烁频率越快。编译全速运行,观看结果,看闪烁频率是否发生了
10、改变!这是对GPIO 口操作的结果。具体实现见程序。2参考程序/文件名称 : Main.c/文件功能 : 该文件为S3C2410硬件平台主程序。#include #include .INCconfig.hvoid Main(void)Target_Init();while(1);/函数名称 : TargetInit(void)/函数说明 : 目标板初始化程序,主函数中只需调用此函数,即可完成目标板的初始化void Target_Init(void)MMU_Init();ChangeClockDivider(1,1); / 1:2:4 ChangeMPllValue(0xa1,0x3,0x1);
11、 / FCLK=202.8MHz Isr_Init(); Port_Init(); Timer1_init(); Timer1INT_Init(); Uart_Init(0,); Uart_Select(0); /函数名称 : void _irq Timer1_ISR( void )/定时器中断服务子程序int flag;void _irq Timer1_ISR( void ) if (flag = 0) rGPGDAT = rGPGDAT & 0xeff | 0x200; flag = 1; else rGPGDAT = rGPGDAT & 0xdff | 0x100; flag = 0;
12、rSRCPND |= BIT_TIMER1; rINTPND |= BIT_TIMER1;六、思考题LOOP的循环条件是什么?1请给出代码,设置端口G的第4位和第5位为输出口,并输出11,但保持端口G其余位的功能和状态保持不变。2ARM的异常向量表和中断向量表是什么关系?七、实验报告要求具体内容包含以下几项:实验题目、实验目的、实验环境、实验内容与完成情况(要求附上自主设计的源程序)、实验中出现的问题、对问题的解决方案、完成思考题、实验总结等。实验二 Linux驱动程序的编写一、实验目的与内容学习linux 下键盘驱动程序的编写方法。二、实验仪器PentiumII 以上的PC 机,Linux
13、操作系统。EL-ARM830 实验箱三、预习要求了解Linux下驱动程序的编写方法,了解键盘控制器HD7279的控制方法。四、实验原理嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。设备驱动程序是操作系统内核和机器硬
14、件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备两类主要的设备文件类型。字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是
15、主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。(一)设备驱动程序的 file_operations 结构通常,一个设备驱动程序包括两个基本的任务:驱动设备的某些函数作为系统调用执行;而某些函数则负责处理中断(即中断处理函数)。而file_operations 结构的每一个成员的名称都对应着一个系统调用。用户程序利用系统调用,比如在对一个设备文件进行诸如read操作时,这时对应于该设备文件的驱动程序就会执行相关的ssize_t (*read)(struct file *, char *, size_t, loff_t *);函数。在操作系统内部,外部设备的存取是通过一组固定入口点
16、进行的,这些入口点由每个外设的驱动程序提供,由file_operations结构向系统进行说明,因此,编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。file_operations结构在kernel/include/linux/fs.h中可以找到。struct file_operations struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t
17、(*write) (struct file *, const char *, size_t, loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);i
18、nt (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*readv) (struct fil
19、e *, const struct iovec *, unsigned long,loff_t *);ssize_t (*writev) (struct file *, const struct iovec *, unsigned long,loff_t *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned l
20、ong, unsigned long);#ifdef MAGIC_ROM_PTRint (*romptr) (struct file *, struct vm_area_struct *);#endif /* MAGIC_ROM_PTR */;其中主要的函数说明如下:1) open 是驱动程序用来完成设备初始化操作的, open还会增加设备计数,以防止文件在关闭前模块被卸载出内核。open主要完成以下操作:检查设备错误(诸如设备未就绪或相似的硬件问题);如果是首次打开,初始化设备;标别次设备号;分配和填写要放在fileprivate_data内的数据结构;增加使用计数。2) read 用来从外
21、部设备中读取数据。当其为指针时,将引起read系统调用返回-EINVAL(“非法参数”)。函数返回一个非负值表示成功地读取了多少字节。3) write 向外部设备发送数据。如果没有这个函数,write 系统调用向调用程序返回一个-EINVAL。如果返回值非负,就表示成功地写入的字节数。4) release是当设备被关闭时调用这个操作。release的作用正好与open相反。这个设备方法有时也称为close。它应该完成以下操作:使用计数减1;释放open分配在fileprivate_data中的内存,在最后一次关闭操作时关闭设备。5) llseek 是改变当前的读写指针。6) readdir 一
22、般用于文件系统的操作。7) poll 一般用于查询设备是否可读可写或处于特殊的状态。8) ioctl 执行设备专有的命令。9) mmap 将设备内存映射到应用程序的进程地址空间。(二)设备驱动程序的 file_operations 结构通过了解驱动程序的file_operations 结构,用户就可以编写出相关外部设备的驱动程序。首先,用户在自己的驱动程序源文件中定义file_operations结构,并编写出设备需要的各操作函数,对于设备不需要的操作函数用NULL初始化,这些操作函数将被注册到内核,当应用程序对设备相应的设备文件进行文件操作时,内核会找到相应的操作函数,并进行调用。如果操作函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 实验 指导书
限制150内