久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3169|回復: 0
打印 上一主題 下一主題
收起左側

ucosII信號量學習資料及代碼

[復制鏈接]
跳轉到指定樓層
樓主
附件中有某高校ucosII有關信號量的ppt及相關代碼。

在uCOS_II.H中增加變量定義    1
在test.c中注釋掉變量y    1
文件OS_SEM.C中的OSSemPend函數中添加紅色部分代碼    1
文件OS_SEM.C中的OSSemPost函數中添加紅色部分代碼    3

在uCOS_II.H中增加變量定義
/********************************************************************************************************
                                            GLOBAL VARIABLES
**********************************************************************************************************/

OS_EXT  INT8U             y;   //定義打印輸出位置變量
OS_EXT  INT32U            OSCtxSwCtr;               /* Counter of number of context switches           */

#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
OS_EXT  OS_EVENT         *OSEventFreeList;          /* Pointer to list of free EVENT control blocks    */
OS_EXT  OS_EVENT          OSEventTbl[OS_MAX_EVENTS];/* Table of EVENT control blocks                   */
#endif

在test.c中注釋掉變量y

文件OS_SEM.C中的OSSemPend函數中添加紅色部分代碼
void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3      /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr;
#endif   
    char str[25];

    if (OSIntNesting > 0) {  /* See if called from ISR ...   */
        *err = OS_ERR_PEND_ISR;  /* ... can't PEND from an ISR         */
        return;
    }
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {   /* Validate 'pevent'             */
        *err = OS_ERR_PEVENT_NULL;
        return;
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type  */
        *err = OS_ERR_EVENT_TYPE;
        return;
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ...   */
        pevent->OSEventCnt--;    /* ... decrement semaphore only if positive.     */
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;

        sprintf(str, "task%d--resource count: %d", OSTCBCur->OSTCBPrio, pevent->OSEventCnt);
        PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

        return;
    }
    /* Otherwise, must wait until event occurs       */
    OSTCBCur->OSTCBStat |= OS_STAT_SEM;  /* Resource not available, pend on semaphore     */
    OSTCBCur->OSTCBDly   = timeout;  /* Store pend timeout in TCB      */
    OS_EventTaskWait(pevent);    /* Suspend task until event or timeout occurs    */
    OS_EXIT_CRITICAL();

    sprintf(str, "task%d--I'll wait", OSTCBCur->OSTCBPrio);
    PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

    OS_Sched();        /* Find next highest priority task ready         */
    OS_ENTER_CRITICAL();
    if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
        OS_EventTO(pevent);
        OS_EXIT_CRITICAL();
        *err = OS_TIMEOUT;    /* Indicate that didn't get event within TO      */

        sprintf(str, "task%d--time out", OSTCBCur->OSTCBPrio);
        PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

        return;
    }
    OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
    OS_EXIT_CRITICAL();
    sprintf(str, "task%d--finally get it", OSTCBCur->OSTCBPrio);
    PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
    *err = OS_NO_ERR;
}
文件OS_SEM.C中的OSSemPost函數中添加紅色部分代碼

INT8U  OSSemPost (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3      /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;                              
#endif   
    char str[25];

#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {  /* Validate 'pevent'      */
        return (OS_ERR_PEVENT_NULL);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type   */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore    */
        OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);   /* Ready highest prio task waiting on event */
        OS_EXIT_CRITICAL();

        sprintf(str, "task%d--I'll Sched", OSTCBCur->OSTCBPrio);
        PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

        OS_Sched();   /* Find highest priority task ready to run  */

        sprintf(str, "task%d--back from Sched", OSTCBCur->OSTCBPrio);
        PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

        return (OS_NO_ERR);
    }
    if (pevent->OSEventCnt < 65535) {   /* Make sure semaphore will not overflow    */
        pevent->OSEventCnt++;     /* Increment semaphore count to register event   */
        OS_EXIT_CRITICAL();

        sprintf(str, "task%d--resource count: %d", OSTCBCur->OSTCBPrio, pevent->OSEventCnt);
        PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

        return (OS_NO_ERR);
    }
    OS_EXIT_CRITICAL();       /* Semaphore value has reached its maximum       */

    sprintf(str, "task%d--OS_SEM_OVF", OSTCBCur->OSTCBPrio);
    PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);

    return (OS_SEM_OVF);
}


07-任務的同步與通信.zip

300.99 KB, 下載次數: 22, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久性色精品国产免费观看 | 亚洲免费一区二区 | www国产成人免费观看视频,深夜成人网 | 亚洲精品久久久久久久久久久久久 | 武道仙尊动漫在线观看 | 欧美视频1| 综合网在线 | 91精品国产综合久久精品 | 最新日韩精品 | 玖玖色在线视频 | 亚洲成人中文字幕 | 国产亚洲一区二区三区在线 | 久久精品国产久精国产 | 亚洲精品av在线 | 天天艹日日干 | 精品国产欧美一区二区 | 三级国产三级在线 | 国产激情视频 | 亚洲一区 中文字幕 | 亚洲影视在线 | 日韩在线视频免费观看 | 免费在线观看成人 | 国产高清免费视频 | 成人在线不卡 | 成人免费大片黄在线播放 | aaa在线观看| 国产一区在线免费观看 | 午夜在线视频一区二区三区 | 91色啪| 4h影视 | 久久精品国产亚洲 | 久久电影一区 | 国精产品一区一区三区免费完 | 国产 日韩 欧美 中文 在线播放 | 国产小视频自拍 | 免费在线播放黄色 | 蜜月va乱码一区二区三区 | 亚洲精久| 国产精品久久久久久一区二区三区 | 黑人巨大精品欧美一区二区免费 | 超碰97人人人人人蜜桃 |