搜索
bottom↓
回复: 2

osii for msp430 把OSTimeTick 由WDT 换为timerb为什么不行?

[复制链接]

出0入0汤圆

发表于 2014-2-13 11:57:04 | 显示全部楼层 |阅读模式
  之前ticks是由WDT定时器切换的,可以正常运行,现在因为一些原因想换个定时器timerb

之前

WDT_ISR                                     ; wd timer ISR
            PUSHALL                         ; push all registers            
         
            bic.b    #0x01, IE1             ; disable wd timer interrupt
            
            cmp.b    #0, &OSIntNesting      ; if (OSIntNesting == 0)  
            jne      WDT_ISR_1
                              
            mov.w    &OSTCBCur, R13         ; save task stack
            mov.w    SP, 0(R13)

            mov.w    &OSISRStkPtr, SP       ; load interrupt stack            

WDT_ISR_1
            inc.b    &OSIntNesting          ; increase OSIntNesting
            bis.b    #0x01, IE1             ; enable wd timer interrupt
            
            EINT                            ; enable general interrupt to allow for interrupt nesting

            call     #OSTimeTick            ; call ticks routine            
            DINT                            ; disable general interrupt

            call     #OSIntExit             ; call ticks routine
                          
            cmp.b    #0, &OSIntNesting      ; if (OSIntNesting == 0)
            jne      WDT_ISR_2

            mov.w    &OSTCBHighRdy, R13     ;     restore task stack SP
            mov.w    @R13, SP
                       
WDT_ISR_2
            POPALL                          ; pop all registers
            
            reti                            ; return from interrupt


现在改到了timerb

#pragma vector=TIMERB0_VECTOR
__interrupt void  Timer_B (void)
{
   
    OS_CPU_SR  cpu_sr;


    OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    OSTimeTick();                                /* Call uC/OS-II's OSTimeTick()                       */

    OSIntExit();                                 /* Tell uC/OS-II that we are leaving the ISR          */     
  
}

但是任务运行不了,是怎么回事?

我对比了一下,除了保存sp之外,基本一致,仿真时可以进入timerb,但是连续运行,有时候会提示cpuoff,但我根本没进入低功耗~

有人换过ticks时钟源麽?

出0入0汤圆

发表于 2014-2-13 17:03:16 | 显示全部楼层
兄弟,你timerb的中断函数这样写os的tick肯定运行不起来。因为IAR编译器会按照它自己的规则回复中断现场,如果你一定想用C写就查查编译器的手册看有没有办法不让编译器保存现场。GCC里我记得可以用__attribute nest

出0入0汤圆

发表于 2014-2-13 21:55:12 | 显示全部楼层
这事我以前做过,用TA0替代WDT,直接修改汇编文件。
需要修改两个地方,1、替换WDT的函数入口,2、修改中断函数内的相应中断允许位。

下面是改为TA0的,你自己和原文件对照下就知道该改哪里了,改为TB中断也很方便。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 20:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表