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); // 清除事件标志

 

你可能感兴趣的:(STM32/RT1052)