LiteOS 信號量/互斥量/消息隊列/事件標誌組

一  LiteOS信號量

1.相關函數接口如下:

創建計數型信號量 UINT32 LOS_SemCreate(UINT16 usCount, UINT32 *puwSemHandle);
創建二值信號量 UINT32 LOS_BinarySemCreate(UINT16 usCount, UINT32 *puwSemHandle);
刪除信號量 UINT32 LOS_SemDelete(UINT32 uwSemHandle);
請求信號量 UINT32 LOS_SemPend(UINT32 uwSemHandle, UINT32 uwTimeout);
釋放信號量 UINT32 LOS_SemPost(UINT32 uwSemHandle)

2.使用二值信號量進行中斷與任務同步

UINT32 BinarySemId;/*  定義二值信號量的句柄 */

LOS_BinarySemCreate(1,&BinarySemId);/*  創建一個二值信號量*/

void USART1_IRQHandler(void)
{
    接受到串口數據
    LOS_SemPost( BinarySemId );/* 釋放信號量 */
}
 
void thread0(void* arg)
{
    while(1)
    {
        LOS_SemPend( BinarySemId, LOS_WAIT_FOREVER ); // 獲取二值信號量 xSemaphore, 沒獲取到則一直等待
        處理串口數據
    }
}

3. 使用信號量對共享資源上鎖

UINT32 BinarySemId;/*  定義二值信號量的句柄 */

LOS_BinarySemCreate(1,&BinarySemId);/*  創建一個二值信號量*/

void usart1_send_buf(uint8_t *buf, uint32_t len)
{
    LOS_SemPend( BinarySemId, LOS_WAIT_FOREVER );//獲取信號量,併爲串口1上鎖

    串口1發送數據
    
    LOS_SemPost( BinarySemId );//使用完釋放信號量,爲串口1解鎖,此時其他任務可以調用該函數輸出 */
}

4. 使用信號量進行資源計數

.........

二 LiteOS 互斥量

1. 互斥量相關函數

創建互斥量 UINT32 LOS_MuxCreate(UINT32 *puwMuxHandle);
刪除互斥量 UINT32 LOS_MuxDelete(UINT32 puwMuxHandle);
釋放互斥量 UINT32 LOS_MuxPost(UINT32 uwMuxHandle);
申請互斥量 UINT32 LOS_MuxPend(UINT32 uwMuxHandle, UINT32 uwTimeout);

2. 創建使用互斥量

UINT32 MutexId;/*  定義 互斥鎖 的句柄 */

LOS_MuxCreate(&MutexId);/*  創建一個 互斥鎖*/

LOS_MuxPost( MutexId ); //釋放 互斥鎖

LOS_MuxPend( MutexId, LOS_WAIT_FOREVER );// 獲取 互斥鎖, 沒獲取到則一直等待

三 LiteOS 消息隊列

1. 消息隊列相關接口函數

創建消息隊列 UINT32 LOS_QueueCreate(CHAR *pcQueueName,UINT16 usLen,UINT32 *puwQueueID,
                                               UINT32 uwFlags,UINT16 usMaxMsgSize);
刪除消息隊列 UINT32 LOS_QueueDelete(UINT32 uwQueueID);

往消息隊列中

寫數據

UINT32 LOS_QueueWrite(UINT32 uwQueueID,VOID *pBufferAddr,
                                           UINT32 uwBufferSize, UINT32 uwTimeOut);

往消息隊列中

寫數據(帶拷貝)

UINT32 LOS_QueueWriteCopy(UINT32 uwQueueID,VOID *pBufferAddr,
                                                     UINT32 uwBufferSize,UINT32 uwTimeOut);

往消息隊列頭中

寫數據

UINT32 LOS_QueueWriteHead(UINT32 uwQueueID,VOID *pBufferAddr,
                                                     UINT32 uwBufferSize, UINT32 uwTimeOut);

往消息隊列頭中

寫數據(帶拷貝)

UINT32 LOS_QueueWriteHeadCopy(UINT32 uwQueueID,
                                     VOID * pBufferAddr,
                                     UINT32 uwBufferSize,
                                     UINT32 uwTimeOut );
從消息隊列讀取數據 UINT32 LOS_QueueRead(UINT32 uwQueueID,
                                VOID *pBufferAddr,
                                UINT32 uwBufferSize,
                                UINT32 uwTimeOut);

從消息隊列讀取數據

(帶拷貝)

UINT32 LOS_QueueReadCopy(UINT32 uwQueueID, VOID *pBufferAddr,
                                                     UINT32 *puwBufferSize, UINT32 uwTimeOut);
獲取消息隊列信息 UINT32 LOS_QueueInfoGet(UINT32 uwQueueID, QUEUE_INFO_S *pstQueueInfo);

2 使用消息隊列發送消息

UINT32 QueueId;/*  定義消息隊列的句柄 */

/*  創建一個測試隊列*/
LOS_QueueCreate("Test_Queue",  /*  隊列的名稱 */
                16,  /*  隊列的長度 */
                &QueueId, /*  隊列的 ID( 句柄) */
                0,  /*  隊列模式,官方暫時未使用 */
                4); /*  節點大小,單位爲字節 */

typedef struct 
{
    uint8_t id;
    char msg[20];
}message_t;


message_t send_msg;//需要發送的消息
send_msg.id = 1;
strcpy(&send_msg.msg[0], "Queue test");
LOS_QueueWrite(QueueId,  /* 寫入(發送)隊列的 ID(句柄)  */
               &send_msg, /* 將消息的地址發送出去*/
               sizeof(message_t), /* 數據的長度 */
               0);// 等待時間爲0


message_t *rev_msg;//接受消息
LOS_QueueRead(QueueId,           /*  讀取(接收)隊列的 ID( 句柄) */
              &rev_msg,          /*  讀取(接收)的數據保存位置 */
              sizeof(message_t), /*  讀取(接收)的數據的長度*/
              LOS_WAIT_FOREVER); /*  等待時間:一直等 */

四 LiteOS事件標誌組

1. 事件標誌組相關函數

初始化事件標誌組 UINT32 LOS_EventInit(PEVENT_CB_S pstEventCB);
發送事件 UINT32 LOS_EventWrite(PEVENT_CB_S pstEventCB, UINT32 uwEvents);
清除事件 UINT32 LOS_EventClear(PEVENT_CB_S pstEventCB, UINT32 uwEvents);
讀取事件

UINT32 LOS_EventRead(PEVENT_CB_S pstEventCB, UINT32 uwEventMask,                                                         UINT32  uwMode, UINT32 uwTimeOut);

 根據用戶傳入的事件值、事件掩碼及校驗模式,返回用戶傳入的事件是否符合預期 UINT32 LOS_EventPoll(UINT32 *uwEventID, UINT32 uwEventMask, UINT32 uwMode);
銷燬事件 UINT32 LOS_EventDestory(PEVENT_CB_S pstEventCB);

2. 使用事件標誌組

EVENT_CB_S EventGroup_CB;/*  定義事件標誌組的控制塊 */

LOS_EventInit(&EventGroup_CB);/*  創建一個事件標誌組*/

LOS_EventWrite(&EventGroup_CB,0x01);/*  觸發一個事件 1 */


/*  等待事件標誌組 */
LOS_EventRead(&EventGroup_CB,   // 事件標誌組對象
              0x01,             // 等待任務感興趣的事件
              LOS_WAITMODE_AND, // 等待兩位均被置位
              LOS_WAIT_FOREVER );// 無期限等待
LOS_EventClear(&EventGroup_CB,~0x01); // 清除事件標誌

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章