亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c04a_semaphore.c

?? Tornado的源代碼資源包
?? C
字號:
/* C04a_semaphore.c P72 */

/* 本程序修改自VxWorks5.5的培訓資料 */

/* 頭文件 */
#include "vxWorks.h"
#include "stdio.h"
#include "stdlib.h"
#include "semLib.h"
#include "taskLib.h"

/* 宏定義 */
#define NUM_SAMPLE  10            /* 組成一個樣本的數據的個數 */
#define DELAY_TICKS 8             /* 模擬產生數據的間隔時間 */
#define STACK_SIZE  20000         /* 分配給每個任務的堆棧大小 */
                                  
/* 類型定義 */
typedef struct _LIST_NODE 
{
    int                data;      /* 節點數據 */
    struct _LIST_NODE *pNextNode; /* 指向下一個節點的指針 */
}LIST_NODE;

/* 全局變量 */
int        tidCosmos;             /* 任務ID定義 */
int        tidSchlep;
int        tidCrunch;
int        tidMonitor;
int        cosmicData = 0;        /* 模擬產生的數據 */
int        result     = 0;        /* 樣本處理結果 */
LIST_NODE *pCurrNode  = NULL;     /* 數據列表的頭指針 */
SEM_ID     dataSemId;             /* 信號量ID,用于同步,數據可用時釋放 */
SEM_ID     syncSemId;             /* 信號量ID,用于同步,樣本可用時釋放 */
SEM_ID     nodeListGuardSemId;    /* 信號量ID,用于互斥,保護數據列表 */

/* 函數聲明 */
void cosmos(void);
void nodeAdd(int data);
void schlep(void);
void nodeScrap(void);
void crunch(void);
void monitor(void);
void progStop(void);

/******************************************************************
*
* progStart - 啟動實例程序
*
* 負責創建信號量與任務
*
* RETURNS: OK
*/
STATUS progStart(void)
{
    /* 創建信號量 */
    syncSemId          = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
    dataSemId          = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
    nodeListGuardSemId = semMCreate(SEM_Q_PRIORITY
                                  | SEM_INVERSION_SAFE
                                  | SEM_DELETE_SAFE);
    
    /* 初始化變量 */
    pCurrNode = NULL;

    /* 創建任務 */
    tidCosmos = taskSpawn("tCosmos", 200, 0, STACK_SIZE,
                          (FUNCPTR)cosmos,0,0,0,0,0,0,0,0,0,0);

    tidSchlep = taskSpawn("tSchlep", 220, 0, STACK_SIZE,
                          (FUNCPTR)schlep,0,0,0,0,0,0,0,0,0,0);

    
    tidCrunch = taskSpawn("tCrunch", 240, 0, STACK_SIZE,
                          (FUNCPTR) crunch,0,0,0,0,0,0,0,0,0,0);

    tidMonitor = taskSpawn("tMonitor", 250, 0, STACK_SIZE,
                          (FUNCPTR) monitor,0,0,0,0,0,0,0,0,0,0);

    return (OK);
}

/******************************************************************
*
* cosmos - 仿真接收中斷的服務程序
*
* 仿真了數據接收ISR(中斷服務程序)所作的工作,
* 每次釋放一次信號量代表數據到來一次
*
* RETURNS: N/A
*/
void cosmos(void)
{
    FOREVER
    {
        /* 制造數據,
         * 生成一個偽隨機整數,范圍=[0-RAND_MAX]
         */
        cosmicData = rand();

        /* 通知數據接收任務 */
        semGive(dataSemId);

        /* 延遲,保證產生的數據被接收任務處理 */
        taskDelay(DELAY_TICKS);
    }

    return;
}

