H743 USBHOST协议栈 CPU占用率高的问题。

news2024/11/29 0:39:14

经过查看,是因为USBHOST频繁的进入中断导致,单步执行发现,是因为发生了USB_OTG_HCINT_CHH或者USB_OTG_HCINT_NAK中断了,只在CHH中断服务函数里,给USB主线程发了1个消息,又引起了USBH_Process_OS主线程的频繁运行,最终导致整个H743的资源都用在了USB上面,连个printf()打印调试信息都卡。

  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH)

  {

    __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH);

    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);

  }

  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK)

  {

    if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)

    {

      hhcd->hc[ch_num].ErrCnt = 0U;

      __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);

      (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);

    }

    else if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) ||

             (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK))

    {

      hhcd->hc[ch_num].ErrCnt = 0U;

#if 0

      if (hhcd->Init.dma_enable == 0U)

      {

        hhcd->hc[ch_num].state = HC_NAK;

        __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);

        (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);

      }

#else       //###### Fri May 26 16:56:16 CST 2023

            /* re-activate the channel */

      hhcd->hc[ch_num].state = HC_NAK;

      tmpreg = USBx_HC(chnum)->HCCHAR;

      tmpreg &= ~USB_OTG_HCCHAR_CHDIS;

      tmpreg |= USB_OTG_HCCHAR_CHENA;

      USBx_HC(chnum)->HCCHAR = tmpreg;

#endif

    }

    __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);

  }

解决过程如下:

      这段程序我之间用在F437上,是没有问题的,为了对比起见,专门把F437的相应程序运行起来,确实没有这种情况,经过对比,我发现F437的USB并没有频繁的进入USB_OTG_HCINT_CHH导致的中断,2个工程对应的驱动与上层应用是一样的,唯一不一样的是USB协议栈,一个是F437的USB协议栈,比较老,20年左右的, 而现在用的H743的USB协议栈是最新的。我对比了一下,确实存在不同,由于USB协议栈没有版本记录,所以不能简单的从USB协议栈版本加以区分,但对比程序源码,除了协议栈结构相似外,内容细节还是有很大不同的。于是就慢慢的分析,

发现只要我一启动接收就会出来卡顿的情况

    USBH_CDC_Receive(modem->phost, modem->bulk_in_buf, MODEM_RX_BUFSIZE);   //启动接收

说明就是这里引起的,由于这是一个4G模块 驱动 , 4G模块在正常识别后,就会启动接收数据,这种设备不像U盘,发送与接收的字节数都是应用确实好的,发送与接收数据的时刻也是上层应用确定的,这种设备由于接收数据的不确定性,所以上电会就要马上启动接收线程,这本身是没问题的,但是F437也是这种的驱动结构,F437就没有问题,思来想去,还是USB协议栈的问题,

    为什么会进USB_OTG_HCINT_CHH中断呢,官方文档说有2种可能,1是USB事务错误,1是应用关闭USB导致

我启动USBH_CDC_Receive()接收后,但是4G模块这时没有数据,就会改善NAK包,NAK包也会产生USB_OTG_HCINT_NAK中断,这在F437中也验证了,进入NAK中断是正常的,经过对比2个USB协议栈对NAK的处理,发现点猫腻,就是我上面列出的程序时处理的那样

F437是如果端点是ctrl 或者bulk的话,重新启动re-activate the channel USB,但是H743确实直接关闭USB通道,我

猜测正是这个操作,刚好符合”2应用关闭USB导致CHH“,所以后面紧接着就产生了CHH中断,从而造成了系统循环在USB中断中运行,最终导致USB占用CPU奇高的问题,

      解决方法,按F437的方法修改H743的USB协议栈,其实也是不是协议栈,是stm32h7xx_hal_hcd.c,修改如上面代码,问题解决。

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

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

相关文章

YOLOV7训练TT100K交通标识符数据集

《临江仙》 作者:缠中说禅 浊水倾波三万里,愀然独坐孤峰。龙潜狮睡候飙风。无情皆竖子,有泪亦英雄。 长剑倚天星斗烂,古今过眼成空。乾坤俯仰任穷通。半轮沧海上,一苇大江东。 一、yolov7环境搭建 参…

【内网穿透】远程访问RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自cpolar内网穿透的文章:无公网IP&…

【C语言】刷题训练营 —— 每日一练

文章目录 前言 BC113 小乐乐定闹钟BC114 小乐乐排电梯BC115 小乐乐与欧几里得BC116 小乐乐改数字BC107 矩阵转置BC117 小乐乐走台阶BC118 小乐乐与序列BC119 小乐乐与字符串BC121 小乐乐学编程BC122 小乐乐算平均分完结 前言 大家好,继续更新专栏 c_牛客&#xff0…

【C++】二叉搜索树Binary Search Tree

Binary Search Tree 二叉搜索树的概念二叉搜索树的操作二叉搜索树的实现查找插入删除 二叉搜索树的应用二叉搜索树的性能分析 二叉搜索树的概念 二叉搜索树又被称为二叉排序树,顾名思义,当我们使用中序遍历时,会得到一个有序的序列。二叉搜索…

进程信号的保存和处理

目录 🏆一、信号的保存 ①信号的捕捉 ②sigset_t ③sigaction 🏆二、不可重入函数 🏆三、volatile 🏆四、SIGCHLD 🏆一、信号的保存 在聊信号保存之前,我们不妨想一个问题,如果把所有信号…

