liteos中sem的使用
sem就是信号量,其使用如下所示:
在使用sem之前先要创建sem
LOS_SemCreate(0, &g_usSemID);
创建后,就可以调用LOS_SemPend 来得到一个信号量,调用LOS_SemPost 释放一个信号量static VOID Example_SemTask1(VOID)
{UINT32 uwRet;dprintf("Example_SemTask1 try get sem g_usSemID ,timeout 10 ticks.\n");/* get sem, timeout is 10 ticks */
#获取信号量uwRet = LOS_SemPend(g_usSemID, 10);/* get sem ok */if (LOS_OK == uwRet){
#成功获取后释放信号量LOS_SemPost(g_usSemID);return;}
}
下来我们具体看看如何获取信号量
LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 uwSemHandle, UINT32 uwTimeout)
{UINT32 uwIntSave;SEM_CB_S *pstSemPended;UINT32 uwRetErr;LOS_TASK_CB *pstRunTsk;pstSemPended = GET_SEM(uwSemHandle);#得到正在运行的taskpstRunTsk = (LOS_TASK_CB *)g_stLosTask.pstRunTask;
#将要得到的信号量赋值给当前进程pstRunTsk->pTaskSem = (VOID *)pstSemPended;
#将这个进程插入到pendlist中,并建立一个timer来唤醒这个进程得到信号量osTaskWait(&pstSemPended->stSemList, OS_TASK_STATUS_PEND, uwTimeout);(VOID)LOS_IntRestore(uwIntSave);
#释放cpuLOS_Schedule();if (pstRunTsk->usTaskStatus & OS_TASK_STATUS_TIMEOUT){uwIntSave = LOS_IntLock();pstRunTsk->usTaskStatus &= (~OS_TASK_STATUS_TIMEOUT);uwRetErr = LOS_ERRNO_SEM_TIMEOUT;goto errre_uniSemPend;}
#规定的时间内信号量被唤醒,没有timeout则返回成功return LOS_OK;
#否则返回失败,获取信号量失败
errre_uniSemPend:(VOID)LOS_IntRestore(uwIntSave);OS_RETURN_ERROR(uwRetErr);
}LITE_OS_SEC_TEXT VOID osTaskWait(LOS_DL_LIST *pstList, UINT32 uwTaskStatus, UINT32 uwTimeOut)
{LOS_TASK_CB *pstRunTsk;LOS_DL_LIST *pstPendObj;pstRunTsk = g_stLosTask.pstRunTask;osPriqueueDequeue(&pstRunTsk->stPendList);pstRunTsk->usTaskStatus &= (~OS_TASK_STATUS_READY);pstPendObj = &pstRunTsk->stPendList;pstRunTsk->usTaskStatus |= uwTaskStatus;
#将这个进程插入到pendlist中LOS_ListTailInsert(pstList,pstPendObj);if (uwTimeOut != LOS_WAIT_FOREVER){pstRunTsk->usTaskStatus |= OS_TASK_STATUS_TIMEOUT;
#建立一个timer在规定时间内唤醒这个进程osTaskAdd2TimerList((LOS_TASK_CB *)pstRunTsk, uwTimeOut);}
}
释放信号量的函数分析如下:LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 uwSemHandle)
{UINT32 uwIntSave;SEM_CB_S *pstSemPosted = GET_SEM(uwSemHandle);LOS_TASK_CB *pstResumedTask;
#需要释放的信号量不为null的话if (!LOS_ListEmpty(&pstSemPosted->stSemList)){
#从需要释放信号量的list中找到第一个taskpstResumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(pstSemPosted->stSemList))); /*lint !e413*/
#将要唤醒的task的sem置空pstResumedTask->pTaskSem = NULL;
#开始唤醒taskosTaskWake(pstResumedTask, OS_TASK_STATUS_PEND);
#恢复中断(VOID)LOS_IntRestore(uwIntSave);
#启动调度LOS_Schedule();}else{
#从这里可以知道信号量可以分别获取和释放多次pstSemPosted->usSemCount++;(VOID)LOS_IntRestore(uwIntSave);}return LOS_OK;
}
liteos中sem的使用相关推荐
- 【华为云技术分享】一行代码就能写一个日志打印组件,你信吗?为你揭晓LiteOS中日志打印组件的核心
1. 做实验引发的思考 在学习LiteOS日志打印组件使用的时候,我记录了一篇博客:atiny_log | LiteOS 物联网操作系统中的日志打印组件使用分享,关于实验的具体内容,请阅读这篇博客. ...
- liteos源码中的哨兵函数思想
直接进入正题 在rtos中,一般来说任务函数是不允许退出的,否则任务将通过lr寄存器返回.但在LiteOS中,系统在任务初始化时将任务的上下文初始化情况如下:r0寄存器被设置为任务的taskid ,p ...
- shell | LiteOS 物联网操作系统中的 shell 组件使用分享
1. 为什么使用shell组件 2. LiteOS中的shell组件 2.1. 源码 LiteOS中的shell组件源码如图: 这三个C文件是shell组件的实现文件,使用时只需要包含头文件<s ...
- 操作系统实验读者写者程序源码_SAST Weekly | STM32F103系列开发板移植华为LiteOS操作系统...
SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普.研究前沿热点介绍.科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享 ...
- 手把手带你玩转LiteOS Ping组件
摘要:本期小编为大家带来LiteOS开源版本Ping组件的使用说明,请跟随小编的步伐一起进入探索之旅吧! 本文分享自华为云社区<LiteOS组件尝鲜-玩转Ping>,作者:Lionlace ...
- 一起来学习LiteOS中断模块的源代码
摘要:本文带领大家一起剖析了LiteOS中断模块的源代码. 本文我们来一起学习下LiteOS中断模块的源代码,文中所涉及的源代码,均可以在LiteOS开源站点https://gitee.com/Lit ...
- 小熊派开发实践丨漫谈LiteOS之传感器移植
摘要:本文基于小熊派开发板简单介绍了如何在LiteOS中移植传感器,从而实现对于传感器的相关控制. 1 hello world 相信大家无论在学习编程语言开始的第一个函数应该是HelloWorld,本 ...
- 实践分享丨物联网操作系统中的任务管理
今天,我们分享的内容主要是物联网操作系统中的任务管理. 在开始正式的阅读分享帖之前,按惯例,我们需要思考几个问题: 1.进程和线程,你是否了解其区别与联系? 2.什么是任务? 3.物联网操作系统中的任 ...
- 【华为云技术分享】漫谈Huawei LiteOS五大内核模块
Huawei LiteOS是华为面向IoT领域,构建的"统一物联网操作系统和中间件软件平台",以轻量级(内核小于10k).低功耗(1节5号电池最多可以工作5年),快速启动,互联互通 ...
最新文章
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组...
- 50. Pow(x, n)
- 《Adobe After Effects CS6中文版经典教程》——1.3 创建合成图像与组织图层
- 【Mybatis 之应用篇】 3_Lombok、多对一处理和一对多处理
- 使ALV控件中的内容可编辑
- 设计模式C++实现(7)——观察者模式
- 运算放大器单电源应用中的使用齐纳二极管偏置方法
- windows下mysql5.6安装
- 单位阶跃信号是周期信号吗_直流散热风扇的信号你知道如何控制吗?
- 别轻易接受父母的建议
- python 读取txt中的英文内容 分析词频 可视化显示
- CentOS/RHEL 7中的firewall控制
- 属性篇(2)—If you love css …
- python下载完了之后怎么用_python下载后怎么用
- Nginx+rtmp模块实现直播推流
- 【软考 系统架构设计师】软件工程⑥ 软件系统建模
- 思科配置系统日志服务器配置,思科路由器 设置日志服务器配置
- VMware16安装Ubuntu22.04(并解决vmtools问题)
- xbox手柄适配器驱动_用于Windows的Xbox 360控制器无线接收器适配器
- 海豚php完全开发手册,ThinkPHP2.1完全开发手册