搜索
bottom↓
回复: 3

我的uCOS程序不知为什么串口一直有输出?

[复制链接]

出0入0汤圆

发表于 2011-7-21 22:42:36 | 显示全部楼层 |阅读模式
我在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);
               
        }
}

出0入0汤圆

 楼主| 发表于 2011-7-25 12:37:10 | 显示全部楼层
在线等啊...

出0入0汤圆

发表于 2011-7-25 18:55:55 | 显示全部楼层
你是不是应该检测一下是不是有收到信号再发送数据呢????taskUart中

出0入0汤圆

 楼主| 发表于 2011-7-26 20:46:47 | 显示全部楼层
回复【2楼】zhonggp 青枫
-----------------------------------------------------------------------

将任务taskADS7843去掉,直接检测有触摸发生时,串口输出正常数据(此时只用了信号量)当加上taskADS7843后,在通过消息邮箱控制UART时,就出错了,但不知道怎样解决诶...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表