易岸教育:高端篇!公务员面试经验总结!

根据众多应聘者的面试经验,总结出以下几点供应聘者参考: 1、注意着装。 适当提高服装档次。 衣着得体大方,可以提升形象,增强自信。 2、安心。 要以一颗平常心正确对待面试,就要有受挫的心理准备。 即使面试失败了一…

【Python】学习导论:Python 简介

前言:XMind 脑图大纲 一、Python 的发展和演变 1.1 Python 1.0(1994年) 版本:Python 的第 1 个正式版本典型里程碑:包含了基本的语言特性和标准库 1.2 Python 2.0(2000年) 版本:Pyt…

XDP入门--通过用户态程序自动加载与卸载eBPF程序字节码到网卡

本文目录 1、测试环境1、eBPF字节码的源代码实现3、用户态应用程度实现简介4、编译与运行5、运行状态验证 通过文章XDP入门–之hello world 我们知道,可以通过iproute2的ip工具向网卡去加载和卸载eBPF程序的字节码。但这个使用起来不太方便。而且在需要网卡恢复正常…

浅析Java 多线程中的锁

前言 随着互联网技术的快速发展,多线程编程已经成为了现今编程领域中必不可少的知识点之一。Java 是一种广泛使用的编程语言,也是一些底层应用程序和高并发应用程序的首选语言。而 Java 提供的多线程编程机制和相关的锁机制,则成为了 Java 开…

SpringBoot 上传图片-指定目录按照日期存储

SpringBoot 上传图片-指定目录按照日期存储 1. 在配置文件中指定文件保存根目录 我用的yaml,用properties也行 file-save-path: D:/upload/2. 文件上传接口 package com.admin.controller.wechat;import cn.hutool.core.lang.UUID; import com.redic.base.Result; import com…

SpringMVC 程序开发

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 什么是 Spring MVCMVC 定义 怎么学 Spring MVCSpring MVC 创建和连接创建 Spring MVC 项目RequestMapping 注解介绍PostMappi…

二叉搜索树的实现(C语言)

目录 前言: 一:准备工作 (1)需要的头文件 (2)树节点结构体描述 (3)初始化 二:指针 三:插入新节点(建树) (1)生成一个新节点 (2)找插入位置 四:查找和遍历 (1)查找 (2)遍历 五:删除节点 六&…

mysql 主从同步

① 修改 master 配置文件② 新建同步账号③ 创建数据库④ 修改 slave 配置文件⑤ 配置主从关系⑥ 检验主从结果 角色ipmaster192.168.233.100slave1192.168.233.101slave2192.168.233.102 禁用 selinux 跟 firewal l情况下: ① 修改 master 配置文件 vim /etc/my…

NEFU linux实验二

在linux中,家目录又称“home目录”、“主目录”,是用户的宿主目录,通常用来保存用户的文件,可以使用“~”来表示。一个用户登录系统,进入后所处的位置就是“/home”,即家目录;root用户的家目录为…

路径规划算法:基于鸡群优化的路径规划算法- 附代码

路径规划算法:基于鸡群优化的路径规划算法- 附代码 文章目录 路径规划算法:基于鸡群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法鸡群…

输电线路故障诊断(利用随机森林方法实现二分类和多分类)

1.simunlike仿真系统的建立( 运行效果 :输电线路故障诊断_哔哩哔哩_bilibili) 2.在仿真系统的基础上获取数据集 分别获取单相接地故障、两相接地故障、两相间短路故障、三相接地故障、三相间短路故障和正常状态下的电流(Ia,Ib,I…

一文带你了解MySQL之optimizer trace神器的功效

前言: 对于MySQL 5.6以及之前的版本来说,查询优化器就像是一个黑盒子一样,你只能通过EXPLAIN语句查看到最后优化器决定使用的执行计划,却无法知道它为什么做这个决策。这对于一部分喜欢刨根问底的小伙伴来说简直是灾难&#xff1…

2023年5月14日蓝桥杯c++省赛中级组

选择题讲解 1.)C++中,bool类型的变量占用字节数为 ( )。 A.1B.2 C.3 D.4 答案:A 解析:(C++ 中 bool 类型与 char 类型一样,都需要1 byte。一些其他类型的占用字节数:short:2 byte。int:4 byte。long long:8 byte。double:8 byte。) 2.)以下关于C++结构体的说…

代码随想录二刷 day04 | 链表之 24两两交换链表中的节点 19删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

24. 两两交换链表中的节点 题目链接 解题思路: 先将一些可能会改变的节点保存一下,然后再按照三个步骤就行修改 注意 要使用改变以后节点的指针(这个地方一刷的时候没注意到,稀里糊涂的过去了) 代码如下:…

【八股】计算机网络-HTTP和HTTPS的区别、HTTPS加密传输原理

计算机网络-HTTP和HTTPS的区别、HTTPS加密传输原理 一、HTTP和HTTPS的基本概念二、HTTP与HTTPS的区别三、HTTPS加密传输原理1. 什么是HTTPS1.1 https诞生的原因1.2 https加密方式1.3.http和https的区别 2. https的工作流程3. 数字证书3.1 什么是数字证书3.2 如何申请数字证书3.…