stm32cubemx hal学习记录:FreeRTOS信号量

news2024/11/15 9:32:40

一、基本配置

1、配置RCC、USART1、时钟84MHz

2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。

3、初始化LED的两个引脚、两个按键引脚

4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可

5、创建二值信号量Binary Semaphore

Semaphore Name: 信号量名称

Allocation: 分配方式  Dynamic 动态内存创建

Conrol Block Name: 控制块名称

如果想要创建计数信号量Counting Semaphore,必须在 Config parameters 中进行使能。

 Semaphore Name: 信号量名称

Count: 计数信号量的最大值

Allocation: 分配方式:Dynamic 动态内存创建

Conrol Block Name: 控制块名称

6、创建两个任务,一个接收任务,一个发送任务

7、生成代码

二、API

1、创建一个二值量、并返回一个ID:osSemaphoreCreate

osSemaphoreDef(BinarySem01);
BinarySem01Handle = osSemaphoreCreate(osSemaphore(BinarySem01), 1);

2、删除一个信号量:osSemaphoreDelete

包括二值信号量,计数信号量,互斥量和递归互斥量。如果有任务阻塞在该信号量上,那么不要删除信号量

osSemaphoreDelete(BinarySem01Handle);

3、释放信号量的宏:osSemaphoreRelease

释放的对象必须是已经创建的,可以用于二值信号量、计数信号量、互斥量的释放,但不能释放由函数xSemaphoreCreateRecursiveMutex() 创建的互斥量。

osSemaphoreRelease(BinarySem01Handle);

4、获取信号量:osSemaphoreWait

用于获取信号量,不带中断保护。获取的信号量对象可以是二值信号量、计数信号量和互斥量,但是递归互斥量并不能使用这个API函数获取。

int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec)

三、阻塞式二值信号量

void ReceiveTask(void const * argument)
{
  osStatus xReturn = osErrorValue;

  for(;;)
  {
    xReturn = osSemaphoreWait(BinarySemHandle, /* 二值信号量句柄 */ 
                               osWaitForever); /* 等待时间 */ 
    if(osOK == xReturn) 
    {
        printf("BinarySem get!\n\n");
    }
  }
}

void SendTask(void const * argument)
{
  osStatus xReturn;
  for(;;)
  {
    if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_SET) 
    { 
        xReturn = osSemaphoreRelease(BinarySemHandle);//给出二值信号量 
        if(osOK == xReturn)
        {
            printf("release!\r\n"); 
        }
        else 
        {
            printf("BinarySem release fail!\r\n"); 
        }
    } 
    osDelay(100);
  }
}

四、计数信号量

当公共资源没有用完时,任务量的个数还可以添加,当公共资源用完时,第一个任务移除公共资源,新加入的进去。

eg按下key1申请车位,按下key2释放车位

osSemaphoreDef(BinarySem01);
BinarySem01Handle = osSemaphoreCreate(osSemaphore(BinarySem01), 1);

osSemaphoreDef(CountingSem02);
CountingSem02Handle = osSemaphoreCreate(osSemaphore(CountingSem02), 5);
void Send_thread_entry(void const * argument)
{
  osStatus xReturn;
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) == GPIO_PIN_SET) 
    { 
        xReturn = osSemaphoreRelease(CountingSem02Handle);// 给出计数信号量 
        if(osOK == xReturn)
        {
            printf( "Key2 is pressed to release 1 parking space.\n" ); 
        }
        else 
        {
            printf( "Key2 is pressed, but there is no parking space to release!\n" );  
        }
    } 
    osDelay(500);
  }
}


void Receive_thread_entry(void const * argument)
{

  osStatus xReturn = osErrorValue;
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET) 
    {
        xReturn = osSemaphoreWait(CountingSem02Handle,0); /* 计数信号量句柄 *//* 等待时间:0 */ 
                                           
        if(osOK == xReturn) 
        {
            printf( "Key1 is pressed and successfully applied for parking space.\n" ); 
        }
        else 
        {
            printf( "Key1 is pressed. Sorry, the parking lot is full now!\n" ); 
        }
        osDelay(500);
    }

  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPv6通信实验

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 实验命令指南 1)配置ip地址 在r2上: 在r3上:…

TDengine

目录1、在linux上安装服务端2、在本地安装客户端3、通过Idea连接服务端4、控制台基本使用5、流式计算1、在linux上安装服务端 1、首先下载服务端,我下载的是: TDengine-server-2.6.0.30-Linux-x64.tar.gz 下载地址 2、下载过后传到虚拟机。并解压 3、运…

当有一天TCP/IP没有了TCP

前几天我在给NetDAM可靠传输想更好的算法,发现我自己也傻x了,最根本的原因是要抛弃滑动窗口呀,解耦保序才是关键. 本来想明年愚人节写如果有一天TCP/IP没了IP,那么只能TCP over RDMA了...但是也不排除为了兼容以太网只能TCP over…

C语言中,可变参数函数调用的过程?!

以下是一位同学,发送给我的问题。 如下图,是学生在学习完指针章节后,写的测试代码。 他的疑问是:pa为什么指向a[3]的地址啊? 查看程序的输出后,知道他想问的是:为什么第二个printf语句输出的分…

