一 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); // 清除事件標誌