<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 3887|回復: 0
    打印 上一主題 下一主題

    [提問] 請教高手一個UC/os-II隔信號量的問題

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2011-3-21 20:53:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    下面是周立功的一個例子:  #include "main.h"
    #define TaskAdcSend_ID            17                                /* 任務的ID                     */
    #define TaskAdcSend_PRIO          TaskAdcSend_ID                  /* 任務的優先級                 */
    #define TaskAdcSend_STACK_SIZE    512                               /* 定義用戶堆棧長度             */
       
    #define TaskBeep_ID            18                                    /* 任務的ID                     */
    #define TaskBeep_PRIO          TaskBeep_ID                          /* 任務的優先級                 */
    #define TaskBeep_STACK_SIZE    512                                   /* 定義用戶堆棧長度             */
    OS_STK  TaskAdcSend_STACK[TaskAdcSend_STACK_SIZE];
    OS_STK  TaskBeep_STACK[TaskBeep_STACK_SIZE];OS_EVENT  *Sem1;void TaskAdcSend(void *pdata);
    void TaskBeep(void *pdata);#define     KEY1 1 << 12                              /* P0.12為中斷輸入腳            */
    #define test
    /*********************************************************************************************************
    ** Function name: TimeDly
    ** Descriptions:  軟件延時
    ** Input:         dly
    ** Output:        無
    *********************************************************************************************************/  
    void TimeDly(uint32 dly)
    {
        uint32 i,j;
        for(i = 0; i < dly; i++)
            for(j = 0; j < 10000; j++);
    }/********************************************************************************************************
    ** Function name: ExtInt_Exception
    ** Descriptions:  GPIO管腳P0.12出發的外部中斷的中斷服務程序
    ** Input:         無
    ** Output:        無
    *********************************************************************************************************/   
    void ExtInt_Exception(void)
    {   

        TimeDly(30);                                                        /* 軟件延時,消除抖動           */
        OSSemPost(Sem1);                                                    //發出信號量,key腳下降沿才生中斷發出信號量
        IO0IntClr |=  KEY1;                                  /* 清零P0.12中斷                */
        VICVectAddr = 0;                                  /* 向量中斷結束                 */}
       
    /*********************************************************************************************************
    ** Function name : main
    ** Descriptions  : 主函數
    ** Input         : 無
    ** Output        : 無
    ** Created Date  : 2006-04-11
    ********************************************************************************************************/
    int main (void)
    {
        OSInit();
    OSTaskCreateExt(TaskAdcSend,
                        (void *)0,
                        &TaskAdcSend_STACK[TaskAdcSend_STACK_SIZE-1],
                        TaskAdcSend_PRIO,
                        TaskAdcSend_ID,
                        &TaskAdcSend_STACK[0],
                        TaskAdcSend_STACK_SIZE,
                        (void *)0,
                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
        OSTaskCreateExt(TaskBeep,
                        (void *)0,
                        &TaskBeep_STACK[TaskBeep_STACK_SIZE-1],
                        TaskBeep_PRIO,
                        TaskBeep_ID,
                        &TaskBeep_STACK[0],
                        TaskBeep_STACK_SIZE,
                        (void *)0,
                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
        OSStart();                                       
    }
      /*******************************************************************************************************
    ** Function name: Task_AdcSend
    ** Descriptions:  無
    ** Input:         無
    ** Output:        無
    ********************************************************************************************************/
    void TaskAdcSend (void *pdata)
    {
    uint8 err;
    uint32 ADC_Data;
    char str[20];

    pdata = pdata;     TargetInit();
         
        PINSEL0    &= ~(0X03<<24);
        IO0IntEnF  |= KEY1;                                           /* 設置P0.12為下降沿中斷        */
        IO0IntClr  = 0xffffffff;                                            /* 首先清零中斷標志位           */ SetVICIRQ(17,1,(uint32)ExtInt_Exception);                           /* 分配外部中斷3的優先級為1,   */
                                                                         /* GPIO觸發的外部中斷和外部中   */
                                                                         /* 斷3同用一個中斷號            */
        Sem1 = OSSemCreate(0);
       
    PCONP |=1 <<12;                                /* 打開ADC的功率控制位          */

    PINSEL1 = (PINSEL1&0xffff3fff)|(0x01<<14);                      /* 設置P0.23為AIN0[0]功能       */
    /*
      *  進行ADC模塊設置
      */
        AD0CR = (1<<0)   |                                                  /* SEL = 0X01,選擇通道0         */
       ((Fpclk / 1000000 - 1) << 8)|                             /* CLKDIV=Fpclk/1000000-1,      */
                                                                   /* 轉換時鐘為1MHz               */
       (0 << 16)|                                                 /* BURST=0,軟件控制轉換操作     */
       (0 << 17)|                                                 /* CLKS=0, 使用11clock轉換      */
       (1 << 21)|                                                  /* PDN=1,正常工作模式           */
       (1 << 24);                                              /* START=1,直接啟動ADC轉換      */
          
    OSTimeDly(OS_TICKS_PER_SEC/100);
    ADC_Data = ADDR0;                                              /* 讀取ADC結果,并清除DONE標志位*/
        BUZZER_Set();
    OSTimeDly(OS_TICKS_PER_SEC/10);
    BUZZER_Clr();
    OSTimeDly(OS_TICKS_PER_SEC/10);
    while(1)
    {  
          OSSemPend(Sem1,0,&err);
       AD0CR |= 1 << 24;                                 /* 進行第一次轉換               */
       while ((AD0STAT & (1<<0)) == 0);                             /* 等待AIN0轉換結束             */
       ADC_Data = ADDR0;                                 /* 讀取ADC結果                  */
       AD0CR |= 1 << 24;                                 /* 再次啟動轉換                 */
       while ((AD0STAT & (1<<0)) == 0);                             /* 等待AIN0轉換結束             */
       ADC_Data = ADDR0;                                 /* 讀取ADC結果                  */
       ADC_Data = (ADC_Data >> 6) & 0x3ff;
       ADC_Data = ADC_Data * 2500;                           /* 參考電壓由精密恒壓源提供的2.5V*/
       ADC_Data = ADC_Data / 1024;
       
       sprintf(str, "AD轉換的電壓為:");
       UART0_SendStr(str);
       sprintf(str, "%4d mV \r\n", ADC_Data);
       UART0_SendStr(str);
    }
    }
    /**********************************************************************************************************
    ** Function name: TaskBeep
    ** Descriptions:  無
    ** Input:         無
    ** Output:        無
    **********************************************************************************************************/void TaskBeep (void *pdata)
    {
    pdata = pdata;
    while(1)
    {  
       BUZZER_Set();
         OSTimeDly(OS_TICKS_PER_SEC/2);
       BUZZER_Clr();  
       OSTimeDly(OS_TICKS_PER_SEC/2);
    }
    }  感覺這個程序是用信號量控制AD轉換的:KEY按下時就發出信號量,開始AD轉換,可是OSSemPend()等待超時時還是要運行Task_AdcSend,同樣進行了AD轉換,只是Task_AdcSend的*err=OS_TIMEOUT。這樣不是就沒有起到有key控制AD轉換的效果
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