3154|7

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ucos ii 中断 任务问题 [复制链接]

     最近在做几个ucos 移植,但是我使用多中断接收和发送,在系统的中断管理里能够中断嵌套,但是在任务中中断接收数据然后中断发送数据,但是现在中断只能够进几次系统就死机了。。。。。

下面是任务。。
static void  AppTaskMain(void *p_arg)
{
//#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
  // OS_CPU_SR  cpu_sr = 0;
//#endif
    unsigned char getchar;
    while (TRUE) {
        BIT_LED_WORK = 1;
        OSTimeDly(5);

        getchar=USART0_Receive();
        USART0_Transmit(getchar);
        BIT_LED_WORK = 0;     
        OSTimeDly(20);
    }
}
这是串口接收中断函数
void  USART0_RXISR_Handler( void )
{

        unsigned char data;
        unsigned char tmphead;
          _CLI();

        /* Read the received data */
        data = UDR0;                 
        /* Calculate buffer index */
        tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;
        USART_RxHead = tmphead;      /* Store new index */
       if ( tmphead == USART_RxTail )
        {
                /* ERROR! Receive buffer overflow */
        }
       
        USART_RxBuf[tmphead] = data; /* Store received data in buffer */
          _SEI();

      

}
这是串口接收函数
void  USART0_TXISR_Handler( void )
{
        unsigned char tmptail;
        _CLI();
        /* Check if all data is transmitted */
        if ( USART_TxHead != USART_TxTail )
        {
                /* Calculate buffer index */
                tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;
                USART_TxTail = tmptail;      /* Store new index */
       
                UDR0 = USART_TxBuf[tmptail];  /* Start transmition */
        }
        else
        {
                UCSR0B &= ~(1<         }
      _SEI();


}

我在中断服务程序中已经使用汇编调用了:
USART0_RXISR:
                PUSH_ALL                            ; Save all registers and status register
                IN      R16,SREG                    ; Save the SREG but with interrupts enabled
                SBR     R16,BIT07                    
                ST      -Y,R16
                PUSH_SP                             ; Save the task's hardware stack pointer onto task's stack

                LDS     R16,OSIntNesting            ; Notify uC/OS-II of ISR
                INC     R16                         ;
                STS     OSIntNesting,R16            ;

                CPI     R16,1                       ; if (OSIntNesting == 1) {
                BRNE    USART0_RXISR_1

                LDS     R30,OSTCBCur                ;     OSTCBCur->OSTCBStkPtr = Y
                LDS     R31,OSTCBCur+1
                ST      Z+,R28
                ST      Z+,R29                      ; }
USART0_RXISR_1:
                CALL    USART0_RXISR_Handler         ; Call tick ISR Handler written in C

                CALL    OSIntExit                   ; Notify uC/OS-II about end of ISR

                POP_SP                              ; Restore the hardware stack pointer from task's stack
                POP_SREG_INT
                POP_ALL                             ; Restore all registers
                RETI


堆栈大小也设定为128字节 我觉得够用了 但是程序运行一段时间,就死机了。。

最新回复

还是没有完全解决问题的啊。  详情 回复 发表于 2010-4-28 14:21
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我怀疑是中断嵌套的问题,是在任务切换的时候,来了中断,但是系统时钟节拍也进入中断。   系统走到OSTimeDly(20) 处 死机的。。。。。


请高人多多帮忙。。 在线等待。。。。。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
频繁中断,中断嵌套,频繁压入栈,会不会造成堆栈溢出呢?我对ucos2刚学不久,也不敢确定,呵呵。

ucos在任务切换之前,处理就绪列表的时候是关中断的,切换的时候才用中断机制。虽然中断很多,都有不同优先级,也就有先后,应该不会出问题吧? 我怀疑是中断嵌套过多造成堆栈溢出。死机很多都是因为这个,呵呵。

我不是ucos高手,不懂,只是怀疑,呵呵!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

4
 
干嘛要搞这么复杂,中断能不嵌套就不嵌套,嵌套要处理很多潜在的问题!
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 
#pragma vector=USART0_RXC_vect
__interrupt void USART0_RX_interrupt( void )
)
{

        unsigned char data;
        unsigned char tmphead;
          _CLI();

        /* Read the received data */
        data = UDR0;                 
        /* Calculate buffer index */
        tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;
        USART_RxHead = tmphead;      /* Store new index */
       if ( tmphead == USART_RxTail )
        {
                /* ERROR! Receive buffer overflow */
        }
       
        USART_RxBuf[tmphead] = data;
          _SEI();

        TCNT2 = 0;                  
        TIFR |= (1 << 7);
        TIMSK_OCIE2 = 1;            
        tmr_count = 0;

}
这个函数在不写中断服务函数的情况下,是完全可以使用的,但是这个中断根本没有达到由ucos系统来管理,
在实时要求上,能达到吗,   ucos 系统是不是失去了他的根本意义。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
ucos之所以管理中断:
1. 为了保证它的调度是受控的
2. 为了方便在中断服务函数中也能使用操作系统功能,但是要特别小心!
3. 在可控的情况下,可以有不受操作系统管理的中断。

如果想了解更多,请看此书:
基于嵌入式实时操作系统的程序设计技术,周航慈、吴光文著,北航出版。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
1. 为了保证它的调度是受控的
-->为了保证OS的调度功能是受控的。
 
 
 

回复

117

帖子

0

TA的资源

五彩晶圆(高级)

8
 
还是没有完全解决问题的啊。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表