基于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的情况。

电商ERP系统——商品SKU与库存设计

总体思路1.商品关联商品类别,商品类别关联多个商品属性,其中指定某几个商品属性为SKU关键字段。例如,服装类别的颜色、尺码属性。2.多个SKU商品属性值组合生成唯一的商品SKUID。例如,红色、L=1...
  • hunkcai
  • hunkcai
  • 2016-05-10 12:32:54
  • 21302

基于BLACKFIN DSP的数字图像处理

  • 2011年08月01日 00:52
  • 10MB
  • 下载

DSR协议分析

Source code :     Not all flies in ./dsr/ directory are used by the ns-2. the routing agent is impl...
  • norbert_jxl
  • norbert_jxl
  • 2013-07-04 11:35:06
  • 1606

Blackfin DSP学习心得

呵,学习DSP,特别是Blackfin系列的,没数据手册简直是没法学的。 该系列基本上只有英文资料,而就我目前翻过的所有教材基本上都是从数据手册上摘录一个片段,翻译一下就完事了,连个总结都没有。很多...
  • yrr359910539
  • yrr359910539
  • 2014-07-29 14:30:10
  • 917

DSR源代码分析[转载]

DSR in ns-2Source code :    Not all flies in ./dsr/ directory are used by the ns-2. the routing agen...
  • alexmajy
  • alexmajy
  • 2005-07-26 00:00:00
  • 2078

基于ADI Blackfin系列DSP处理器的C语言编程与优化——优化DSP Kernel

第一部分介绍了ADI Blackfin DSP上的C编程的基本概念;本部分主要介绍用于DSP kernel的基本的优化方式;而第三部分则主要讲述如何直接利用DSP的feature,如用C如何采用硬件循...
  • yuyin86
  • yuyin86
  • 2012-05-08 08:44:31
  • 871

用omnetpp仿真dsr协议

本人也是第一次用omnetpp平台,模拟网络dsr协议,写这篇文章希望对实验代码做一些梳理和剖析。仿真网络的基础是构建网络,将节点,基站,消息,dsr网络定义好,并在初始化文件中将节点基站数量和坐标,...
  • ye15700786134
  • ye15700786134
  • 2017-08-31 14:49:40
  • 197

基于BLACKFIN DSP的数字图像处理Part2

  • 2011年11月29日 17:15
  • 34.27MB
  • 下载

dsr路由协议的原理分析

  • 2010年05月10日 10:22
  • 785KB
  • 下载
收藏助手
不良信息举报
您举报文章:基于Blackfin构架体系的DSR实现
举报原因:
原因补充:

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