FreeRTOS使用中断相关的函数导致程序卡死解决办法

1.现象

想在串口中断中实现任务通知的功能,所以在串口中断服务函数中使用了xTaskGenericNotifyFromISR()函数来发送通知,发现一进入中断服务函数,程序就卡死了。下边是串口初始化和中断服务函数:

void Usart_Init_U(uint32_t BaudRate)
{
	//配置时钟
	……
	//配置输出脚:USART0_Tx
	……
	//配置输入脚:USART0_Rx
	……
	
	usart_baudrate_set(USART_PORT, BaudRate);					//波特率
	usart_parity_config(USART_PORT, USART_PM_NONE);             //无校验
	usart_word_length_set(USART_PORT, USART_WL_8BIT);           //有效数据:8bit
	usart_stop_bit_set(USART_PORT, USART_STB_1BIT);             //停止位长度:1bit
	usart_transmit_config(USART_PORT, USART_TRANSMIT_ENABLE);   //使能发送
	usart_receive_config(USART_PORT, USART_RECEIVE_ENABLE);     //使能接收
	
	usart_enable(USART_PORT);                                   //使能串口
	
	nvic_irq_enable(USARTx_IRQn, 2, 0);							//启用NVIC请求:配置中断通道和优先级
	
	usart_interrupt_enable(USART_PORT,USARTx_IT);			//设置串口触发中断的标志
}
void USARTx_IRQHandler(void)
{
	BaseType_t flag = pdFALSE;
	uint32_t Num = 6;
	uint32_t Num1 = 0;
	if(usart_interrupt_flag_get(USART_PORT,USARTx_IT_FLAG) == SET)
	{
		
		Rx_Data = usart_data_receive(USART_PORT);
		usart_data_transmit(USART_PORT,Rx_Data);
//		Value = 1;
		
		flag = xTaskGenericNotifyFromISR(LED1Task_Handler,Num,eSetValueWithOverwrite,&Num1,&xHigherPriorityTaskWoken);
		if(flag == pdTRUE)
			printf("发送成功\r\n");
		
		 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
		
		
		usart_interrupt_flag_clear(USART_PORT,USARTx_IT_FLAG);
	}
}

由上边两段代码可以看到:

  1. 串口中断的优先级为2(4位抢占,0位响应)。
  2. 执行代码,程序就会卡在flag = xTaskGenericNotifyFromISR(LED1Task_Handler,Num,eSetValueWithOverwrite,&Num1,&xHigherPriorityTaskWoken);这一句,而不会去执行下一句代码,也不会出中断,完完全全卡死在这里。

2.解决办法

我先试了不用中断的任务通知(定义两个任务,用一个任务去通知另一个任务),发现完全没有问题。所以问题就出在中断上,而能出问题的地方就只能是中断的优先级。通过查找资料可知FreeRTOS操作系统内核使用最低优先级,操作系统所能调用管理的最高优先级为5~15级。所以在定义外设的中断优先级时,要想FreeRTOS能够正常运行,必须将优先级设置在5-15级之间。

void Usart_Init_U(uint32_t BaudRate)
{
	//配置时钟
	……
	//配置输出脚:USART0_Tx
	……
	//配置输入脚:USART0_Rx
	……
	
	usart_baudrate_set(USART_PORT, BaudRate);					//波特率
	usart_parity_config(USART_PORT, USART_PM_NONE);             //无校验
	usart_word_length_set(USART_PORT, USART_WL_8BIT);           //有效数据:8bit
	usart_stop_bit_set(USART_PORT, USART_STB_1BIT);             //停止位长度:1bit
	usart_transmit_config(USART_PORT, USART_TRANSMIT_ENABLE);   //使能发送
	usart_receive_config(USART_PORT, USART_RECEIVE_ENABLE);     //使能接收
	
	usart_enable(USART_PORT);                                   //使能串口
	
	nvic_irq_enable(USARTx_IRQn, 6, 0);							//启用NVIC请求:配置中断通道和优先级
	
	usart_interrupt_enable(USART_PORT,USARTx_IT);			//设置串口触发中断的标志
}

将优先级改为7,就能在中断服务函数中正常发送任务通知了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这届年轻人,对AI对象上头

在AI技术飞速发展的今天,虚拟对象这一概念也流行了起来。从AI女友到AI男友,这些基于人工智能的AI社交应用正在改变我们对情感陪伴的认知。本文深入探讨了AI虚拟对象的兴起、用户需求、商业模式以及技术局限,不妨来看一下。 继2023年文生文大语…

标准版/开源版 移动端新增页面使用文档

在标准版开发的实际使用中,随着用户移动端的产品和信息内容不断增多,新增页面来展示对应的产品详情、模块等内容。针对一些概念或者步骤较多的内容,可以新增子页面构建多级模块结构,帮助用户快速定位。 下面就如何新增页面做一讲…

网际互联及OSI七层模型

1什么是OSI七层模型 2OSI每一个Layer的定义 及用途 3如何使用OSI参考模型分析网络通信过程 一、网际互联 (一)OSI的概念: open system interconnect开放系统互联参考模型,是有ISO(国际标准化组织)定义…

