基于FreeRTOS+STM32实践-03

2023-05-16

03:按键的扫描-资源:软件定时器 + 信号量 + 消息队列

在51单片机中的按键扫描是:标志位在10ms定时器1的中断中置一,在while(1)中写一个如下的按键扫描程序 ,目的是为了消抖,直接读取端口的电平的话,不准确

此时将定时器0的10ms中断变成软件定时器,Flag_10Ms是二值信号量的体现。

按键涉及到3个变量-按下的键值、按键按下标志位、按键长按标志位使用消息队列进行传输 

1:软件定时器代码的书写 

主要知识点:

                        1:精度不高,但是在一些场景已经足以

                        2:分单次和周期,周期最多

                        3:时间设置取决于tick(时间片其实),可以设置为Ntick

                        4:时间到了,就触发软件定时器的回调函数(相当于中断)

                        5:软件定时器函数有:创建、启动、停止、复位、删除。这里只用创建、启动,常见的也是这个两种

创建软件定时器


使用xTimerCreate()函数来创建一个软件定时器对象,并返回它的句柄。创建好的软件定时器的初始状态为休眠状态。可以在FreeRTOS调度器运行之前创建软件定时器对象,也可以在一个任务中创建软件定时器对象,常见的是:调度器运行之前

TimerHandle_t xTimerCreate( const char * const pcTimerName,
                                            TickType_t xTimerPeriodInTicks,
                                            UBaseType_t uxAutoReload,
                                            void * pvTimerID,
                                            TimerCallbackFunction_t pxCallbackFunction );


参数pcTimerName:软件定时器的名称,仅仅用于调试目的,内核不使用这个参数。

参数xTimerPeriodInTicks:软件定时器的定时周期,也就是从定时器启动后多少个tick后定时到期。开发者可以使用pdMS_TO_TICKS()来将毫秒转换为tick数。

参数uxAutoReload:pdTRUE来创建自动重装定时器;pdFALSE来创建单次定时器。

参数pvTimerID:定时器ID。当多个软件定时器使用同一个回调函数时,此参数非常有用。如果不需要使用则传递NULL即可。

参数pxCallbackFunction:回调函数的指针

返回值:返回NULL代表没有足够的堆内存来创建当前定时器;否则返回当前定时器的句柄。
 

启动软件定时器


使用xTimerStart() 来让一个处于休眠状态的定时器开始运行,也可以让一个处于运行状态的定时器重新开始计数运行。可以在调度器运行之前调用xTimerStart(),但是只有当调度器运行后,定时器才能开始运行。

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );
BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, TickType_t xTicksToWait );
参数xTimer:定时器的句柄。

参数xTicksToWait:xTimerStart()函数本质上是向软件定时器队列中放一个启动定时器的命令,这个参数值就是当队列满时,调用这个函数的任务阻塞并等待队列有空闲空间可以接收新的指令时阻塞的tick数。如果参数为0,则当队列满时,这个函数会立刻返回而不阻塞调用者任务。如果参数为portMAX_DELAY(需要在FreeRTOSConfig.h中将INCLUDE_vTaskSuspend定义为1),则当队列一直满时等待时间为永久等待并阻塞。如果在调度器运行之前调用xTimerStart(),则此参数作用失效,等价于参数为0。

返回值:当定时器启动指令成功发送到软件定时器队列时,返回pdPASS。如果xTicksToWait不为0,则调用者任务可能会阻塞,但是在阻塞时间超时前命令队列有空闲空间使得指令成功发送了,则也是会返回pdPASS的。当定时器启动指令没有发送到软件定时器队列时,返回pdFAIL。如果xTicksToWait不为0,则调用者任务可能一直阻塞,直到阻塞时间超时,命令队列也没有空闲空间,则返回pdFAIL。
 

