uclinux-2008R1.5-RC3(bf561)到VDSP5的移植(72):中断时SP的保存

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

 

本文适用于

ADI bf561 DSP

优视BF561EVB开发板

uclinux-2008r1.5-rc3(smp patch)

Visual DSP++ 5.0(update 5)

 

欢迎转载,但请保留作者信息

当发生系统中断时,将进入所指定的中断入口执行,在大部分情况下,需要对SP指针进行保存,然后将SP指向一个临时的位置,然后将寄存器入栈,再进行中断处理,在中断处理的最后恢复SP指针并返回中断前的位置继续执行。

那么选择什么位置来保存SP指针呢?内核提供了三个选择:

#if defined(CONFIG_BFIN_SCRATCH_REG_RETN)

# define EX_SCRATCH_REG RETN

#elif defined(CONFIG_BFIN_SCRATCH_REG_RETE)

# define EX_SCRATCH_REG RETE

#else

# define EX_SCRATCH_REG CYCLES

#endif

即可以选择RETNRETECYCLES三个寄存器中的一个做为保存SP的位置,但实际上RETE这个寄存器本身就是一个需要进行入栈保存的东西,用它来保存SP,显然是荒谬的!

再看CYCLES寄存器,在不定义CONFIG_BFIN_SCRATCH_REG_RETNCONFIG_BFIN_SCRATCH_REG_RETE两个宏情况下,将选择CYCLES来保存SP,但不幸的是在head.s中是这样设置SYSCFG的:

#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES

     R0 = SYSCFG_SNEN;

#else

     R0 = SYSCFG_SNEN | SYSCFG_CCEN;

#endif

     SYSCFG = R0;

也就是说,在不定义CONFIG_BFIN_SCRATCH_REG_CYCLES的情况下是会启用CYCLES寄存器进行计数的,在这种情况下显然不能使用它来保存SP。这就是它们矛盾的地方,head.s要求显示定义CONFIG_BFIN_SCRATCH_REG_CYCLES来使用CYCLES保存SP,而entry.s则与此相反!当然,内核通过make config保证了最终会定义三个宏中的一个,只是在代码风格上有点瑕疵罢了!

因此,如果在硬件上没有使用NMI中断,使用RETN当然是最好的选择了,呵呵!

 

1       参考资料

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(68)PLL配置(2009-02-16)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(69)SHARED_MEMORY(2009-02-20)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(70):保留VDSPheap(2009-02-20)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(71)l1_data_sram_init的疑惑(2009-02-20)

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值