µCOS-III 任务同步机制-任务信号量

news/2024/10/6 9:07:01/

1. 什么是任务信号量

        任务信号量是一种用于任务间同步和通信的计数器,通常用于解决任务间的竞争条件和资源共享问题。在µC/OS-III中,任务信号量提供了二进制信号量和计数信号量两种类型:

  • 二进制信号量:只能取值0或1,适用于信号和事件标志。
  • 计数信号量:可以取任意非负整数值,适用于资源计数。

2. 任务信号量的基本操作

µC/OS-III提供了一组API函数来操作任务信号量,这些函数包括创建信号量、等待信号量、释放信号量等。下面是一些常用的任务信号量API函数:

  • OSSemCreate(): 创建一个信号量。
  • OSSemPend(): 等待一个信号量。
  • OSSemPost(): 释放一个信号量。
  • OSSemDel(): 删除一个信号量。

3. 示例代码

以下是一个简单的示例代码,展示了如何在µC/OS-III中使用任务信号量进行任务间的同步:

#include <os.h>OS_SEM MySem;void Task1(void *p_arg)
{OS_ERR err;while (1){// 等待信号量OSSemPend(&MySem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);if (err == OS_ERR_NONE){// 执行任务// ...}}
}void Task2(void *p_arg)
{OS_ERR err;while (1){// 释放信号量OSSemPost(&MySem, OS_OPT_POST_1, &err);if (err == OS_ERR_NONE){// 执行其他任务// ...}OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err); // 延迟1秒}
}int main(void)
{OS_ERR err;// 初始化µC/OS-IIIOSInit(&err);// 创建信号量OSSemCreate(&MySem, "My Semaphore", 0, &err);// 创建任务OSTaskCreate((OS_TCB *)&Task1TCB, "Task 1", Task1, 0, TASK1_PRIO, Task1Stk, TASK1_STK_SIZE / 10, TASK1_STK_SIZE, 0, 0, 0, (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), &err);OSTaskCreate((OS_TCB *)&Task2TCB, "Task 2", Task2, 0, TASK2_PRIO, Task2Stk, TASK2_STK_SIZE / 10, TASK2_STK_SIZE, 0, 0, 0, (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), &err);// 启动多任务调度OSStart(&err);return 0;
}

4. 任务与信号量交互的时序图

5. 任务信号量的使用场景

任务信号量在嵌入式系统中有广泛的应用场景,特别是以下几个方面:

  1. 任务同步:任务信号量可以用于确保多个任务按照一定的顺序执行。例如,任务A必须在任务B之后执行,信号量可以用于协调它们的执行顺序。
  2. 资源管理:任务信号量可以用于管理共享资源的访问。例如,一个打印机资源需要被多个任务共享,信号量可以确保同一时间只有一个任务可以访问打印机。
  3. 事件通知:任务信号量可以用于通知任务某个事件的发生。例如,传感器数据准备好后,可以通过信号量通知处理数据的任务。

6. 避免死锁,避免死锁

在使用任务信号量时,需要特别注意避免死锁。死锁发生在两个或多个任务相互等待对方释放资源,从而导致任务无法继续执行的情况。避免死锁的一种有效方法是确保任务获取信号量的顺序一致,防止循环等待。


http://www.ppmy.cn/news/1473886.html

相关文章

QT学习(7)——QT中绘图学习,画笔QPainter,画刷QBrush,类型颜色宽度的设置;高级设置,抗锯齿、移动画家;画家画图片,点击按钮移动实现

目录 引出绘图学习新建一个项目使用初体验画笔颜色、宽度设置画笔类型设置画刷的使用代码 高级设置抗锯齿画家移动状态保存和还原 画家画图片插曲&#xff1a;如何添加图片资源 进行绘图点击按钮图片右移 总结QT中的鼠标事件定义QLable的鼠标进入离开事件提升为myLabel重写QLab…

免杀笔记 ----> DLL注入

这段时间我们暂时没什么事情干的话我们就继续更新我们的免杀笔记力&#xff01;&#xff01;&#xff01; &#xff1a;今天我们讲DLL注入 目录 1.DLL注入 2.直接加载DLL&#xff1f; 3.远程线程注入 获取Handle 远程申请内存空间 将我们的CS的DLL加载入内存 创建远程线…

ubuntu22.04-ROS2-humble安装

前期准备 修改Ubuntu Hosts文件&#xff1a;这项工作非常重要&#xff0c;如果不修改&#xff0c;ROS 2 GPG key无法安装&#xff0c;无法进行ROS2的安装。&#xff08;可能跟网络限制有关&#xff0c;也许哪天就不用添加这个hosts了&#xff09; sudo gedit /etc/hosts 在打开…

Django学习第三天

python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…

麦蕊智数,,另外一个提供免费的股票数据API,可以通过其提供的接口获取实时和历史的股票数据。

麦蕊智数&#xff0c;&#xff0c;提供免费的股票数据API&#xff0c;可以通过其提供的接口获取实时和历史的股票数据。 API接口&#xff1a;http://api.mairui.club/hslt/new/您的licence 备用接口&#xff1a;http://api1.mairui.club/hslt/new/您的licence 请求频率&#x…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…

【MotionCap】pycharm 远程在wsl2 ubuntu20.04中root的miniconda3环境

pycharm wsl2 链接到pycharmsbin 都能看到内容,/root 下内容赋予了zhangbin 所有,pycharm还是看不到/root 下内容。sudo 安装了miniconda3 引发了这些问题 由于是在 root 用户安装的miniconda3 所以安装路径在/root/miniconda3 里 这导致了环境也是root用户的,会触发告警 WA…

加密(3)非对称加密

一、介绍 1、概念 非对称加密&#xff0c;又称现代加密算法&#xff0c;非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。加密和解密使用的是两个不同的密钥&#xff0c;这种算法叫作非对称加密算法。 2、示例 首先生成密钥对, 公钥为(5,14)&#…