基于STM32的FreeRTOS学习之中断测试实验(五)

2023-11-14

记录一下,方便以后翻阅~

本章内容是接着上一章节进行的实际演练。

1. 实验目的

FreeRTOS可以屏蔽优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断,不会屏蔽高于其的中断。本次实验就是验证这个说法。本实验使用两个定时器,一个优先级为4,另一个为5,两个定时器每隔1s通过串口输出一串字符串。然后在某个任务中关闭中断一段时间,查看输出情况。

2. 实验设计

本实验设计了两个任务start_task()和interrupt_task(),这两个任务的任务功能分别为:
start_task():创建另外一个任务;
interrupt_task():中断测试任务,任务会调用FreeRTOS的中断函数portDISABLE_INTERRUPTS()来将中断关闭一段时间。

3. 硬件

3.1 正点原子战舰v3开发板(其他板子应该也可以,主要涉及USART,TIM3,TIM5,LED);
3.2 JLINK仿真器。

4. 代码解读

4.1 timer.h和timer.c
因为用到2个定时器,这里选择TIM3和TIM5,其定时器初始化和中断函数如下:

#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f10x.h" 
void TIM3_Int_Init(u16 arr,u16 psc);   // 优先级4,认为高优先级
void TIM5_Int_Init(u16 arr,u16 psc);   // 优先级5, 认为低优先级
#endif
#include "timer.h"
#include "usart.h" 	 
// 函数名称:通用定时器3中断初始化
// 入口参数:arr:自动重装值;psc:时钟预分频数
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 	
	// 定时器TIM3初始化
	TIM_TimeBaseStruct.TIM_Period = arr;               
	TIM_TimeBaseStruct.TIM_Prescaler =psc; 
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 
	// 中断优先级NVIC设置
	NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; 
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 4;  
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;  
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&NVIC_InitStruct);  
	TIM_Cmd(TIM3, ENABLE);  				 
}
// 函数名称:通用定时器5中断初始化
// 入口参数:arr:自动重装值;psc:时钟预分频数
void TIM5_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 	
	// 定时器TIM5初始化
	TIM_TimeBaseStruct.TIM_Period = arr; 			
	TIM_TimeBaseStruct.TIM_Prescaler =psc; 				
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStruct); 			
	TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); 				
	// 中断优先级NVIC设置
	NVIC_InitStruct.NVIC_IRQChannel = TIM5_IRQn;  		
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 5;  	
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;  	
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 		
	NVIC_Init(&NVIC_InitStruct);  						
	TIM_Cmd(TIM5, ENABLE);  										 
}
// 函数名称:定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) 
	{	printf("TIM3输出.......\r\n"); }
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  
}
// 函数名称:定时器5中断服务函数
void TIM5_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) 
	{	printf("TIM5输出.......\r\n");  }
	TIM_ClearITPendingBit(TIM5,TIM_IT_Update); 
}

4.2 main.c文件代码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "FreeRTOS.h"
#include "task.h"
// 设计第一个任务start_task()
#define START_TASK_PRIO			  1         // 任务优先级
#define START_STK_SIZE 			  256       // 任务堆栈大小	
TaskHandle_t StartTask_Handler;             // 任务句柄
void start_task(void *pvParameters);        // 任务函数
// 设计第二个任务interrupt_task()
#define INTERRUPT_TASK_PRIO		  2         // 任务优先级
#define INTERRUPT_STK_SIZE 		  256       // 任务堆栈大小
TaskHandle_t INTERRUPTTask_Handler;         // 任务句柄
void interrupt_task(void *p_arg);           // 任务函数

// 主函数
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);    // 设置系统中断优先级分组4	 
	delay_init();	    				               // 延时函数初始化	 
	uart_init(115200);					               // 初始化串口
	LED_Init();		  					               // 初始化LED
	TIM3_Int_Init(10000-1,7200-1);		               // 初始化定时器3,定时器周期1S
	TIM5_Int_Init(10000-1,7200-1);		               // 初始化定时器5,定时器周期1S
	// 创建开始任务
	xTaskCreate(	(TaskFunction_t )start_task,            // 任务函数
					(const char*    )"start_task",          // 任务名称
					(uint16_t       )START_STK_SIZE,        // 任务堆栈大小
    				(void*          )NULL,                  // 传递给任务函数的参数
                	(UBaseType_t    )START_TASK_PRIO,       // 任务优先级
                	(TaskHandle_t*  )&StartTask_Handler);   // 任务句柄              
	vTaskStartScheduler();                              	// 开启任务调度
}

