基于Blackfin构架体系的DSR实现

原创 2007年10月09日 23:41:00

        对于操作系统内核有些了解的朋友应该对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的情况。

基于Spring的MVC框架设计与实现

说明:这篇博客中并非讲SpringMVC,而是讲述我曾经实现过的一个MVC框架,
  • u010077905
  • u010077905
  • 2014年08月10日 15:32
  • 2873

基于Hadoop的大数据平台实施记——整体架构设计

大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星。我们暂不去讨论大数据到底是否适用于您的组织,至少在互联网上已经被吹嘘成无所不能的超级战舰。好像一夜之间我们就从互联网时代跳跃进了大...
  • javastart
  • javastart
  • 2016年02月16日 08:24
  • 3309

关于struts2框架与MVC之间关系的分析

1、MVC模式基础 1.1、MVC模式简介   MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率。在MV...
  • WangQYoho
  • WangQYoho
  • 2015年11月30日 15:52
  • 4706

blackfin 内核体系结构(英文版)

  • 2010年05月27日 23:22
  • 140KB
  • 下载

aodv和dsr的matlab实现

  • 2012年04月01日 15:31
  • 3KB
  • 下载

中国智能电网与IECSA体系构架

  • 2011年04月22日 13:35
  • 4.33MB
  • 下载

Mysql体系构架详解——内存

http://www.bitscn.com/pdb/mysql/201405/227583.html http://blog.csdn.net/wyzxg/article/details/726...
  • hubo890224
  • hubo890224
  • 2016年07月05日 16:17
  • 2390

Oracle之常用FAQ--Oracle 构架体系

转自: http://www.cnblogs.com/HondaHsu/archive/2008/04/26/1172406.html 第二部分、ORACLE构架体系 [Q]ORACLE的...
  • StoneOK07
  • StoneOK07
  • 2012年01月12日 14:03
  • 216

集合框架常用子类构架体系

集合框架的常用子类构架: |--List::有序的,带索引的,通过索引就可以精确的操作集合中的元素,元素是可以重复的。 List提供了增删改查动作    增加add(element) add(inde...
  • Raoodududu
  • Raoodududu
  • 2017年10月24日 19:06
  • 68

firtex的构架与实现

  • 2011年04月04日 21:32
  • 1.34MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于Blackfin构架体系的DSR实现
举报原因:
原因补充:

(最多只允许输入30个字)