 
- UID
- 1029342
- 性别
- 男
|

在ucos中的中断打开与在没有操作系统的条件下有很大的区别,我们需要在irq.s中,main函数中修改几处地方,另外需要注意的是:因为操作系统已经占用了定时器0和中断的通道0所以我们在使用的时候应该避开与之产生冲突,否则将导致系统崩溃。完整的程序还没有调试好,但是刚才已经出了中断了只是串口返回的数据还不对,还要据需调试。
下面是从网上搜到的一部分程序,关键的部分都已经列出,注意仔细检查,记住,很重要。
zlg那本书上都有写.
------------
irq.s file end)
UART0_Handler HANDLER UART0_Exception
------------
target.c:
void VICInit(void)
{
extern void IRQ_Handler(void);
extern void Timer0_Handler(void);
extern void UART0_Handler(void);
VICIntEnClr = 0xffffffff;
VICIntSelect = 0;
VICDefVectAddr = (uint32)IRQ_Handler; // Nun-Vect Interrupt address.
VICVectAddr0 = (uint32)Timer0_Handler;
VICVectCntl0 = (0x20 | 0x04);
VICVectAddr1 = (uint32)UART0_Handler;
VICVectCntl1 = (0x20 | 0x06);
VICIntEnable = (1 << 4) |
(1 << 6);
}
------------------
main.c
U0IER &= ~0X01;
U0IER |= 0X01;
开关中断.
isp:
void UART0_Exception(void)
{
uint8 IIR, i;
OS_ENTER_CRITICAL();
while(((IIR = U0IIR) & 0x01) == 0 )
{
SWITCH (IIR & 0x0e)
{
case 0x02:
// Tx Interrupt
if ( (uint8)TXOUT % BUFFER_LENGTH !=
(uint8)TXIN % BUFFER_LENGTH )
U0THR = Uart0TxBuf[(uint8)(TXOUT++)%BUFFER_LENGTH];
else U0IER &= ~0x02;
break;
case 0x04: // Rx Interrupt
/* buffer the data */
Uart0RxBuf[(uint8)(RXIN++)%BUFFER_LENGTH] = U0RBR;
/* find the keyword */
for (i=KEYWORD_LENGTH; i; i--)
{
if (Uart0RxBuf[(uint8)(RXIN-i)%BUFFER_LENGTH] !=
KEYWORD[KEYWORD_LENGTH-i])
break;
}
if (!i) OSSemPost(SemUart0);
/* queue full */
if ((uint8)RXIN%BUFFER_LENGTH == (uint8)RXOUT%BUFFER_LENGTH)
{
#if UART0_RXBUF_OVERFLOW_EN == 1
RXIN--;
#endif
OSSemPost(SemUart0);
}
break;
case 0x06:
break;
case 0x0c:
break;
default:
break;
}
}
VICVectAddr = 0;
OS_EXIT_CRITICAL();
} |
|