stm32cubemx hal学习记录:FreeRTOS中断管理

news2024/9/23 11:18:45

一、参数配置

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

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

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

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

5、创建一个队列

 6、创建两个线程,一个接收消息,一个发送消息

 7、创建一个二值信号量

8、配置两个按键,外部中断模式

 9、生成代码

二、FreeRTOS中断介绍

1、FreeRTOS的中断支持:开/关中断、恢复中断、中断使能、中断屏蔽、可选择系统管理的中断优先级。

2、FreeRTOS的中断管理

FreeRTOS 中的中断使用跟裸机差不多,需要自己配置中断,并且使能中断,编写中断服务函数,在中断服务函数中使用内核 IPC 通信机制,一般建议使用信号量、消息或事件标志组等标志事件的发生,将事件发布给处理任务,退出中断后再由相关处理任务具体处理中断。

用户可以自定义配置 系统可管理的最高中断优 先 级 的宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ,它是用于配置内核中的 basepri 寄存器的,当 basepri 设置为某个值的时候,NVIC 不会响应比该优先级低的中断,而优先级比之更高的中断则不受影响。就是说当这个宏定义配置为 5 的时候,中断优先级数值在 0、1、2、3、4 的这些中断是不受 FreeRTOS 屏蔽的,也就是说即使在系统进入临界段的时候,这些中断也能被触发而不是等到退出临界段的时候才被触发,当然,这些中断服务函数中也不能调用 FreeRTOS 提供的 API 函数接口,而中断优先级在 5 到 15 的这些中断是可以被屏蔽的,也能安全调用 FreeRTOS 提供的 API 函数接口。

3、FreeRTOS开关中断

FreeRTOS开关中断函数为portENABLE_INTERRUPTS()和portDISABLE_INTERRUPTS(),这两个函数其实是宏定义,在portmacro.h中有定义,如下:

#define portDISABLE_INTERRUPTS() 					vPortRaiseBASEPRI() 
#define portENABLE_INTERRUPTS()                     vPortSetBASEPRI(0)

函数vPortBASEPRI()传递了一个0,这就对应了上面说到的,开启中断是将0写入BASEPRI寄存器。

4、临界区

CMSIS-RTOS没有临界区,但FreeRTOS与临界段代码保护有关的函数有4个:taskENTER_CRITICAL()、
和taskEXIT_CRITICAL()、taskENTER_CRITICAL_FROM_ISR()、taskEXIT_CRITICAL_FROM_ISR(),这四个函数其实是宏定义,在task.h文件中有定义。这四个函数的区别是前两个是任务级的临界段代码保护,后两个是中断级的临界段代码保护。所以必要时要是加上。

5、任务级临界段代码保护

taskENTER_CRITICAL()和taskEXIT_CRITICAL()是任务级的临界代码保护,一个是进入临界段,

一个是退出临界段,这两个函数是成对使用的,这函数的定义如下:

#define taskENTER_CRITICAL()            portENTER_CRITICAL() 
#define taskEXIT_CRITICAL()             portEXIT_CRITICAL()

而portENTER_CRITICAL()和portEXIT_CRITICAL()也是宏定义,在文件 portmacro.h中有定义。

任务级临界代码保护使用方法如下:

void CriticalTask_TEST(void const * argv)
{
	taskENTER_CRITICAL();                                                       //进入临界区
	total_num += 0.01f;   
	printf("total_num 的值为: %.4f\r\n",total_num);
	taskEXIT_CRITICAL();                                                        //退出临界区
	vTaskDelay(1000);
}

当进入临界区时,中断被屏蔽,临界区代码无法被打断,只有当所有的临界段代码都退出以后才

使能中断!
注:当进入临界区时,优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断得不到及响应,所以临界区代码一定要精简。

6、中断级临界段代码保护

函数taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()中断级别临界段代

码保护,是用在中断服务程序中的,而且这个中断的优先级一定要低于

configMAX_SYSCALL_INTERRUPT_PRIORITY。这两个函数在文件task.h中有如下定义:

#define taskENTER_CRITICAL_FROM_ISR()        portSET_INTERRUPT_MASK_FROM_ISR()
#define taskEXIT_CRITICAL_FROM_ISR(x)        portCLEAR_INTERRUPT_MASK_FROM_ISR(x)

中断级临界代码保护使用方法如下:

