|
发表于 2014-4-28 11:39:07
|
显示全部楼层
NUC120在COOS中打开串口0中断,接收到数据后就一直在中断里循环跳不出来.使用手册上说可以像无操作系统一样使用中断回调函数的,请教是什么原因造成的?附上程序.
#include <stdio.h>
#include <CoOS.h> /*!< CooCox RTOS header file.*/
#include "INIT.h"
#include "NUC1xx.h"
/*---------------------------------- Define ---------------------------------*/
#define TASK_STK_SIZE 128 /*!< Define stack size. */
#define LEDTASK_PRI 2 /*!< Priority of 'time_set' task. */
#define KEYTASK_PRI 3 /*!< Priority of 'tcd_blink' task. */
#define UART0TASK_PRI 4 /*!< Priority of 'display_adc' task. */
#define UART1TASK_PRI 5 /*!< Priority of 'tart_print' task. */
/*---------------------------------- Variable Define -------------------------*/
OS_STK LEDTASK_Stk[TASK_STK_SIZE]; /*!< Stack of 'task_init' task. */
OS_STK KEYTASK_Stk[TASK_STK_SIZE]; /*!< Stack of 'lcd_display_adc' . */
OS_STK UART0TASK_Stk[TASK_STK_SIZE]; /*!< Stack of 'uart_print' task. */
OS_STK UART1TASK_Stk[TASK_STK_SIZE]; /*!< Stack of 'led_display' task. */
void LEDTASK(void *pdata)
{
pdata = pdata;
for (;;)
{
DrvGPIO_ClrBit(E_GPA, 5);
CoTickDelay (5);
DrvGPIO_SetBit(E_GPA, 5);
CoTickDelay (5);
}
}
void KEYTASK(void *pdata)
{
pdata = pdata;
for (;;)
{
if(DrvGPIO_GetBit(E_GPB,14)==0)
{
DrvGPIO_ClrBit(E_GPA, 4);
}
else
{
DrvGPIO_SetBit(E_GPA, 4);
}
CoTickDelay (1);
}
}
void UART0TASK(void *pdata)
{
pdata = pdata;
for (;;)
{
//DrvUART_Write(UART_PORT0,"UART0TASK RUN",13);
CoTickDelay (10);
}
}
int main()
{
Init();
CoInitOS();
CoCreateTask(LEDTASK, (void *)0, LEDTASK_PRI,&LEDTASK_Stk[TASK_STK_SIZE-1], TASK_STK_SIZE);
CoCreateTask(KEYTASK, (void *)0, KEYTASK_PRI,&KEYTASK_Stk[TASK_STK_SIZE-1], TASK_STK_SIZE);
CoCreateTask(UART0TASK, (void *)0, UART0TASK_PRI,&UART0TASK_Stk[TASK_STK_SIZE-1], TASK_STK_SIZE);
CoStartOS();
while (1);
}
void UART0_Callback(uint32_t u32IntStatus)
{
int16_t revchar;
CoEnterISR();
if(u32IntStatus&DRVUART_RDAINT)
{
while(UART0->ISR.RDA_IF==1)
{
DrvGPIO_ClrBit(E_GPA, 3);
revchar=_DRVUART_RECEIVEBYTE(UART_PORT0);
_DRVUART_SENDBYTE(UART_PORT0,revchar);
}
}
CoExitISR();
}
|
|