// 主函数里创建了第一个任务函数——开始任务
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();                                       // 进入临界区
	// 创建中断测试任务,用来执行开关中断操作
	xTaskCreate(	(TaskFunction_t )interrupt_task,  	        // 任务函数
                	(const char*    )"interrupt_task", 			// 任务名称
                	(uint16_t       )INTERRUPT_STK_SIZE,		// 任务堆栈大小
                	(void*          )NULL,						// 传递给任务函数的参数
                	(UBaseType_t    )INTERRUPT_TASK_PRIO,		// 任务优先级
               	    (TaskHandle_t*  )&INTERRUPTTask_Handler); 	// 任务句柄
	vTaskDelete(StartTask_Handler);                             // 删除开始任务
	taskEXIT_CRITICAL();                                        // 退出临界区
}

// 开始任务里创建了第二个任务函数——中断测试任务 
void interrupt_task(void *pvParameters)
{
	static u32 total_num=0;
	while(1)
	{
		total_num+=1;
		if(total_num==5)                        
		{
			printf("关闭中断.............\r\n");
			portDISABLE_INTERRUPTS();				      // 关闭中断
			delay_xms(5000);											// 延时5s
			printf("打开中断.............\r\n");	  // 打开中断
			portENABLE_INTERRUPTS();
		}
		LED0=~LED0;
		vTaskDelay(1000);
	}
} 
5. 实验结果

在这里插入图片描述
运行一开始,TIM3和TIM5都有输出,当运行5次后,关闭中断,这时只有TIM3有输出(因为优先级为4,高于configMAX_SYSCALL_INTERRUPT_PRIORITY),而TIM5优先级为5,与configMAX_SYSCALL_INTERRUPT_PRIORITY相等,被关闭了。待5s之后,重新打开中断,此时TIM5恢复运行。

最后回顾下一个知识点,configMAX_SYSCALL_INTERRUPT_PRIORITY值在哪里定义的?在FreeRTOSConfig.h文件里!
在这里插入图片描述
如果将configMAX_SYSCALL_INTERRUPT_PRIORITY改为4或更小,则TIM3也会被关闭。

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