BaseType_t xReturn = pdFAIL;
	
	SoftwareTimer0_Handler =  xTimerCreate((const char * const) "TIMER0",
											(TickType_t) 100,
											(UBaseType_t) pdTRUE,
											(void *) 1,
											(TimerCallbackFunction_t) Timer0_CallbackFunction );

	if(SoftwareTimer0_Handler != NULL )
	{
		xReturn = xTimerStart( SoftwareTimer0_Handler, 0 );

测试创建的软件定时器是否正常 

void Timer0_CallbackFunction(void *pvParameters) 
{
	LED1_TOGGLE;
}

 2:二值信号量代码书写

3个函数:

                1:创建二值信号量(无形参)

                2:给出信号量(形参1个,句柄)

                3:获取信号量(形参为2个,一个是句柄,一个是等待时间(一般是一直等)

创建二值信号量:    xSemaphoreCreateBinary();

返回值为句柄,类型为SemaphoreHandle_t

代码为:SemaphoreHandle_t xSemaphore1 = NULL;

                xSemaphore1 = xSemaphoreCreateBinary(); 

 温馨提示:库文件中已经写好了例子,因此有些东西不需要记忆,只知道如何使用即可,忘记了就查就好了

测试任务:软件定时器5s后,释放信号量,然后在测试任务中获取信号量 

二值信号量的释放使用:xSemaphoreGive(),形参就是句柄,使用起来很方便

xSemaphoreGive(xSemaphore1); 

 二值信号量的获取使用:xSemaphoreTake(),等待实践为ms级别的,如果一直等的话:就表示这个portMAX_DELAY

如果等待了,则返回时为pdTRUE,如下图

if(xSemaphoreTake(xSemaphore1,1) == pdTRUE)
	{			
			xSemaphoreGive(xSemaphore2);
}
			

3:消息队列代码书写

场景:我们的按键按下会存在键值、按下标志、长按标志,如果在裸机开发中,我们会使用全局变量,但是在FreeRTOS我们可以使用消息队列,创建一个3个消息的队列,用来保存按键的标志位

消息队列的主要知识:

                                        1:创建队列

                                        2:发消息给队列

                                        3:从队列中读消息 

 每一个函数的前面都有着这个函数的简单使用方法,因此你需要学会利用这个资源,其实官方也提供了资源,我们直接使用即可,难点是:使用不恰当导致出现难以发现的bug、以及各种资源的协调使用

 

 xQueueSend();形参3个,第一个是消息队列的句柄,第二个是传递数据的地址(一定是地址),第三个是阻塞等待时间

返回值为pdPASS表示成功发送 

 接收函数分两种类型,删和不删,

xQueueReceive()形参的使用与Send是一样的

代码框架如下,验证消息队列是否成功配置 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于FreeRTOS+STM32实践-03 的相关文章

  • Ubuntu 20.04 安装 docker 详解

    前言 首先登录官网观摩观摩 xff1a docker 安装 本文将详细介绍docker在Ubuntu20 04上的安装 xff0c 以及docker命令的一些使用 例如一些常见的错误 xff1a Job for docker service

随机推荐

  • 【STM32/GD32】 如何用Keil uVision生成bin格式文件

    大家在用Keil uVision编译代码时 xff0c 会生成一个hex文件 xff0c 该文件可用stlink jlink等工具直接下载到单片机中 而更多的场合 xff0c 程序员会编写一个bootloader程序 xff0c 用于系统升
  • 【STM32】-串口开发经验分享-基于RTOS+空闲中断

    目录 1 概述 2 串口介绍 2 1 原理框图 2 2 RS 232C 2 3 RS 422 2 4 RS 485 2 5 UART 3 STM32 USART介绍 4 CubeMx生成Uart初始化代码 4 1 NewProject选择单
  • 【STM32】单片机和处理器的关系

    STM32 单片机和处理器的关系 单片机也称MCU xff0c 是指微控制器 xff0c 而处理器一般指计算单元 xff0c 也称CPU 以ST公司的STM32单片机产品为例 xff0c 介绍单片机 xff08 STM32 xff09 和处
  • kali安装中文版firefox浏览器(安装包安装)

    kali安装中文版firefox浏览器 在官网上下载linux版本的安装包 firefox官网地址 下载好后将整个压缩包直接拖到虚拟机里 进入你放压缩包的位置进行解压 1 cd span class token operator span
  • 【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

    目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数 xff1a FIO结果说明 I O 的重放 xff08 39 录 39 下实际工况的IO xff0c 用fio 39 重放 39 xff09 fi
  • linux系统启动流程,linux系统启动不了,启动出错怎么办?不小心把boot分区删了怎么办?

    linux系统启动出错 linux系统启动流程启动问题以及解决方法第一种情况 xff1a 磁盘引导数据丢失 xff08 即mbr数据丢失 xff09 第二种情况 xff1a grub2引导文件grub cfg丢失第三种情况 xff1a 开机
  • 怎么在linux和windows之间实现文件共享?

    windows与linux共享文件 windows端共享文件夹 61 61 windows端访问windows共享的文件夹 xff1a 61 61 61 61 linux端访问windows共享的文件夹 xff1a 61 61 linux端
  • Docker容器(1):安装docker,上线简单的2048,马里奥小游戏

    Docker基础知识 可以参考上一篇文章Docker基础知识 安装并启动Docker 实验环境 xff1a server5主机部署docker ip xff1a 172 span class token punctuation span 2
  • Docker网络详解

    Docker网络 Docker网络架构libnetwork中的5种内置驱动Docker原生网络bridge模式host模式none模式 Docker自定义网络创建自定义网桥bridge如何让不同网段的容器可以相互通信 Docker基础知识可
  • Kubernetes(k8s)之Volume(卷)

    Volume k8s中的volume为什么要用volumevolume特点K8s支持多种类型的Volume演示环境emptyDir卷多容器共享卷emptyDir卷缺点 hostPath 卷hostPath卷应用场景使用hostPath卷时
  • Kubernetes(k8s)之在集群环境部署Prometheus(普罗米修斯监控)和集群的ui管理工具Grafana

    Prometheus Prometheus演示环境部署Prometheus和Grafana测试 Prometheus Prometheus是一个开源系统监控和警报工具包 现在是一个独立的开源项目 xff0c 独立于任何公司进行维护 Prom
  • 用OpenStack搭建简单的云平台并启动云主机

    OpenStack OpenStack简介OpenStack重要集成组件OpenStack平台部署部署环境建立虚拟机 配置时间同步安装OpenStack安装 RabbitMQ 消息队列服务Memcached缓存令牌的安装安装和配置OpenS
  • python实现快速排序、归并排序

    时间复杂度平均为nlogn 快速排序快速排序代码 xff1a 归并排序归并排序代码 xff1a 快速排序 快速排序算法有两个核心点 xff0c 分别为 哨兵划分 和 递归 哨兵划分操作 xff1a 以数组某个元素 xff08 一般选取首元素
  • pycharm常用快捷键

    常用快捷键 复制粘贴撤销就不用我说了吧复制选中行并在该行下粘贴批量注释多行缩进多行删除缩进全局关键字搜索该页关键字搜索查看内置函数源码该函数被哪里引用按文件名搜索py文件按文件名搜索所有类型的文件 复制粘贴撤销就不用我说了吧 复制 xff1
  • linux源码安装python3

    python3源码安装 前置环境解压提前解决依赖性源码编译三部曲验证安装 前置环境 先要准备好源码包 xff0c 去官网下载自己想要的版本https www python org ftp python 我下的是3 9 7的直接下到了要安装p
  • 【shell】用 grep 查找包含字符串的文件|grep 过滤|取匹配行的前后n行

    目录 即可即用 grep 匹配多个关键字 与find的不同 grep检索文件内容详解 grep指定搜索的文件类型 grep 不起作用 xff1f 过滤了还是显示 匹配特定的列 指定在哪些文件 哪类文件 哪个目录里搜索 搜索时包含 排除哪类文
  • 基于FreeRTOS+STM32实践-01

    目的 xff1a 复习FreeRTOS以及STM32的使用 xff0c 完成51单片机到stm32的过渡 该项目会与传感器以及其他种类的外设相联系 xff0c 以提升代码管理能力和逻辑能力 在51单片机中我们使用了很多传感器和外设 xff0
  • C++点亮stm32LED灯

    目的 xff1a 引导初学者使用C 43 43 对STM32进行编程 1 xff1a 在C语言中我们没有封装 继承 多态的概念 xff0c 没有面向对象的程序思想 这些思想一般是源于C 43 43 语言的 xff0c C语言是面向过程的语言
  • 基于FreeRTOS+STM32实践-02

    按键学习 按键常见的为独立按键和行列按键 stm32中不存在Bit类型数据 而在51内核中存在bit类型的 按键引脚分配 开发板自带3个独立按键 xff1a KEY0 PC5 KEY1 PA15 WK UP PA0 行列键盘引脚分配 xff
  • 基于FreeRTOS+STM32实践-03

    03 xff1a 按键的扫描 资源 xff1a 软件定时器 43 信号量 43 消息队列 在51单片机中的按键扫描是 xff1a 标志位在10ms定时器1的中断中置一 xff0c 在while 1 中写一个如下的按键扫描程序 xff0c 目