混合现实(MR)技术的应用场景

混合现实(MR)技术将虚拟世界和现实世界融合在一起,用户可以在现实世界中看到和与虚拟物体进行交互,同时还可以感知周围的真实环境。MR技术具有广阔的应用前景,可以应用于各行各业。以下是一些MR的应用场景。北京木奇移…

iOS ------代理 分类 拓展

代理协议 一,概念: 代理,又称委托代理(delegate),是iOS中常用的一种设计模式。顾名思义,它是把某个对象要做的事委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理…

Linux部署MySQL8.0—手把手保姆级教程

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、下载MySQL8.0安装包二、安装MySQ…

springboot的坑

问题:使用Autowired注入一个service,然后写了两个接口,第一个接口与请求时显示注入的service为空一直报错,但是第二个接口请求时service竟然不是空?在这里插入图片描述 凶手找到了,是private修饰。果然没仔…

HTB Runner

Runner User Nmap ──(root㉿kali)-[/home/…/machine/SeasonV/linux/Runner] └─# nmap -A runner.htb -T 4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-22 23:07 EDT Stats: 0:00:01 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Sca…

OpenHarmony实战开发-内存快照Snapshot Profiler功能使用指导。

DevEco Studio集成的DevEco Profiler性能调优工具(以下简称为Profiler),提供Time、Allocation、Snapshot、CPU等场景化分析任务类型。内存快照(Snapshot)是一种用于分析应用程序内存使用情况的工具,通过记录…

鸿蒙OpenHarmony【小型系统运行案例】 (基于Hi3516开发板)

运行 启动系统 在完成Hi3516DV300的烧录后,还需要设置BootLoader引导程序,才能运行OpenHarmony系统。 在Hi3516DV300任务中,单击Configure bootloader(Boot OS)进行配置即可。 说明: DevEco Device Tool…

【大模型系列】预训练

数据 数据预处理 预处理流程: 原始语料库—>质量过滤(语种过滤、统计过滤、关键词过滤、分类器过滤)—>敏感内容过滤(有毒内容、隐私内容PII)—>数据去重(句子级别、文档级别、数据集级别&#…

【AI】【Python】pydantic库学习demo

因为工作中学习AI,然后包括看源码,以及看代码都使用到了pydantic库,因此下面是一些最主要的20%,以学会其80%的精髓。 pydantic 库是 python 中用于数据接口定义检查与设置管理的库。 pydantic 在运行时强制执行类型提示&#xff0…

内插和抽取

抽取: 频域表达式的关系: 1、角频率扩大M倍 2、移动2pi、22pi…(n-1) 2pi 3、相加 4、幅度变为1/M 内插: 加入低通滤波,减小混叠,但是由于截短,也会造成误差,但是…

【MySQL 数据宝典】【磁盘结构】- 004 redolog 重做日志

一、背景介绍 持久性要求: 对于已提交的事务,即使系统发生崩溃,其对数据库的更改也不能丢失。问题: 在事务提交前将所有修改的页面刷新到磁盘浪费资源。随机IO导致刷新速度慢。 解决方案: 【数据副本】记录事务执行过…

[Meachines][Easy]Bizness

Main $ nmap -p- 10.10.11.252 --min-rate 1000 $ dirsearch -u https://bizness.htb/ $ whatweb https://bizness.htb/control/login 存在一个未授权的RCE $ git clone https://github.com/jakabakos/Apache-OFBiz-Authentication-Bypass.git $ cd Apache-OFBiz-Authenticat…

java:观察者模式

java:观察者模式 1 前言 观察者模式,又被称为发布-订阅(Publish/Subscribe)模式,他定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所…

Visual Studio2022中使用水晶报表

1.创建水晶报表项目 选择需要的表 自动生成连接 选项:可跳过 后续还有一些 都能跳过 看你自己的需求 自己选的样式 自动生成 查看你的数据源,在选择数据集时已经有啦 不懂得可以看上集 字段可以直接拖,页面上的都是初始化选过的 点击生成 成功…

【系统架构师】-选择题(一)

1、信息系统规划方法中,关键成功因素法通过对关键成功因素的识别,找出实现目标所需要的关键信息集合,从而确定系统开发的 (优先次序) 。关键成功因素来源于组织的目标,通过组织的目标分解和关键成功因素识别…

docker容器内彻底移除iptables服务的实现方法

背景 我创建的容器使用的是centos6的标准镜像,所以内置了iptables服务。容器启动后iptables服务默认就启动了。iptables设置的规则默认是所有流量都无法通行。而对于服务器的管理使用的是宿主机的防火墙。这样就导致在实现用iptables动态给容器添加端口映射时不成功…

关于C++STL的总结(基础使用和底层原理)

STL是什么? STL即(Standard Template Library)标准模板库,提供了常见的数据结构和算法函数等,其下共包含六大组件: 容器算法迭代器仿函数适配器空间配置器 本篇重点介绍容器的使用和简单的底层实现原理&…