嵌入式开发:从C语言成功过渡的3个技巧

当谈到嵌入式系统编程语言时,毫无疑问,C是主导语言。在过去的几十年里,有无数次尝试改变,但当尘埃落定时,C编程语言似乎永远是屹立不倒的语言。近年来,关于用其他语言取代C语言的争论再次出现。无论潜在的篡…

A-Level经济例题解析及练习Analysis of trade

今日知识点:Analysis of trade 例题Without trade, PD $3000, Q 400; in world markets, PW $1500 Under free trade, how many TVs will the country import or export? Identify consumer surplus, producer surplus, and total surplus without trade, and w…

Golang标准库限流器rate使用

限流就是限制系统的输入和输出流量来达到保护系统的目的,限流在实际场景中应用十分广泛,尤其在高并发场景下,为了保证系统的可以用性,我们需要采取一些限流措施降级,一旦达到限制的阈值,就需要限制流量并采…

Vue-admin-template新增TagViews标签页功能,附完整代码

前言 vue-admin-template里面本身是没有TagViews标签页的,只有完整版的vue-element-admin才有,翻找网上的其他教程,要么代码不完整,要么有bug,本篇文章就教大家如何在vue-admin-template的基础上新增TagViews 步骤 …

分布式应用kafka + EFLFK集群部署

前言 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)…

骨传导耳机优缺点有哪些?骨传导耳机科普与推荐

骨传导耳机是一种可以开放耳朵的耳机,所以对于耳朵比较敏感的人来说,这种耳机是比较友好的,同时因为它的佩戴方式,在运动圈内也很受欢迎。只不过骨传导耳机是一种新兴的耳机,所以很多人并不太了解它的优缺点。 我作为…

书店销售管理系统----数据库原理及应用综合实验

枯木逢春犹再发,人无两度再少年🍂 系统主要模块如下: (1) 书店销售管理系统设计与实现—图书入库管理及查询统计 图书入库管理:维护入库图书信息(如图书编号、书名、作者、价格、图书分类、出版…

vue-element-admin后台前端解决方案(基于 vue 和 element-ui)

vue-element-admin后台前端解决方案参考文档下载安装目录结构参考文档 vue-element-admin官网,更多详细内容可以查看社区学习文档。 下载安装 可以把 vue-element-admin当做工具箱或者集成方案仓库,在 vue-admin-template 的基础上进行二次开发&#…

Java 8 给我们更好的消灭空指针解决方案

前言 大家好,在平时的业务开发中,空指针是我们经常遇到的问题, 他可能会导致我们的流程无法正常进行或者一些意外情况的发生。 这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢? 空指针场景 包装…

Linux系统安装DB2数据库的详细步骤

1、DB2数据库的安装 一、将DB2的安装介质上传至/home目录,并解压: tar –zxvf v9.5fp3_linuxx64_server.tar.gz 二、执行LANGC 三、进入解压后的server目录(cd server/),执行./db2setup,步骤如下: # cd…

数据结构-线性表与链性表(二)

目录 一、学习背景 二、简绍 三、线性表 一、什么是线性表 二、操作 1、插入 2、删除 3、查询 三、数组应用案例中源码分析 1、插入 2、删除 3、get与set 4、扩容 二、单向链表 单向链表结构 循环链表 三、数组和链表比较 1、时间复杂度角度 2、其他维度 3、…

【JS】原生js实现矩形框的绘制/拖动/缩放

1、要点及功能描述 通过js监听mouse事件来实现矩形框的绘制,再通过区分点击的是边角还是其他位置来实现矩形框的缩放和拖动,并且在拖动和缩放时,都做了边界限制,当缩放或拖动 到边界时,就不能继续拉缩放拖动了。当然在…

【个人简介】一枚在上海的AndroidiOSWindow逆向电子工程师

> Hello World!, I am Humenger 「 From Shanghai, China 」 「 Android Reverse engineer, applied electronic technology Shan Dong University, China 」 🐝主要涉及平台: Android(70%),iOS(15%),Window(5%),macOS(3%),其他(7%) 🦋主要涉…

易基因|RNA m7G甲基化测序(m7G-MeRIP-seq)

N7-甲基鸟苷(N7-methylguanosine,m7G)是真核生物tRNA、rRNA和mRNA 5cap中最丰富的修饰之一。作为一种重要的表观遗传修饰,m7G RNA甲基化在基因表达、加工代谢、蛋白质合成、转录稳定等方面发挥着重要的作用,参与疾病发…

Pinely Round 1 (Div. 1 + Div. 2) E - Make It Connected思维分类讨论

昨晚的problem e 一直wa。因为答案,不唯一,调起来只能肉眼debug。被干emo了qwq。好在赛后看到 ugly2333的 思路和我差不多,最后还是要选取度数较小的最优, 好像从度数的角度出发,不容易wa。 题意: 给你一个图&#xf…

什么是组织孤岛?它会带来哪些影响?可以这样去对付它

作为一个在不同地点和时区与不同团队合作的远程工作者,我有过公平的孤岛经历。 是的,它们扼杀了任何组织的成长。那么,在使你(和组织中的每个人)失去生产力、困惑、自私和不快乐之后。 在这篇文章中,我将…