教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

毕业论文再次修改版- 副本 - 图文(7)

来源:网络收集 时间:2026-07-28
导读: #define FPGA_RCV_COUNT_H_REG2 #define FPGA_RCV_COUNT_L_REG2 #define FPGA_CHECK_SUM_REG2 #define FPGA_RESERVED_REG2 FPGA_REG(0x09) //接收计数寄存器高 FPGA_REG(0x0A) //接收计数寄存器低 FPGA_REG(0x0B) /

#define FPGA_RCV_COUNT_H_REG2 #define FPGA_RCV_COUNT_L_REG2 #define FPGA_CHECK_SUM_REG2 #define FPGA_RESERVED_REG2

FPGA_REG(0x09) //接收计数寄存器高 FPGA_REG(0x0A) //接收计数寄存器低 FPGA_REG(0x0B) //累加和 FPGA_REG(0x0C) //保留 FPGA_REG(0x0D) //波特率寄器高 FPGA_REG(0x0E) //波特率寄器低 FPGA_REG(0x0F) //控制寄存器

#define FPGA_BAUND_RATE_H_REG2 #define FPGA_BAUND_RATE_L_REG2 #define FPGA_CTRL_REG2

定义物理地址及RAM区长度。由于FPGA提供16个寄存器给CPU访问,因此长度应该为16字节。而EMC_nCS3片选信号挂了两个器件:FGPA和CAN,因此根据原理图,FPGA的地址应该为A16对应的片选,为0xXXXXXXXX XXXXX010 00000000 00000000=0xE3020000:

#define FPGA_ADDR_RANGE 16 #define FPGA_PHYSICAL_ADDR 0xE3020000 static volatile UINT8 *g_lpBaseFPGA = NULL; static volatile INTC_REGS_T *pINTCRegs = NULL;

物理地址映射: PHYSICAL_ADDRESS pa;

DWORD dwThreadID; BOOL bResult = FALSE; /*

* 分配FPGA 访问空间 */

pa.QuadPart = FPGA_PHYSICAL_ADDR;

g_lpBaseFPGA = (volatile UINT8 *) MmMapIoSpace(pa,

FPGA_ADDR_RANGE, FALSE);

if(g_lpBaseFPGA == NULL) { }

RETAILMSG(1, (TEXT(\))); return FALSE;

(2)中断驱动程序设计

第 30 页 (共41 页)

各种外设时通过中断和WinCE核心进行通信的。过程是: 1)硬件设备产生硬件中断

2)OAL完成硬件中断到逻辑中断(SYSINTR)的转换(OEMinit函数实现) 3)系统识别逻辑中断,同时进行处理。

分两步:中断服务例程(ISR)和中断服务线程(IST)。

ISR主要负责中断响应,一般要求短小精干,对执行效率有很高的要求,只负责最简单的工程,即响应设备并返回一个中断标示给核心。而对中断的实际处理则在IST中。

ISR的主要作用:

1 如果数据可能丢失或者被下一个中断改写,则ISR将数据从设备读到缓冲区 2 ISR清除设备上的中断条件 3 ISR向内核返回一个SYSINTR 4 内核设置供IST等待的中断事件

5 调度程序调度等待的IST以执行后续的中断服务操作。 ISR分为静态ISR和可安装的ISR。

静态ISR只能静态被编译到核心,在运行时不能改变,和IST通信是单向的,ISR-IST,支持中断嵌套,可以使用核心的堆栈。

可安装的ISR由内核管理程序从DLL中动态加载,是由IST-ISR,多个ISR可以同一个中断请求相连,按加载驱动的顺序进行调度,共享内存的使用比较灵活。

IST是运行在用户空间的中断服务线程,负责接到系统逻辑中断号之后的处理,使用中首先要注册自己,再与一个系统事件关联。

一般来说,使用InterruptInitialize函数注册自己,使用WaitForSingleObject函数来等待终端请求事件。系统调度器会调度这个线程来进行中断的处理。

