|
我在lm3s6965上移植uCOS,想实现这样一个功能:采集触摸屏的AD值,用串口输出,首先建立一个任务,等待触摸中断(实际用查询来做的)等到有触摸时,发送一个信号量,然后采集数值的任务开始运行,数值采集完后,将AD值存入一个定义的结构体,发送一个消息邮箱有然后串口任务就能有输出了,但实际运行效果是:串口一直有数据输出,并没有因消息有箱 的请求而处于等待状态这是什么原因呢?代码如下:
/*********************************************************************************************************
VARIABLES ±äÁ¿
*********************************************************************************************************/
OS_EVENT *semTouch;
OS_EVENT *boxUART;
pLocal tpLocal;
pLocal temp;
INT8U err;
static OS_STK GstkStart[TASK_START_STK_SIZE]; /* The stack of start task */
/* Æô¶¯ÈÎÎñµÄ¶ÑÕ» */
static OS_STK GstkTFT[TASK_HX8347_STK_SIZE]; /* TFTÆÁÈÎÎñµÄ¶ÑÕ» */
static OS_STK GstkADS7843[TASK_ADS7843_STK_SIZE];
static OS_STK GstkGetTouch[TASK_GETTOUCH_STK_SIZE];
static OS_STK GStkUART[TASK_UART_STK_SIZE];
/*********************************************************************************************************
FUNCTION PROTOTYPES º¯ÊýÉùÃ÷
*********************************************************************************************************/
static void taskStart(void *parg); /* The start task Æô¶¯ÈÎÎñ */
//static void taskHX8347(void *parg);
static void taskADS7843(void *parg);
static void taskGetTouch (void *parg);
static void taskUART(void *parg);
int main (void)
{
intDisAll(); /* Disable all the interrupts */
/* ¹Ø±ÕËùÓÐÖÐ¶Ï */
OSInit(); /* Initialize the kernel of uC */
/* OS-II ³õʼ»¯uC/OS-IIµÄÄÚºË */
temp->TP_X = 0;
temp->TP_Y = 0;
semTouch = OSSemCreate(0); //´´½¨²É¼¯´¥ÃþÖµ µÄÐźÅÁ¿
boxUART = OSMboxCreate((void *)0);
OSTaskCreate ( taskStart,
(void *)0,
&GstkStart[TASK_START_STK_SIZE-1],
TASK_START_PRIO ); /* Initialize the start task */
/* ³õʼ»¯Æô¶¯ÈÎÎñ */
OSStart(); /* Start uC/OS-II Æô¶¯uC/OS-II */
return(0) ;
}
static void taskStart (void *parg)
{
(void)parg;
targetInit(); /* Initialize the target's MCU */
/* ³õʼ»¯Ä¿±êµ¥Æ¬»ú */
#if OS_TASK_STAT_EN > 0
OSStatInit(); /* Enable statistics */
/* ʹÄÜͳ¼Æ¹¦ÄÜ */
#endif
/*
* Create the other tasks here. ÔÚÕâÀï´´½¨ÆäËûÈÎÎñ
*/
OSTaskCreate (taskADS7843, (void *)0,
&GstkADS7843[TASK_ADS7843_STK_SIZE-1],
TASK_ADS7843_PRIO);
OSTaskCreate (taskGetTouch, (void *)0,
&GstkGetTouch[TASK_GETTOUCH_STK_SIZE-1],
TASK_GETTOUCH_PRIO);
/* OSTaskCreate (taskHX8347, (void *)0,
&GstkTFT[TASK_HX8347_STK_SIZE-1],
TASK_HX8347_PRIO); */
OSTaskCreate (taskUART, (void *)0,
&GStkUART[TASK_UART_STK_SIZE-1],
TASK_UART_PRIO );
while (1) {
OSTaskSuspend(OS_PRIO_SELF); /* The start task can be pended*/
/* here. Æô¶¯ÈÎÎñ¿ÉÔÚÕâÀï¹ÒÆð */
}
}
#define ADSTATUE0 0
#define ADSTATUE1 1
#define ADSTATUE2 2
//pLocal XY;
static void taskGetTouch (void *parg)
{
static INT8U ADStatue=0;
(void)parg;
while(1)
{
OSTimeDlyHMSM (0,0,0,30);
switch (ADStatue)
{
case ADSTATUE0:
if((ADS7843_PenirqPort()&ADS7843_PENIRQ)!=ADS7843_PENIRQ){
ADStatue = ADSTATUE1;
}
break;
case ADSTATUE1:
if((ADS7843_PenirqPort()&ADS7843_PENIRQ)!=ADS7843_PENIRQ){
ADStatue = ADSTATUE2;
OSSemPost(semTouch);
}else{
ADStatue = ADSTATUE0;
}
break;
case ADSTATUE2:
if((ADS7843_PenirqPort()&ADS7843_PENIRQ)==ADS7843_PENIRQ){
ADStatue = ADSTATUE0;
}
break;
default :
break;
}
}
}
static void taskADS7843(void *parg)
{
(void)parg;
while(1)
{
OSSemPend(semTouch,0,&err);
// Get_LocalXY(tpLocal);
// ADS7843_GetADC(tpLocal);
ADS7843_GetLocal(tpLocal);
OSMboxPost(boxUART,tpLocal);
OSTimeDlyHMSM (0,0,0,20);
}
}
static void taskUART(void *parg)
{
(void)parg;
while(1)
{
temp = OSMboxPend(boxUART,0,&err);
UART_Put_Num(temp->TP_X);
UART_Send_Enter();
UART_Put_Num(temp->TP_Y);
UART_Send_Enter();
OSTimeDlyHMSM (0,0,0,20);
}
} |
|