国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 3820|回復: 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
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产福利在线观看永久视频 | 四虎影视884a精品国产四虎 | 亚洲视频在线观看免费视频 | 最近国产在线观看免费完整版 | 综合色在线观看 | 大乳欲妇三级一区二区三区 | 精品国产免费观看一区高清 | 免费看日本羞羞视频 | 91精品国产免费青青碰在线观看 | 亚洲 欧美 国产另类首页 | 每日更新国产精品视频 | 最新在线黄色网址 | 韩国福利视频一区二区 | 在线亚视频 | 落跑甜心电视剧全集免费观看在线 | www.一区| 日韩 视频在线播放 | 两个人在线观看完整 | 国产对白刺激真实精品91 | 老妇毛片久久久久久久久 | 午夜精品在线 | 久久精品99 | 色婷婷丁香 | 亚洲午夜久久久久久91 | 91香蕉视频在线观看免费 | 国产卡一卡二卡3卡4卡无卡视频 | 97中文字幕在线观看 | 人九九精品 | 久久免费观看国产99精品 | 久久久久逼 | 在线观看欧美视频 | 欧美日韩一区二区三区久久 | 青青在线国产视频 | 免费在线亚洲 | 黄片毛片视频 | 日本不卡一区视频 | 免费一级毛片无毒不卡 | 日本中文字幕一区二区高清在线 | 日本精品久久久久久久 | 射进来h | 国产成人18黄网站免费 |