/******************************************************************
*
* nodeAdd - 將樣本數據存儲到數據鏈表
*
* 申請一個數據節點來保持樣本數據,并將節點前插入數據鏈表中
* 
* RETURNS: N/A
*/
void nodeAdd
    (
    int data         /* 需要存入的數據 */
    )
{
    LIST_NODE *node; /* 用于創建新的數據節點 */

    if ((node = (LIST_NODE *) malloc(sizeof(LIST_NODE))) != NULL)
    {
        /* 保存樣本數據 */
        node->data      = data;

        /* 將節點前插入數據鏈表中 */
        semTake(nodeListGuardSemId, WAIT_FOREVER); 
        node->pNextNode = pCurrNode;
        pCurrNode       = node;
        semGive(nodeListGuardSemId);
    }
    else
    {
        printf("nodeAdd: Out of Memory.\n");
        taskSuspend(0);
    }

    return;
}

/*******************************************************************
*
* schlep - 將采集到的數據組成一個樣本
*
* 將采集到的數據,每NUM_SAMPLE個一組,組成一個樣本,樣本用全局的數據鏈表存儲
*
* 每組成一個樣本之后,利用二進制信號量的同步功能,喚醒(Unpend)樣本處理任務
*
* RETURNS: N/A
*/
void schlep(void)
{
    int i;
  
    FOREVER
    {
        for(i = 0; i < NUM_SAMPLE; i++)
        {
            /* 等數據 */
            semTake(dataSemId, WAIT_FOREVER);

            /* 保存數據 */
            nodeAdd(cosmicData);
        }

        /* 將單個的樣本發給tCrunch */
        semGive(syncSemId); 
    }  

    return;
}

/******************************************************************
*
* nodeScrap - 從數據鏈表中刪除首個數據節點
*
* 互斥訪問數據鏈表,完成從數據鏈表中刪除首個數據節點的工作
*
* RETURNS: N/A
*/

void nodeScrap(void)
{
    LIST_NODE *pTmpNode; /* 指向首個數據節點 */

    /* 互斥訪問數據鏈表 */
    semTake(nodeListGuardSemId, WAIT_FOREVER); 
    if (pCurrNode != NULL)
    {
        pTmpNode    = pCurrNode;
        pCurrNode   = pCurrNode->pNextNode; 
        free(pTmpNode);         
    }
    /* 互斥結束 */
    semGive(nodeListGuardSemId);
    
    return;
}

/******************************************************************
*
* crunch - 處理樣本數據
*
* 利用二進制信號量的同步功能,等待tSchlep發送一個樣本。
* 對收到的樣本數據進行求和處理。
*
* RETURNS: N/A
*/
void crunch(void)
{
    int sampleSum; /* 保存樣本數據之和 */
 
    FOREVER
    {
        /* 數據清零 */
        sampleSum = 0;

        /* 同步,等待樣本 */
        semTake(syncSemId, WAIT_FOREVER); 
        
        /* 互斥訪問數據鏈表 */
        semTake(nodeListGuardSemId, WAIT_FOREVER);

        while (pCurrNode != NULL)
        {
            /* 對樣本數據求和 */
            sampleSum += pCurrNode->data;

            /* 遞歸訪問,刪除數據 */
            nodeScrap();
        }
        
        /* 互斥結束 */
        semGive(nodeListGuardSemId);
        
        /* 更新結果 */
        result = sampleSum;
    }
}

/*****************************************************************
*
* monitor - 監視程序運行情況
*
* 監視程序運行情況,并顯示結果
* 當result>average時,顯示HOT,反之顯示COOL
*
* RETURNS: N/A
*/
void monitor(void)
{
    int isHot   = FALSE; /* 標志:TRUE = 熱;FALSE = 冷 */
    int average = 0;     /* 平均值 */

    /* 一個樣本中的數據總數為NUM_SAMPLE
     * 每個數據的取值范圍為[0-RAND_MAX]
     */    
    average = RAND_MAX * NUM_SAMPLE / 2;

    FOREVER
    {
        if ((!isHot) && (result >= average))
        {
            isHot = TRUE;
            printf("HOT\n");
        }
        else if (isHot && (result < average))
        {                 
            isHot = FALSE;
            printf("COOL\n");
        }
    }

    return;
}