void TIM3_IRQHandler(void) 
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
		status_value=taskENTER_CRITICAL_FROM_ISR();            //进入临界区
		total_num += 1;
		printf("float_num 的值为: %d\r\n",total_num);
		taskEXIT_CRITICAL_FROM_ISR(status_value);              //退出临界区
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //清除中断标志位
}

三、代码示例

1、it.h

#include "cmsis_os.h"
#include <string.h>

extern osMessageQId TestQueueHandle;


static uint32_t send_data1=1;
static uint32_t send_data2=1;
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	osEvent xReturn;
	uint32_t ulReturn;
	
	//进入临界段,且临界段可以嵌套
	ulReturn=taskENTER_CRITICAL_FROM_ISR();
	
	if(GPIO_Pin==GPIO_PIN_8)
	{
		xReturn.status=osMessagePut(TestQueueHandle,send_data1,0);
	}
	else if(GPIO_Pin==GPIO_PIN_9)
	{
		xReturn.status=osMessagePut(TestQueueHandle,send_data2,0);
	}
	
	//退出临界段
	taskEXIT_CRITICAL_FROM_ISR(ulReturn);
}

2、main

uint32_t key_value;
void Receive_thread_entry(void const * argument)
{
  /* USER CODE BEGIN Receive_thread_entry */
  /* Infinite loop */
	osEvent event;
  for(;;)
  {
    event=osMessageGet(TestQueueHandle,osWaitForever);
		
		key_value=event.value.v;
  }
  /* USER CODE END Receive_thread_entry */
}

过程即为队列在中断中使用,进行传递按键数值。且需要注意,中断优先级不能小于5

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

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

相关文章

正大国际期货:外盘黄金期货怎么做,需要注意什么?

无论你是刚入外盘黄金期货市场的新手小白&#xff0c;还是已经入黄金市场多年的老手&#xff0c;必须知道外盘黄金期货交易的技巧及规则&#xff0c;这样才可以在黄金期货市场中站稳脚跟&#xff0c;才能收获更多的利益。下面正大IxxxuanI就为大家准备了一些黄金交易技巧以供参…

太阳能发电与蓄电池研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

汇编语言程序设计入门

目录 基本概念 符号指令中的表达式 符号 数值常量 符号常量&#xff08;用的很少&#xff09; 数值表达式 标号&#xff08;一般出现在代码段&#xff09; 程序框架 ​编辑 标号的定义 变量&#xff08;最重要) 变量的属性​编辑 变量存储区中数据的存放​编辑 变量…

最受欢迎的Python科学类库

作为一种免费的&#xff0c;跨平台的&#xff0c;通用的和高级的编程语言&#xff0c;Python已被科学界广泛采用。科学家重视Python的精确和有效的语法&#xff0c;相对平坦的学习曲线以及它与其他语言&#xff08;例如C / C &#xff09;很好地集成的事实。 由于这种流行&…

最近沉迷Redis网络模型,无法自拔!终于知道Redis为啥这么快了

1. 用户空间和内核态空间 1.1 为什么要区分用户和内核 服务器大多都采用 Linux 系统&#xff0c;这里我们以 Linux 为例来讲解: ubuntu 和 Centos 都是 Linux 的发行版&#xff0c;发行版可以看成对 linux 包了一层壳&#xff0c;任何 Linux 发行版&#xff0c;其系统内核都…

设计模式-day03

5&#xff0c;结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“…

项目管理(如何进行项目风险管理)

项目风险管理包括规划风险管理、识别风险、开展风险分析、规划风险应对、实施风险应对和监 督风险的各个过程。项目风险管理的目标在于提高正面风险的概率和(或)影响,降低负面风险的 概率和(或)影响,从而提高项目成功的可能性。 项目风险分类: 1、概率性风险(能识别并确…

【虹科】工业相机如何自动优化图像?

普通的消费网络相机操作简便&#xff0c;常常也会用于一些机器视觉应用。然而&#xff0c;我们很容易就可以意识到&#xff0c;与典型的工业相机相比&#xff0c;虽然网络相机价格诱人&#xff0c;但是在质量、耐用性和长期可用性方面存在显著劣势。和网络相机一样简单易用的工…

【正点原子FPGA连载】第三十一章DDR4读写测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十一章DDR4读…

Google Indexing API 推送 (避免踩坑)

https://developers.google.com/search/apis/indexing-api/v3/prereqs?hlen_GB 官方文档 1. 在创建服务账号部分需要注意的是&#xff1a; 第二步授权要把服务账号的邮箱地址加上2. 验证完网站站长之后需要注意的点 a. https://search.google.com/search-console/settings 进入…

Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化详解

一. 数据持久化 1. 含义 Redis 提供了 RDB 和 AOF 两种持久化方式&#xff0c;默认开启的是RDB&#xff0c;如果需要AOF&#xff0c;需要手动修改配置文件进行开启。 RDB&#xff1a;是一种对Redis存在内存中的数据周期性的持久化机制&#xff0c;将内存中的数据以快照的形式硬…

电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)【6节点 9节点 14节点 26节点 30节点 57节点】(Matlab代码实现)

