alios thing 信号量_互斥信号量_AliOS Things内核_API参考文档_AliOS Things 文档_IoT物联网操作系统 - 阿里云...

互斥信号量(mutex)的获取是完全互斥的,即同一时刻,mutex只能被一个任务获取。而信号量(sem)按照起始count的配置,存在多个任务获取同一信号量的情况,直到count减为0,则后续任务无法再获取信号量,当然sem的count初值设置为1,同样有互斥的效果。

Mutex的释放必须由占有该mutex的任务进行,其他任务进行释放,会直接返回失败。 为了解决优先级反转问题,高优先级的任务获取mutex时,如果该mutex被某低优先级的任务占用,

会动态提升该低优先级任务的优先级等于高优先级,并且将该优先级值依次传递给该低优先级任务依赖的互斥量关联的任务,以此递归下去。当某任务释放mutex时,会查找该任务的基础优先级,以及获取到的互斥量所阻塞的最高优先级的任务的优先级,取两者中高的优先级来重新设定此任务的优先级。总的原则就是,高优先级任务被mutex阻塞时,会将占用该mutex的低优先级任务临时提高;mutex释放时,相应任务的优先级需要恢复。

API列表

aos_mutex_new()

动态创建互斥信号量

aos_mutex_free()

删除互斥信号量

aos_mutex_lock()

请求互斥信号量

aos_mutex_unlock()

释放互斥信号量

aos_mutex_is_valid()

判断是否为有效的互斥信号量

API详情

aos_mutex_new()

函数原型:

int aos_mutex_new(aos_mutex_t *mutex)

定义描述

描述

动态创建互斥信号量

入参

mutex:互斥信号量结构体指针,需要用户定义一个aos_mutex_t结构体,并把该结构体指针传入

返回值

类型:int 返回成功或失败;返回0表示互斥信号量创建成功,非0表示失败。

aos_mutex_free()

函数原型:

void aos_mutex_free(aos_mutex_t *mutex)

定义描述

描述

删除互斥信号量

入参

mutex:互斥信号量结构体指针

返回值

aos_mutex_lock()

函数原型:

int aos_mutex_lock(aos_mutex_t *mutex, unsigned int timeout)

定义描述

描述

请求互斥信号量

入参

mutex:互斥信号量结构体指针

timeout:等待超时时间,单位ms。0表示非阻塞请求,立即返回;AOS_WAIT_FOREVER表示永久等待;其他值则等待timeout ms,超时后返回。可通过返回值判断是否获得互斥信号量。

返回值

类型:int 返回成功或失败;返回0表示请求互斥信号量成功,非0表示失败。

aos_mutex_unlock()

函数原型:

int aos_mutex_unlock(aos_mutex_t *mutex)

定义描述

描述

释放互斥信号量

入参

mutex:互斥信号量结构体指针

返回值

类型:int 返回成功或失败;返回0表示释放互斥信号量成功,非0表示失败。

aos_mutex_is_valid()

函数原型:

int aos_mutex_is_valid(aos_mutex_t *mutex)

定义描述

描述

判断是否为有效的互斥信号量

入参

mutex:互斥信号量结构体指针

返回值

类型:int 返回有效或无效; 返回0表示mutex为无效互斥信号量,返回1表示mutex为有效的互斥信号量。

调用示例

#include

aos_mutex_t test_mutex;

void task1_entry() {

int ret = -1;

while (1) {

ret = aos_mutex_is_valid(&test_mutex);

if (ret != 1) {

return;

}

ret = aos_mutex_lock(&test_mutex, AOS_WAIT_FOREVER);

if (ret != 0) {

continue;

}

/*访问临界资源*/

printf("task1 entry access critical zone\n");

aos_mutex_unlock(&test_mutex);

}

}

void task2_entry() {

int ret = -1;

while (1) {

ret = aos_mutex_is_valid(&test_mutex);

if (ret != 1) {

return;

}

ret = aos_mutex_lock(&test_mutex, 1000);

if (ret != 0) {

continue;

}

/*访问临界资源*/

printf("task2 entry access critical zone\n");

aos_mutex_unlock(&test_mutex);

}

}

int application_start(int argc, char *argv[])

{

int ret = -1;

ret = aos_mutex_new(&test_mutex);

if (ret != 0) {

return;

}

aos_task_new("task1", task1_entry, NULL, 512);

aos_task_new("task2", task2_entry, NULL, 512);

}

使用注意事项

只有获得互斥信号量的任务才能释放互斥信号量。中断也不能释放互斥信号量。

互斥信号量的请求与释放需成对使用,避免只有请求没有释放,导致其他任务无法获得互斥信号量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的信息,“installing : xdg-utils-1.1.0-0.16.20120809git.1.alios7.noarch 87/92 installing(正在安装:xdg-utils-1.1.0-0.16.20120809git.1.alios7.noarch 87/92)”是在进行软件安装过程中的显示信息。 这段信息表示正在安装一个名为xdg-utils的软件包。软件包的版本号为1.1.0,构建号为0.16,构建日期为2012年8月9日。包的类型为noarch,适用于任何体系结构。该软件包是由alios7构建,并且该软件包在安装顺序中是在总共92个软件包中的第87个。 安装软件包的目的是为了增强Linux系统的桌面集成功能。xdg-utils是一个由freedesktop.org提供的软件套件,提供一系列与桌面环境集成相关的实用工具。通过安装xdg-utils,用户可以更方便地进行程序的启动、文件的打开和浏览器的调用等操作。 在安装过程中,系统会检查软件包的依赖关系,以确保所需的其他软件包已经安装并满足要求。安装过程还可能涉及从软件源或安装媒体下载软件包文件,并将其解压到相应的目录中。 安装软件包的具体过程通常是自动化的,用户只需要等待安装完成。在安装过程中可能还会显示其他信息,如进度百分比或其他配置选项。完成安装后,用户可以根据软件包的使用指南来使用新安装的软件。 总而言之,“installing : xdg-utils-1.1.0-0.16.20120809git.1.alios7.noarch 87/92 installing”是软件安装过程中的显示信息,表示正在安装xdg-utils软件包,该软件包是用于增强Linux系统的桌面集成功能的实用工具套件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值