基于STM32的FreeRTOS学习之中断测试实验(五) 的相关文章

  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 计算机基础:一颗芯片是怎样诞生的?

    一颗芯片是怎样诞生的 芯片属于半导体 半导体是介于导体和绝缘体之间的一类物质 元素周期表中硅 锗 硒 硼的单质都属于半导体 这些单质通过掺杂其他元素生成的一些化合物 也属于半导体的范畴 这些化合物在常温下可激发载流子的能力大增 导电能力大大
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 锂电池管理系统(BMS)

    引言 在现代科技的推动下 锂电池已经成为各种电动设备和能源存储系统的首选能源媒介 然而 锂电池在充电和放电过程中存在一系列潜在的安全隐患 同时其性能和寿命也受到一些限制 为了解决这些问题 锂电池管理系统 BMS 应运而生 BMS不仅仅是一个
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • 管理node的版本

    使用 nvm 管理node版本 nvm类似 python virtualenv 使用起来更加方便 安装nvm 参见 https www jianshu com p 622ad36ee020 使用cnpm 代替 npm 安装cnpm sudo
  • mysql数据库

    mysql数据库 添加 更新 删除表 删除单条 去重查询 运算符 模糊查询 集合 逻辑 sql gt between 值1 and 值2 is NUll 排序查询 聚合函数 ifNull 列名 默认值 如果列名为空 返回默认值 分组grou
  • chown: /usr/local: Operation not permitted问题解决

    在MAC上安装homebrew事先博客进行安装 根据步骤进行下去 同样在brew update的时候出现报错 Error usr local must be writable 错误 在该文章中也给出解决办法 sudo chown R who
  • 查看python中模块的所有方法

    查看python中模块的所有方法 安装的python模块 现将查看方法总结如下 一 CMD命令行下使用pydoc命令 在命令行下运行 pydoc modules即可查看 二 在python交互解释器中使用help 查看 在交互式解释器中输入
  • 双向带头循环链表的实现

    1 学习第一步 当我们要学习和了解一个事物时 我们要做的第一步便是对这个事物有一个体的的了解 现在我们要学习双向带头循环链表的第一步也是这个 我们现在先来了解一下这种链表的结构 就像该图所呈现的那样 双向循环链表就是长这样 但是你可千万不要
  • c++中拷贝构造函数被调用的时机

    1 c 中拷贝构造函数被调用的时机 拷贝构造函数被调用的几种情况 1 当用类的一个对象去初始化该类的另一个对象时 系统会自动调用拷贝构造函数 2 将一个对象作为实参传递给一个非引用类型的形参 系统会自动调用拷贝构造函数 3 从一个返回类为非
  • qt linux 包含目录,qt – 找不到子目录的.pro文件 – 当subdir包含相对路径时

    我有一个带有子模板的顶级 pro文件 TEMPLATE subdirs SUBDIRS common tests common tests包含 pro文件 但是qmake找不到它 Could not find pro file for su
  • Padavan固件添加adbyby去广告功能

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在路由 自定义脚本 wan上下行启动后执行 添加下面脚本 bin sh sleep 30 Adbyby去广告脚本 Adbyby 1 0关闭 1启动 以下脚本请勿更改 if
  • python web后台框架面试题

    web后台框架 1 Django Flask Tornado的对比 答案 Django走的是大而全的方向 开发效率高 它的MTV框架 自带的ORM admin后台管理 自带的sqlite数据库和开发测试用的服务器 给开发者提高了超高的开发效
  • mybatits的一些常用问题

    1 mybatits的in字段查询的时候出现从小到大默认排序的情况 实现根据in字段里面的id进行排序
  • 用python收取邮件的一个实例

    背景 有一个工作邮箱 会接收许多人不断地投递的简历 由于邮件数量比较多 因此产生了一个需求 要求自动将邮件从邮件服务器取回到本地 并将邮件的基本信息存入本地的sqlite数据库 邮件的正文以单独文件的形式存放在文件夹下 实现 备注 在pyt
  • CICFlowMeter使用注意事项

    当我们安装好CICFlowMeter 导入pcap文件 点OK后发现什么也没办法输出 我们去从官网下载jnetpcap文件替换掉了原来文件即可 https sourceforge net projects jnetpcap files jn
  • idea如何创建XML文件

    1 找到File目录下的Settings打开 2 找到Editor并打开 3 找到Editor下的File and Code Templates并打开 4 先选中Files再点击 号 5 Name的值改为XML File Extension
  • 《Apache MINA 2.0 用户指南》第八章:字节缓存

    最近准备将Apache MINA 2 0 用户指南英文文档翻译给大家 但是我偶然一次百度 发现 Defonds 这位大牛已经翻译大部分文档 原文链接 http mina apache org mina project userguide c
  • Vue基础精讲 —— Vue的数据绑定和Vue的原生指令

    import Vue from vue new Vue el root template div div 数据绑定 div div 数据绑定 div div text div div 表达式不会被解析 div div
  • Everthing搜索神器,工作利器

    许多人的电脑都保存着大量的 照片 文档 电子书等文件 Everthing这款工具可以在闪电般的瞬间从你那不知名的硬盘中找到你需要的文件 Everything在第一次运行时 会建立索引数据库 千万不要错过 在这里插入图片描述 1 体积不到2M
  • 利用Vulnhub复现漏洞 - 心脏出血漏洞(CVE-2014-0160)

    心脏出血漏洞 CVE 2014 0160 Vulnhub官方复现教程 复现过程 启动环境 漏洞复现 ssltest py Vulnhub官方复现教程 https github com vulhub vulhub blob master op
  • mask rcnn模型踩坑指南 tusimple mx-maskrcnn

    mask rcnn模型踩坑指南 MxNet框架 1 环境 anaconda2 tensorflow gpu python2 7 14 pip freeze certifi 2017 11 5 Cython 0 27 3 easydict 1
  • MySQL按某个字段建立表分区_mysql表分区

    1 概述 通过删除仅包含该数据的分区 或多个分区 通常可以轻松地从分区表中删除失去其实用性的数据 相反 在某些情况下 通过添加一个或多个新分区来特别存储该数据 可以极大地促进添加新数据的过程 由于满足给定WHERE子句的数据只能存储在一个或
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本