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的使用相关推荐

  1. 【华为云技术分享】一行代码就能写一个日志打印组件,你信吗?为你揭晓LiteOS中日志打印组件的核心

    1. 做实验引发的思考 在学习LiteOS日志打印组件使用的时候,我记录了一篇博客:atiny_log | LiteOS 物联网操作系统中的日志打印组件使用分享,关于实验的具体内容,请阅读这篇博客. ...

  2. liteos源码中的哨兵函数思想

    直接进入正题 在rtos中,一般来说任务函数是不允许退出的,否则任务将通过lr寄存器返回.但在LiteOS中,系统在任务初始化时将任务的上下文初始化情况如下:r0寄存器被设置为任务的taskid ,p ...

  3. shell | LiteOS 物联网操作系统中的 shell 组件使用分享

    1. 为什么使用shell组件 2. LiteOS中的shell组件 2.1. 源码 LiteOS中的shell组件源码如图: 这三个C文件是shell组件的实现文件,使用时只需要包含头文件<s ...

  4. 操作系统实验读者写者程序源码_SAST Weekly | STM32F103系列开发板移植华为LiteOS操作系统...

    SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普.研究前沿热点介绍.科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享 ...

  5. 手把手带你玩转LiteOS Ping组件

    摘要:本期小编为大家带来LiteOS开源版本Ping组件的使用说明,请跟随小编的步伐一起进入探索之旅吧! 本文分享自华为云社区<LiteOS组件尝鲜-玩转Ping>,作者:Lionlace ...

  6. 一起来学习LiteOS中断模块的源代码

    摘要:本文带领大家一起剖析了LiteOS中断模块的源代码. 本文我们来一起学习下LiteOS中断模块的源代码,文中所涉及的源代码,均可以在LiteOS开源站点https://gitee.com/Lit ...

  7. 小熊派开发实践丨漫谈LiteOS之传感器移植

    摘要:本文基于小熊派开发板简单介绍了如何在LiteOS中移植传感器,从而实现对于传感器的相关控制. 1 hello world 相信大家无论在学习编程语言开始的第一个函数应该是HelloWorld,本 ...

  8. 实践分享丨物联网操作系统中的任务管理

    今天,我们分享的内容主要是物联网操作系统中的任务管理. 在开始正式的阅读分享帖之前,按惯例,我们需要思考几个问题: 1.进程和线程,你是否了解其区别与联系? 2.什么是任务? 3.物联网操作系统中的任 ...

  9. 【华为云技术分享】漫谈Huawei LiteOS五大内核模块

    Huawei LiteOS是华为面向IoT领域,构建的"统一物联网操作系统和中间件软件平台",以轻量级(内核小于10k).低功耗(1节5号电池最多可以工作5年),快速启动,互联互通 ...

最新文章

  1. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组...
  2. 50. Pow(x, n)
  3. 《Adobe After Effects CS6中文版经典教程》——1.3 创建合成图像与组织图层
  4. 【Mybatis 之应用篇】 3_Lombok、多对一处理和一对多处理
  5. 使ALV控件中的内容可编辑
  6. 设计模式C++实现(7)——观察者模式
  7. 运算放大器单电源应用中的使用齐纳二极管偏置方法
  8. windows下mysql5.6安装
  9. 单位阶跃信号是周期信号吗_直流散热风扇的信号你知道如何控制吗?
  10. 别轻易接受父母的建议
  11. python 读取txt中的英文内容 分析词频 可视化显示
  12. CentOS/RHEL 7中的firewall控制
  13. 属性篇(2)—If you love css …
  14. python下载完了之后怎么用_python下载后怎么用
  15. Nginx+rtmp模块实现直播推流
  16. 【软考 系统架构设计师】软件工程⑥ 软件系统建模
  17. 思科配置系统日志服务器配置,思科路由器 设置日志服务器配置
  18. VMware16安装Ubuntu22.04(并解决vmtools问题)
  19. xbox手柄适配器驱动_用于Windows的Xbox 360控制器无线接收器适配器
  20. 海豚php完全开发手册,ThinkPHP2.1完全开发手册

热门文章

  1. 漏洞解决方案-远程DNS服务允许递归查询
  2. C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息
  3. TCHAR char
  4. JS中判断NaN的方法
  5. 常见安防存储估算标准
  6. Vue高级语法(一) | 自定义指令详解
  7. 【迭代器】迭代器相应型别
  8. Unity 调用打印机遇到的坑
  9. 软件开发模型、软件设计模式、软件架构风格
  10. 常用英语食品词汇- 蔬菜类