FreeRTOS中断调用API消息队列发送函数导致系统死机(memcpy函数卡死)

这篇具有很好参考价值的文章主要介绍了FreeRTOS中断调用API消息队列发送函数导致系统死机(memcpy函数卡死)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

背景:写一组在FreeRTOS系统下的串口驱动,芯片使用的是杰发科的AC781x系列ARM® CortexM3 内核,96MHz主频。

项目场景:计划使用dma接收数据,设置dma半满中断与全满中断,在半满中断中把前半部分数据传入消息队列,在全满中断中把后半部分数据传入消息队列。


问题描述

问题1:在中断中调用FreeRTOS的消息队列发送函数带中断保护版本,会出现死机情况,进入hardfault,dma配置的传输字节为8字节(即每接收到8字节进一次传输完成中断)中断中的代码如下

if (wparam & (1<<0))//传输完成
{
	for(uint8_t cj=0; j<8; j++)//连续八次发送数据到消息队列
	{
		xQueueSendFromISR(  UART_ALL[i]->RX_Queue,
					(uint8_t*)&UART_ALL[i]>rx_bounce_buf_ptr[j],
					&xHigherPriorityTaskWoken );
	}
}

断点调试发现是在xQueueSendFromISR()函数死机的。
问题2:在此处执行断点调试发现for循环的每前两次都能执行完,而在第三次执行时会死机,初步排除是中断栈溢出原因。
问题3:进一步进入函数调试发现最后一直在执行三行汇编代码,在那里死循环,最后定位到是在FreeRTOS的xQueueSendFromISR()
–>( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
–>( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );这一行代码死机。可以得到的消息是跟memcpy函数的执行有关。


原因分析:

猜想原因1:中断优先级问题

网上搜索最接近的情况是在中断中调用FreeRTOS的API时必须确保此中断的实际优先级低于FreeRTOS中配置的MAX_SYSCALL_INTERRUPT_PRIORITY,因为ARM® CortexM3 的优先级是数值越大实际优先级越低,
所以就需要使此中断的优先级值大于MAX_SYSCALL_INTERRUPT_PRIORITY。
但此时还有一个疑惑就是我的情况与网上其它朋友的情况略有出入,就是我能够成功在中断中调用一次os的API,只是在多次调用时会出问题。而且我卡死的位置也与他们的不一样。
在实在束手无策之后,死马当活马医,调整中断优先级,发现情况没有变化,依然卡死,排除优先级配置的问题。

猜想原因2:DMA总线冲突问题

在猜想1验证不符之后网上已搜不到任何类似情况了,换遍各种关键词也只能搜到几个猜想1的情况。此时能想到的各种原因都试了一遍,全都不行,然后与朋友吃饭时聊到memcpy卡死的情况,他说他遇到过dma占用总线导致memcpy卡死的问题,而且也是在第三次卡死。我顿时以为有救了,找到了希望。但验证后也排除此情况。排除手段为自己不使用FreeRTOS的api转而在同一位置单独使用memcpy函数发现并无问题。

到此处能够获得的信息就是与memcpy函数有关

最终在断点调试卡死处,看到汇编语句有这样一句

BL.W     __aeabi_memcpy (0x08000228)

此时已几乎可以确定就是memcpy函数导致的卡死。


解决方案:

编译优化memcpy函数

通过编译优化memcpy函数之后问题迎刃而解,此问题卡了我一个元旦,导致我元旦都没过好。网上无相关案列,遂决定记录一下。文章来源地址https://www.toymoban.com/news/detail-610183.html

到了这里,关于FreeRTOS中断调用API消息队列发送函数导致系统死机(memcpy函数卡死)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FreeRTOS - 消息队列

    消息队列(queue):可以在任务与任务间、中断和任务间传递消息,实现任务接收来自其他任务或中断的不固定的消息 1、使用消息队列检测串口输入 2、通过串口发送字符串openled1,openled2,openled3,分别打开板载led1,led2,led3 3、通过串口发送字符串closeled1,closeled2,closele

    2023年04月08日
    浏览(36)
  • FreeRTOS(3)----消息队列

    一.消息队列的基本概念 队列成为消息队列,可以进行任务与任务间,中断和任务间传递信息,实现任务接收来自其他任务或中断的不固定长度的消息,任务可以从队列中读取消息,当队列消息为空的时候,读取消息的任务将会被阻塞,但是可以设定等待阻塞任务的时候xTic

    2024年03月18日
    浏览(64)
  • 【FreeRTOS】【应用篇】消息队列【下篇】

    本篇文章主要对 FreeRTOS 中消息队列的概念和相关函数进行了详解 消息队列【下篇】详细剖析了消息队列中发送、接收时队列消息控制块中各种指针的行为,以及几个发送消息和接收消息的函数的运作流程 笔者有关于 【FreeRTOS】【应用篇】消息队列【上篇】——队列基本概念

    2024年02月10日
    浏览(29)
  • FreeRTOS源码分析-7 消息队列

    目录 1 消息队列的概念和作用 2 应用 2.1功能需求 2.2接口函数API 2.3 功能实现 3 消息队列源码分析 3.1消息队列控制块 3.2消息队列创建 3.3消息队列删除 3.4消息队列在任务中发送 3.5消息队列在中断中发送 3.6消息队列在任务中接收 3.7消息队列在中断中接收  消息队列(queue),可

    2024年02月14日
    浏览(29)
  • 【FreeRTOS】详细讲解FreeRTOS中消息队列并通过示例讲述其用法

      在裸机系统中,两个程序间需要共享某个资源通常使用全局变量来实现;但在含操作系统(下文就拿 FreeRTOS 举例)的开发中,则使用消息队列完成。那么这两者有啥区别呢?🤔🤔🤔   其实在FreeRTOS系统中也能够像裸机似的,使用全局变量实现多程序共享某个资源(这里

    2024年02月09日
    浏览(31)
  • 关于web3.js中与交易发送、交易签名、智能合约函数调用相关api的理解

    web3.js中有一些与交易发送、签名、合约函数调用相关的api,初学者(如me)常常搞不清什么情况下应该调用哪个,以及它们之间的区别。现将个人浅见记录如下,备忘。 sendTransaction web3.eth.sendTransaction(transactionObject [, callback]) transactionObject对象设置交易的各种参数(不包括签名r,

    2023年04月09日
    浏览(112)
  • 【STM32】FreeRTOS消息队列和信号量学习

    一、消息队列(queue) 队列是一种用于实现任务与任务之间,任务与中断之间消息交流的机制。 注意:1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验:创建一个消息队列,两个发送任务,一个接收任务。 其中任务一任务三

    2024年02月13日
    浏览(27)
  • 【RTOS】快速体验FreeRTOS所有常用API(4)队列

    快速体验FreeRTOS所有常用API(1)工程创建 快速体验FreeRTOS所有常用API(2)任务管理 快速体验FreeRTOS所有常用API(3)同步与互斥 快速体验FreeRTOS所有常用API(4)队列 快速体验FreeRTOS所有常用API(5)信号量、互斥量 快速体验FreeRTOS所有常用API(6)事件组 快速体验FreeRTOS所有常

    2024年01月15日
    浏览(31)
  • Kafka消息队列实现消息的发送和接收

    消息在Kafka消息队列中发送和接收过程如下图所示: 消息生产者Producer产生消息数据,发送到Kafka消息队列中,一台Kafka节点只有一个Broker,消息会存储在Kafka的Topic(主题中),不同类型的消息数据会存储在不同的Topic中,可以利用Topic实现消息的分类,消息消费者Consumer会订阅

    2024年02月11日
    浏览(37)
  • ListenerExecutionFailedException消费rabbitMQ队列中消息出错导致刷屏

    org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method \\\'public void hospital.receiver.HospitalReceiver.receiver(hospital.vo.order.OrderMqVo,org.springframework.amqp.core.Message,com.rabbitmq.client.Ch 错误类型: org.springframework.amqp.rabbit.support.ListenerExecutionFailedException annel) throws java.io.IOException\\\'

    2024年02月10日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包