/*********************************************************************
* progStop - 停止實例程序
*
* 調用本函數來停止本實例程序,刪除創建的任務并釋放信號量資源。
*
* RETURNS: N/A
*/
void progStop(void)
{
    /* 互斥信號量有刪除保護功能,
     * 必須成功獲得之后再進行刪除任務的工作
     * 
     * nodeScrap()中需要使用互斥信號量
     * 必須在刪除互斥信號量調用
     */
    result = semTake(nodeListGuardSemId, WAIT_FOREVER);
    
    if (result == OK)
    {
        taskDelete(tidCosmos);
        taskDelete(tidSchlep);
        taskDelete(tidCrunch);
        taskDelete(tidMonitor);

        /* 清空數據鏈表 */
        while (pCurrNode != NULL)
        {
            nodeScrap();
        }
    }

    /* 釋放信號量資源 */
    semDelete(dataSemId);
    semDelete(syncSemId);
    semDelete(nodeListGuardSemId);

    printf("BYE!\n");
    return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区伦理片| 欧美一级黄色片| 7777精品伊人久久久大香线蕉最新版| 欧美精品一区在线观看| 亚洲成人资源网| 成人av一区二区三区| 欧美成人精品3d动漫h| 亚洲一区二区在线免费看| 懂色av一区二区三区免费看| 精品美女被调教视频大全网站| 一区二区在线免费观看| 国产成人欧美日韩在线电影 | 一区二区三区不卡在线观看 | 日本亚洲一区二区| 日本高清免费不卡视频| 国产精品美女久久久久高潮| 九九国产精品视频| 欧美tickle裸体挠脚心vk| 日韩精品乱码av一区二区| 一本大道久久精品懂色aⅴ| 中文字幕一区二区三区蜜月| 福利视频网站一区二区三区| 日韩视频永久免费| 狂野欧美性猛交blacked| 91精品国产综合久久香蕉麻豆| 午夜久久久影院| 欧美日韩国产系列| 五月婷婷激情综合网| 欧美午夜不卡在线观看免费| 一区二区三区国产| 91电影在线观看| 亚洲一区在线观看网站| 欧美日韩一区二区在线观看视频| 一区二区高清视频在线观看| 欧美在线|欧美| 午夜精品福利久久久| 欧美一卡2卡3卡4卡| 蜜桃在线一区二区三区| 精品成人私密视频| 国产河南妇女毛片精品久久久| 26uuu国产日韩综合| 国产91精品一区二区| 国产精品久久久久一区二区三区共 | 久久www免费人成看片高清| 精品第一国产综合精品aⅴ| 国产一区二区三区不卡在线观看| 久久综合九色欧美综合狠狠| 粉嫩在线一区二区三区视频| 国产精品色在线| 欧洲人成人精品| 欧美bbbbb| 国产精品天美传媒| 色欧美片视频在线观看| 蜜臀久久99精品久久久画质超高清| 日韩欧美综合一区| 成人精品视频.| 亚洲图片欧美视频| 精品捆绑美女sm三区| 不卡的av电影在线观看| 性久久久久久久久久久久| 精品美女一区二区| 色婷婷综合久色| 蜜臀久久99精品久久久久久9| 中文成人综合网| 欧美日本韩国一区二区三区视频| 国产一区三区三区| 亚洲在线一区二区三区| 欧美成人a在线| 色婷婷激情一区二区三区| 久久精品久久久精品美女| 国产精品久久久久久久岛一牛影视| 欧美午夜在线观看| 国产成人啪免费观看软件| 天堂精品中文字幕在线| 中文字幕 久热精品 视频在线| 欧美日韩一级视频| 99久久精品国产网站| 美女网站视频久久| 亚洲码国产岛国毛片在线| 精品电影一区二区三区 | 亚洲国产视频a| 国产午夜精品久久久久久免费视| 欧美亚洲另类激情小说| 国产精品一二二区| 男人操女人的视频在线观看欧美| 国产精品九色蝌蚪自拍| 2017欧美狠狠色| 欧美放荡的少妇| 91成人在线免费观看| 成人动漫一区二区| 国产乱人伦偷精品视频免下载| 亚洲不卡在线观看| 亚洲影院在线观看| 亚洲图片你懂的| 国产精品福利一区二区| 久久久99精品免费观看| 精品国产一区二区三区不卡 | 中文字幕亚洲精品在线观看| 精品久久久久久久久久久久久久久 | 国产suv精品一区二区三区| 日本不卡不码高清免费观看| 亚洲午夜在线电影| 一区二区三区欧美日| 亚洲视频每日更新| 亚洲欧美福利一区二区| 亚洲欧洲日韩女同| 中文字幕亚洲成人| 国产精品黄色在线观看| 国产精品国产三级国产专播品爱网 | 中文字幕五月欧美| 中文一区二区在线观看| 亚洲国产精品av| 国产精品久久久久7777按摩| 国产精品美女久久久久av爽李琼| 国产精品女主播在线观看| 国产女人aaa级久久久级| 久久精品综合网| 国产精品午夜在线观看| 国产精品亲子伦对白| 国产精品久久久久aaaa樱花| 亚洲欧美偷拍三级| 一区二区三区在线观看网站| 一区二区三区在线免费播放| 亚洲国产精品久久人人爱蜜臀 | 欧美视频你懂的| 欧美日高清视频| 欧美一区二区三区男人的天堂| 欧美一级片在线观看| www国产成人免费观看视频 深夜成人网| 欧美成人性战久久| 国产女人18毛片水真多成人如厕| 1000部国产精品成人观看| 亚洲精品欧美激情| 日本成人在线视频网站| 国产乱淫av一区二区三区| 成人久久久精品乱码一区二区三区| av成人免费在线观看| 欧美主播一区二区三区美女| 日韩一区二区三区高清免费看看| 欧美成人福利视频| 国产精品丝袜在线| 亚洲一区av在线| 国产综合久久久久影院| 96av麻豆蜜桃一区二区| 欧美精品自拍偷拍动漫精品| 久久亚区不卡日本| 亚洲精品国产一区二区三区四区在线| 亚洲第四色夜色| 国产精选一区二区三区| 在线一区二区三区四区五区| 日韩欧美久久久| 亚洲综合自拍偷拍| 国内不卡的二区三区中文字幕| 97精品国产露脸对白| 日韩一区二区三区精品视频| 自拍偷拍亚洲欧美日韩| 看电视剧不卡顿的网站| 97久久人人超碰| 欧美精品一区二区不卡| 一区二区三区高清在线| 国产69精品久久777的优势| 欧美老年两性高潮| 国产精品网站在线| 久草精品在线观看| 欧美亚洲综合色| 国产精品国产精品国产专区不蜜| 日韩国产高清影视| 色菇凉天天综合网| 中文字幕精品一区二区三区精品 | 国产成人午夜片在线观看高清观看| 欧美性猛片xxxx免费看久爱| 久久久久青草大香线综合精品| 亚洲国产sm捆绑调教视频 | 亚洲色图欧美激情| 国产精品一区二区x88av| 欧美日本国产视频| 亚洲一区二区三区爽爽爽爽爽| 国产a精品视频| 久久先锋资源网| 日本女优在线视频一区二区| 欧美日韩综合在线免费观看| 亚洲色图欧洲色图婷婷| 国产91富婆露脸刺激对白| 欧美精品一区二区高清在线观看| 亚洲国产毛片aaaaa无费看| 日本高清免费不卡视频| 亚洲欧洲美洲综合色网| 成熟亚洲日本毛茸茸凸凹| 久久一区二区视频| 国产永久精品大片wwwapp| 日韩欧美一卡二卡| 日韩和欧美一区二区| 欧美久久久影院| 首页欧美精品中文字幕| 欧美日本免费一区二区三区| 午夜精品久久一牛影视| 欧美三级视频在线| 手机精品视频在线观看| 91麻豆精品国产91久久久久| 日本91福利区|