HarmonyOS中信号量实验

简介: 大家好,我是ST,今天主要和大家聊一聊,如何使用鸿蒙系统中的信号量。

23dc725131a44aceaba0e4dfff3bf7e0.png

第一:HarmonyOS 内核信号量基本简介

  信号量是基于软件互斥或硬件互斥方法实现的一种用于同步和互斥的机制。信号量是一个确定的二元组(s,q),其中s是一个具有非负初值的整形变量,q是一个初始状态为空的队列。

第二:信号量API分析

   osSemaphoreNew()

osSemaphoreId_t osSemaphoreNew(uint32_t max_count,uint32_t initial_count,const osSemaphoreAttr_t

功能描述:

函数osMessageQueueNew创建并初始化一个消息队列对象。该函数返回消息队列对象标识符,如果出现错误则返回NULL,可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,也可以在内核初始化 (调用 osKernelInitialize)之前调用该函数。

参数:

名字 描述
max_count 可用令牌的最大数量.
initial_count 可用令牌的初始数量.
attr 信号量的属性;空:默认值.

osSemaphoreRelease()

osStatus_t osSemaphoreRelease(osSemaphoreId_t semaphore_id)

功能描述:函数osSemaphoreRelease释放由参数semaphore_id指定的信号量对象的标记

参数:

名字 描述
semaphore_id 由osSemaphoreNew获得的信号量ID.

osSemaphoreAcquire()

osStatus_t osSemaphoreAcquire(osSemaphoreId_t semaphore_id,uint32_t timeout)

功能描述:阻塞函数osSemaphoreAcquire一直等待,直到由参数semaphore_id指定的信号量对象的标记可用为止。如果一个令牌可用,该函数立即返回并递减令牌计数。

参数:

名字 描述
semaphore_id 由osSemaphoreNew获得的信号量ID.

timeout 超时值.

第三:软件设计

  在Semaphore_example函数中,通过osSemaphoreNew()函数创建了sem1信号量,Thread_Semaphore1()函数中通过osSemaphoreRelease()函数释放两个信号量,Thread_Semaphore2()和Thread_Semaphore3()函数中,先开始阻塞等待sem1信号量。只有当Thread_Semaphore1()函数中增加两次信号量,Thread_Semaphore2()和Thread_Semaphore3()才能继续同步运行。若Thread_Semaphore1()函数中只增加一次信号量,那Thread_Semaphore2()和Thread_Semaphore3()只能轮流执行。

void Thread_Semaphore1(void)
{
    while(1)
  {
    osSemaphoreRelease(sem1);  //释放两次sem1信号量,使得Thread_Semaphore2和Thread_Semaphore3能同步执行
        osSemaphoreRelease(sem1);  //此处若只释放一次信号量,则Thread_Semaphore2和Thread_Semaphore3会交替运行。
        printf("Thread_Semaphore1 Release  Semap \n");
        osDelay(100);
  }
}
void Thread_Semaphore2(void)
{    
    while(1)
  {
    osSemaphoreAcquire(sem1,osWaitForever);//申请sem1信号量
        printf("Thread_Semaphore2 get Semap \n");
        osDelay(1);
  }
}
void Thread_Semaphore3(void)
{    
    while(1)
  {
    osSemaphoreAcquire(sem1,osWaitForever);//等待sem1信号量
        printf("Thread_Semaphore3 get Semap \n");
        osDelay(1);
  }
}
void Semaphore_example (void)
{ 
    osThreadAttr_t attr;  
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024*4;
    attr.priority = 24;
    attr.name = "Thread_Semaphore1";
    if (osThreadNew((osThreadFunc_t)Thread_Semaphore1, NULL, &attr) == NULL) 
    {
        printf("Falied to create Thread_Semaphore1!\n");
    }
    attr.name = "Thread_Semaphore2";
    if (osThreadNew((osThreadFunc_t)Thread_Semaphore2, NULL, &attr) == NULL) 
    {
        printf("Falied to create Thread_Semaphore2!\n");
    }
    attr.name = "Thread_Semaphore3";
    if (osThreadNew((osThreadFunc_t)Thread_Semaphore3, NULL, &attr) == NULL) 
    {
        printf("Falied to create Thread_Semaphore3!\n");
    }
    sem1=osSemaphoreNew(4, 0, NULL);  
    if (sem1 == NULL) 
    {
        printf("Falied to create Semaphore1!\n");
    }
}

第四:编译调试

   修改BUILD.gn文件

   修改applications\BearPi\BearPi-HM_Nano\sample路径下 BUILD.gn 文件,指定 semp_example 参与编译。

#"A1_kernal_thread:thread_example",
#"A2_kernel_timer:timer_example",
#"A3_kernel_event:event_example",
#"A4_kernel_mutex:mutex_example",
"A5_kernel_semaphore:semaphore_example",
#"A6_kernel_message:message_example",

第五:运行结果

   示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,Thread_Semaphore1一次释放两个信号量,Thread_Semaphore2和Thread_Semaphore3同步执行。

Thread_Semaphore1 Release  Semap 
Thread_Semaphore2 get Semap 
Thread_Semaphore3 get Semap 
Thread_Semaphore1 Release  Semap 
Thread_Semaphore2 get Semap 
Thread_Semaphore3 get Semap 
Thread_Semaphore1 Release  Semap 
Thread_Semaphore2 get Semap 
Thread_Semaphore3 get Semap 


目录
相关文章
|
消息中间件 测试技术 API
FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)
我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析
1878 0
FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)
|
存储 自然语言处理 安全
DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转
DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转
1579 0
DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转
|
存储 安全 Linux
linux系统中u-boot命令的EMMC和SD卡操作命令分析
linux系统中u-boot命令的EMMC和SD卡操作命令分析
2137 1
|
API 调度
HarmonyOS系统中内核多线程开发
HarmonyOS系统中内核多线程开发
659 0
HarmonyOS系统中内核多线程开发
|
10月前
|
人工智能 JSON API
淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量
在电商竞争激烈的环境下,淘宝、天猫通过集成物流查询API,实现实时追踪包裹位置,显著减少用户咨询量。本文解析其原理、实现步骤与效益,展示如何以技术手段提升用户体验、降低客服压力,助力平台高效运营。(238字)
|
存储 弹性计算 测试技术
10分钟私有部署QwQ-32B模型,像购买Ecs实例一样快捷
虽然阿里云提供了基于 IaaS 部署 QwQ-32B 模型的方式,但传统的基于IaaS的部署方式需要用户自行配置环境、安装依赖、优化硬件资源,并解决复杂的网络与存储问题,整个流程不仅耗时耗力,还容易因操作失误导致各种不可预见的问题。 因此,阿里云计算巢提供了基于ECS镜像与VLLM的大模型一键部署方案,通过ECS镜像打包标准环境,通过Ros模版实现云资源与大模型的一键部署,用户无需关心模型部署运行的标准环境与底层云资源编排,10分钟即可部署使用QwQ-32B模型,15分钟即可部署使用Deepseek-R1-70B模型。
|
弹性计算 运维 监控
课时1:微服务架构与混沌工程介绍
课时1:微服务架构与混沌工程介绍
|
数据库连接 数据库 Python
信号量(Semaphore)是一个同步工具
信号量(Semaphore)是一个同步工具
637 14
互联网发展历程:探究主机连接与网线的重要角色
互联网发展历程:探究主机连接与网线的重要角色
389 0
|
Java 关系型数据库 数据库连接
MyBatis 处理长字段(long varchar)
MyBatis 处理长字段(long varchar)
487 0
MyBatis 处理长字段(long varchar)

热门文章

最新文章