UCOS明白解析


    UCOSII 是一個可以基於 ROM 運行的、可裁減的、搶占式、實時多任務內核,具有高度可移植性,特別適合於微處理器和控制器,是和很多商業操作系統性能相當的實時操作系統(RTOS)。為了提供最好的移植性能, UCOSII 最大程度上使用 ANSI C 語言進行開發,並且已經移植到近 40 多種處理器體系上,涵蓋了從 8 位到 64 位各種 CPU(包括 DSP)。
    UCOSII 是專門為計算機的嵌入式應用設計的, 絕大部分代碼是用 C 語言編寫的。 CPU 硬件相關部分是用匯編語言編寫的、總量約 200 行的匯編語言部分被壓縮到最低限度,為的是便於移植到任何一種其它的 CPU 上。用戶只要有標准的 ANSI 的 C 交叉編譯器,有匯編器、連接器等軟件工具,就可以將 UCOSII 嵌人到開發的產品中。 UCOSII 具有執行效率高、占用空間小、實時性能優良和可擴展性強等特點, 最小內核可編譯至 2KB 。 
    UCOS主要有:
  任務管理:
    建立任務OSTaskCreat()/OSTaskCreatExt();
    任務堆棧OS_STK()
    堆棧檢驗OSTaskStkChk()
    刪除任務OSTaskDel()
    請求刪除任務OSTaskDelReq()
    改變任務的優先級OSTaskChangePrio()
    掛起任務OSTaskSuspend()
    恢復任務OSTaskResume()
    獲得任務的信息OSTaskQuery()
  時間管理:
    任務延遲函數OSTimeDly()
    按時,分,秒延時函數OSRimeDLyHMSM()
    恢復延時的任務OSTimeDlyResume()
    系統時間OSTimeGet()和OSTimeSet()
  內存管理:    
    Typedef  struct
    {
    void   *osmemaddr    ;指向內存分區起始地址的指針。
    Void   *osmemfreelist  ;指向下一個空余內存控制塊或者下一個空余內存塊的指針,
    Int32u  osmemblksize  ;內存分區中內存塊的大小,是建立內存分區時定義的。
    Int32u osmemnblks     ;內存分區中總的內存塊數量,也是建立該內存分區時定義的。
    Int32u  osmemnfree    ;內存分區塊中當前獲得的空余塊數量。
    }os_mem;
    建立一個內存分區,OSMemCreate()
    分配一個內存塊,OSMemGet()
    釋放一個內存塊,OSMemPut()
    查詢一個內存分區的狀態,OSQMemQuery()
  任務調度:
    任務控制塊TCB(Task Control Block)
    最高級就緒任務的TCB 地址OSTCBHighRdy
    OS_TASK_SW()函數來進行任務切換
  任務間通信與同步:信號、郵箱、隊列      
     使用UCOS最重要的還是了解信號量,信號量集,郵箱,消息隊列等的用法。在這里我主要以自己的理解來說明這個相關函數的用法。
1.信號量:用於從一個任務向另一個任務傳遞一個開關量的BOOL信號。
    創建信號量指針:OS_EVENT *OSSemFlag。
    創建信號量函數:OS_EVENT *OSSemCreate (INT16U cnt)。
    發送信號量函數:INT8U OSSemPost(OS_EVENT *pevent)。
    請求信號量函數:void OSSemPend( OS_EVENT *pevent, INT16U timeout, INT8U *err);其中需要注意的是Timeout,這個參數為0的時候表示無限等待,大於0就為表示演示多少個時鍾節拍。
   刪除信號量好函數:OS_EVENT *OSSemDel (OS_EVENT *pevent,INT8U opt, INT8U *err)。
2.郵箱 :用於從一個任務向另一個任務傳遞一個字節的數據。
    創建郵箱指針:OS_EVENT *OSMbox;
    創建郵箱函數:OSMboxPost (OS_EVENT *pevent,void *msg)
    請求郵箱函數:void *OSMboxPend (OS_EVENT *pevent, INT16U timeout,INT8U *err)其中需要注意的是Timeout,這個參數為0的時候表示無限等待,大於0就為表示演示多少個時鍾節拍。
    查詢郵箱狀態函數:OSMboxQuery(OS_EVENT *pevent,OS_MBOX_DATA *pdata) 。
    刪除郵箱函數:OS_EVENT *OSMboxDel(OS_EVENT *pevent,INT8U opt,INT8U *err)。
 3.信號量集:用於從一個任務向另一個任務傳遞最多32個開關量的BOOL信號集。
    創建信號量集指針:OS_FLAG_GRP *OutEnableCfgFlag。
    創建信號量集函數:OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags,INT8U *err )
    發送信號量集函數:OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)
    請求信號量集函數:OS_FLAGS OSFlagPend(OS_FLAG_GRP*pgrp, OS_FLAGS flags, INT8U wait_type, INT16Utimeout, INT8U *err)。注意:為了防止請求失效,一般使用OS_FLAGS+OS_FLAG_CONSUME的組合。
    查詢信號量狀態函數:OS_FLAG_GRP *OSFlagQuery(OS_FLAG_GRP *pgrp,INT8U *err ),我們可以使用這個函數來不斷查詢這個信號量集的狀態來做一些開關量的控制。
    刪除信號量集函數:OS_EVENT *OSFlagDel(OS_FLAG_GRP *pgrp,INT8U *err )
4.消息隊列:用於從一個任務向另一個任務傳遞多個字節的數據。
     創建消息隊列指針:OS_EVENT *  MainMenuUI; 
     創建消息隊列存儲數組:void * MsgGrp[16];
     創建消息隊列函數:OS_EVENT *OSQCreate(void**start,INT16U size)
     請求消息隊列函數:void*OSQPend(OS_EVENT*pevent,INT16U timeout,INT8U *err)
     查詢消息隊列函數: INT8U  OSQQuery(OS_EVENT*pevent,OS_Q_DATA *pdata)
     發送消息隊列函數:INT8U OSQPost(OS_EVENT*pevent,void *msg)和 INT8U OSQPost(OS_EVENT*pevent,void*msg)
     清空消息隊列函數: INT8U  OSQFlush(OS_EVENT*pevent)     
     刪除消息隊列函數:OS_EVENT *OSQDel(OS_EVENT*pevent)
5.軟件定時器:用於產生非硬件的定時器中斷,可以用計時。
    創建軟件定時器指針:OS_TMR   * ADCheckTime
    創建軟件定時器函數:OS_TMR *OSTmrCreateINT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK callback,void *callback_arg, INT8U *pname, INT8U *perr)
    打開軟件定時器函數:BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)
    關閉軟件定時器函數:BOOLEAN OSTmrStop (OS_TMR *ptmr,INT8U opt,void *callback_arg,INT8U *perr)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM