![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP会员 | 芯片代购 | 客户评价 | | ||
|
||
|
|||||
| 基于Blackfin构架体系的DSR实现 | |||||
作者:佚名 文章来源:Internet 点击数: 更新时间:2008-5-6 ![]() |
|||||
|
对于操作系统内核有些了解的朋友应该对DSR不会感到陌生——Deferred Interrupt Service Routine,即延迟的中断服务例程。 对于一些操作较复杂、耗时的操作我们往往想将它从中断服务例程中拿出来,放在外面完成。这样可以加快中断响应时间,对于一些紧迫的事件处理则显得更为重要。因此应该提供一个DSR这样的机制。这个在Windows和Linux中均有体现。 下面我将谈谈在Blackfin DSP处理器系列中对DSR的一种处理方法。 其实对于一些并不紧急、完全可以拖后操作的事情甚至可以通过一个任务(线程)专门处理这些事件。在Linux中,DSR的处理分为三个不同的机制,其中有一个实际上是在某些检查点(如系统中断处理结束后、定时中断处理结束后、任务调度结束后等等)检查是否有DSR事件,如果有则处理它们。那么下面我将基于这种情况作出处理。
// 某个中断处理例程 extern void test(void);![]() // 软件中断处理例程 extern void soft_isr(void);![]() int main(void)![]() ...{ // 将test注册到IVG13系统中断向量 *(unsigned long*)0xffe02034 = (unsigned long)&test; // 将soft_isr注册到IVG14软件中断向量 *(unsigned long*)0xffe02038 = (unsigned long)&soft_isr; // 打开所有中断开关 *(unsigned long*)0xffe02104 = 0xffff; // 直接通过核心将中断号为13的系统事件中断发给核心中断控制器(这里模拟一个外部中断事件) asm("raise 13;"); return 0; }![]() ![]()
以上是一个C文件。这里对Blackfin的中断控制器做一下简单介绍:Blackfin中断控制器分为16个中断优先级,0~4是非屏蔽中断,7到13属于外部系统中断,14、15属于软件中断。 下面贴出核心的汇编部分代码:
.section program;![]() ![]() .global _soft_isr; .global _user_isr_callback;![]() ![]() // DSR处理函数 execute:![]() // 调用用户的DSR处理例程 call _user_isr_callback; // 作为软件中断的参数,这里0表示准备结束DSR处理 r0 = 0; // 发布14号中断(代码将跳往_soft_isr) raise 14; idle; execute.end:![]() ![]() ![]() _test:![]() .global _test; // 中断入口,保护相关的寄存器 [--sp] = astat; [--sp] = p0; [--sp] = r0; [--sp] = rets; // 这里用两个nop表示中断例程中先处理一些事务 nop; nop; // 这里是关键步骤: // 将中断返回寄存器的值先赋给r0 r0 = reti; // 将这个值压栈 [--sp] = r0; // r0指向execute子过程的首地址 r0.h = hi(execute); r0.l = lo(execute); // 将execute的入口地址赋给中断返回寄存器 reti = r0; // 这里将返回到execute子过程 rti; _test.end:![]() ![]() ![]() _soft_isr:![]() // 判断软件中断参数 cc = r0 == 0; if !cc jump SOFT_ISR_OTHER; // 如果是作为DSR的结束处理: // 恢复上下文寄存器 // 将reti恢复为原来被中断的下一条指令地址处 r0 = [sp++]; reti = r0; rets = [sp++]; r0 = [sp++]; p0 = [sp++]; astat = [sp++]; SOFT_ISR_OTHER:![]() // 中断返回 rti; _soft_isr.end:![]() ![]() // 用户DSR处理例程 _user_isr_callback:![]() p0 = 0; r0 = 100; r0 = r0 -|- r0 || [p0++] = r0; [p0++] = r0; rts; _user_isr_callback.end:![]() ![]()
以上是对中断处理一结束马上处理DSR的情况。 |
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 前置放大器在移动医疗服务系 便携式多通道大容量生理信号 防腐监测仪的设计与应用 基于AD1674的酶标仪的设计 基于C/S模式的JRTPLIB库的测 ffmpeg与jrtplib相结合应用 blackfin模拟摄像头驱动中的 可编程逻辑在数字信号处理系 发现VDSP4.5一个BUG:单步调 VDSP5.0双核工程下sml3中的变 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 本站介绍 | 合作联络 | 欢迎投稿 | 广告业务 | 网站地图 | 设为首页 | 加入收藏 | 友情链接 | 网站公告 | 联系我们 | | |||
|