流接口驱动一般在XXX_Init里面做这些事情,IST是Device.exe的一个附属线程。 具体实现过程是: 1 创建一个事件 2 得到系统的中断号

3 创建一个挂起的中断服务线程(IST) 4 设置中断服务线程的优先级别

5 调用函数InterruptInitialize通知系统注册中断 6 回复中断服务线程IST,IST开始服务 因此,WinCE6的中断发生和处理过程总结如下:

第 31 页 (共41 页)

? 硬件设备产生中断信号

? 中断信号被异常处理程序(ExceptionHandle)捕获 ? 异常处理程序激活挂载中断服务例程ISR ? ISR响应硬件,并操作硬件设备 ? ISR将中断映射

? ISR设置相应的核心中断标示

? 中断服务调度程序与OAL例程合作,设置中断事件,操纵在特定中断事件上的

等待队列

? OAL操作硬件,改变硬件的中断状态,将其设置为开中断

? 中断事件激活系统调度程序, 在相隔一段时间以后调度中断服务线程 ? IST处理中断的相关事件,并调用系统的支持库 ? 系统支持库访问硬件设备,完成对硬件设备的操作

LPC3250支持74个中断源,每个中断都有中断使能位,并可被配置为不同优先级,以及电平或者边沿触发方式,可根据条件对原始中断状态以及掩码中断寄存器访问。因此此款ARM9芯片对中断的支持是非常强大的,满足本课题的设计要求。

LPC3250所有的外部引脚中断通过同步电路连接到两个子中断控制器SIC1和SIC2,它们的四个输出被连接到主中断控制器(MIC)的四个输入端,建议配置这些输入为低电平有效。下图为sub2中断控制器基地址分配。

图5.5 Slave2(Sub2)中断控制寄存器基地址

本FPGA中断采用Slave interrupt controller 2,因此,定义其基地址为: #define SIC2_BASE 0x40010000 /* Slave2 int ctrl registers base*/

物理地址与虚拟地址映射: pa.QuadPart = SIC2_BASE;

pINTCRegs = (volatile INTC_REGS_T *) MmMapIoSpace(pa, sizeof (INTC_REGS_T), FALSE); if(pINTCRegs == NULL) {

RETAILMSG(1, (TEXT(\))); }

在分配完FPGA访问空间后,就需要从OAL请求一个SYSINTR值: if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_nFpgaIrq,

第 32 页 (共41 页)

sizeof(UINT32), &g_nFpgaSysIntr, sizeof(UINT32), NULL)) {

RETAILMSG(1,

(_T(\failed to request sysintr value for FPGA interrupt \\r\\n\))); goto exit; }

请求成功后,在驱动的初始化函数中通过CreateEvent的方式来创建事件对象,就可以创建中断线程:

g_htFpgaIST = CreateThread(NULL, 0,

(LPTHREAD_START_ROUTINE) FPGA_IntrThread, NULL, 0,

&dwThreadID); if (g_htFpgaIST == 0) {

RETAILMSG(1, (_T(\))); //goto exit; return FALSE; }

g_hInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);

g_hRxEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 最后在驱动的IST中,当硬件中断产生时,就通过SetEvent的方式来通知应用程序: static DWORD WINAPI FPGA_IntrThread(LPVOID pContext) {

DWORD dwRet;

if (!(InterruptInitialize(g_nFpgaSysIntr, g_hInterrupt, 0, 0))) {

RETAILMSG(1, (_T(\ return 0; }

RETAILMSG(1,(L\ /*中断线程开始运行*/ while (!g_bKillIST) {

dwRet = WaitForSingleObject(g_hInterrupt, INFINITE); if (g_bKillIST == TRUE) return 0;

SetEvent(g_hRxEvent);

RETAILMSG(1,(L\ InterruptDone(g_nFpgaSysIntr);

第 33 页 (共41 页)

}

r …… 此处隐藏:2242字,全部文档内容请下载后查看。喜欢就下载吧 ……

毕业论文再次修改版- 副本 - 图文(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/443115.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)