&#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;⛳️⛳️⛳️​ 目录 1 概述 2 电力系统潮流计算概述 2.1 电力潮流发展进程 2.2牛顿拉夫逊法潮流计算 3 仿真结果 4 Matlab代码实现 1 概述 最初&#xff0c;电力系统潮流计算是通过人工手算的。后来为了适应…

热机蠕变疲劳在ANSYS Mechanical与nCode DesignLife仿真实现概述

导读&#xff1a;ANSYS nCode DesigenLife联合ANSYS Mechanical能够进行热机蠕变疲劳分析计算&#xff0c;由于分析过程的复杂性&#xff0c; ANSYS Workbench工作平台预定义7类nCode DesignLife疲劳分析模块并不包括对于热机蠕变疲劳的相关分析&#xff0c;需要间接完成。 本文…

你可以写出优质的个人简介,自媒体个人简介三要三不要,收藏学习

什么人会进你的主页看你的简介&#xff1f; 显而易见&#xff0c;更多的是新人&#xff0c;想了解你的新人。那么我们在简介里应该写些什么呢&#xff1f; 在我赢且力手小禾呈序里找了三天的内容&#xff0c;然后总结了自媒体写个人简介三要三不要&#xff0c;听我细细道来&a…

前端手写面试题合集

实现ES6的extends function B(name){this.name name; }; function A(name,age){//1.将A的原型指向BObject.setPrototypeOf(A,B);//2.用A的实例作为this调用B,得到继承B之后的实例&#xff0c;这一步相当于调用superObject.getPrototypeOf(A).call(this, name)//3.将A原有的属…

1小时点击量破千万,阿里巴巴首发:Java核心框架指导手册

来了&#xff0c;来了&#xff01;他终于来了&#xff0c;阿里巴巴最新推出的Java核心框架指导手册&#xff0c;终于出来了。1小时的点击量就破了千万&#xff01; 手册分为三个部分&#xff1a;第一部分&#xff1a;解读MyBatis框架中关于接口层和配置文件解析过程&#xff1b…

微机原理与接口技术:并行接口

文章目录1.8255A的内部结构与外部引脚1.1.三个数据端口A、B、C&#xff1a;1.2.A组控制和B组控制1.3.数据总线缓冲器1.4.读写控制逻辑1.5.8255A的外部引脚2.8255A的控制字2.1.方式选择控制字2.2.端口C按位置位/复位控制字3.8255A的工作方式3.1.方式0&#xff1a;基本输入输出方…

【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享

前言 因为我既对接过session、cookie&#xff0c;也对接过JWT&#xff0c;今年因为工作需要也对接了gtoken的2个版本&#xff0c;对这方面的理解还算深入。 尤其是看到官方文档评论区又小伙伴表示看不懂&#xff0c;所以做了这期视频内容出来&#xff1a; 内容提要&#xff1…

【Centos】Docker停止容器服务后,磁盘I/O仍然迟迟不下降。(未解决)

记录前言问题复现&#xff0c;故障演练准备工作dcim-local演练过程系统日志message结论前言 安装了docker的服务器只运行了一个容器服务&#xff0c;停止容器服务后&#xff0c;磁盘I/O仍然迟迟不下降。对该现象进行问题复现&#xff0c;故障演练 问题复现&#xff0c;故障演…

STM32CUBEMX开发GD32F303(17)----移植兆易创新SPI Nor Flash之GD25Q64Flash

概述 本章STM32CUBEMX配置STM32F103&#xff0c;并且在GD32F303中进行开发&#xff0c;同时通过开发板内进行验证。 本例程主要讲解如何对芯片自带Flash进行读写&#xff0c;用芯片内部Flash可以对一些需要断电保存的数据进行保存&#xff0c;无需加外部得存储芯片&#xff0c…