当前位置: 代码迷 >> 单片机 >> ucos ii 中断 任务有关问题
  详细解决方案

ucos ii 中断 任务有关问题

热度:555   发布时间:2016-04-28 16:28:15.0
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<<UDRIE0); /* Disable UDRE interrupt */
}
  _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字节 我觉得够用了 但是程序运行一段时间,就死机了。。

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

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

我不是ucos高手,不懂,只是怀疑,呵呵!
------解决方案--------------------
ucos之所以管理中断:
1. 为了保证它的调度是受控的