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. 使用信号量进行资源计数
.........
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 );// 获取 互斥锁, 没获取到则一直等待
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); /* 等待时间:一直等 */
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); // 清除事件标志