DSP_控制程序框架有感

news2024/11/19 19:20:07

本文仅代表个人观点,若有不同意见,请评论区讨论或私信留言。

中心思想

基于DSP的控制程序可分为两个部分,① 对实时性要求高的部分,②对实时性要求不高的部分。

① 对实时性要求高的程序,建议采用中断处理程序实现。

② 对实时性要求低的程序,建议写在主程序的while(1),用队列的方式实现。比如与上位机通信的程序建议全部写在这个部分。

1、中断程序的优化加速是必要的

在基于DSP的控制程序框架中, 实时性要求高的那部分程序,一般包含传感器的采样和解码、控制器程序、控制量(驱动量)下发程序。默认状态下DSP程序是没有配置中断嵌套的(如果要搞中断嵌套可以去这篇→TMS320F28335软件设置中断优先级的原理_28335中断优先级_死灰如风的博客-CSDN博客)。首先,我们要有一个共识,即便是你弄了中断嵌套,CPU在任何一个时刻,都只能运行某一个中断程序或者主程序。 假设现有某控制系统,要求控制器以5kHz的频率实时控制。理想情况下的时间片示意图如下。

在0.0002s(5kHz)内, 我们的CPU干了很多事情。 T1+T2+...+T8 = T。 其中T1~T4这几个时间段,CPU都在跑中断程序。 而剩下的T5~T8这些空隙,则是可以用来跑主程序,比如while(1)里面的程序。 (注:上图只是示意, 比如我传感器ADC采集是20kHz的,一个控制周期T内,有就会有4次T1。 反正无论你有多少个中断,你都能够在一个控制周期T内跑完,这个就是理想情况)。

然而实际上,很有可能发生下面这种情况。

当我CPU正在运行某一个中断的时候,另一个中断来了,这时候排队等候,等上一个中断运行完。如果控制回路需要的所有的中断程序运行一次的时间加起来,小于我们所期望的控制周期时间T吗,这时候也没问题。 但如果说所有的中断程序的运行时间加起来远远大于我们所期望的控制周期时间T。而某些对于控制系统而言非常重要的中断程序,优先级很低,排队总排在后面。那这时候程序运行就会出现异常啦。  这个时候我们就急需优化中断处理程序啦,特别是优先级高的中断处理函数。优先级高且运行时间长的中断总占着CPU的话,其他低优先级的中断处理程序根本不会被执行,主程序的while(1)里面的程序也不会被执行。(红字这段话还有待证明,可以用两个优先级不同的定时器中断来证明,在高优先级的定时器中断里面做一个超过改定时器计数的长延迟,看看低优先级的定时器中断会不会进,有时间我去测试一下)。

无论高优先级中断会不会长时间占用CPU导致低优先级中断和主程序不被运行。 如果所有的中断程序0.0002s时间片的运行时间总和 > 0.0002s,程序的运行都不会正常。因为控制器的离散化是按照0.0002s离散的,如果你实际的执行不是0.0002s执行一次,那系统的运行状态肯定不是我们所期望的。

所以:

中断程序要想尽一切办法加速,能简化的要尽量去简化

曾经本人干过一个蠢事,就是在控制算法的那个定时器中断里面,去编码和发送串口数据到上位机(非常耗时),这样的做法会让控制算法的中断程序占用大量的CPU时间。

关于DSP程序的加速方法,我研究了一些,可以参考参考。

DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行-CSDN博客

DSP_TMS320F28377D_算法加速方法2_添加浮点运算快速补充库rts2800_fpu32_fast_supplement.lib_江湖上都叫我秋博的博客-CSDN博客DSP_TMS320F28377D_算法加速方法3_使用TMU库加速_江湖上都叫我秋博的博客-CSDN博客 

DSP_TMS320F28377D_算法加速方法4_C语言编程优化_江湖上都叫我秋博的博客-CSDN博客 

2、避免CPU资源浪费

另一个值得注意的一点,传感器信息的获取分为主动触发的采样方式 和 被动的接收中断方式  

1、主动触发采样是可以通过程序去配置的,建议把采样频率配置成和控制回路的频率一致,如果高于控制回路的频率,则会造成CPU资源浪费。 

2、被动的接收中断方式 ,采样频率取决于传感器给控制器发送数据的频率。 如果传感器以高于你控制回路频率给你发送数据(比如传感器以20KHz的频率给你发数据, 但是你控制回路是5kHz的)。如果你以传感器给你的高频率去接收数据并解码,那么将会造成资源浪费。 那么建议你被动接收传感器数据的中断程序中,做一个计数分频判断,比如计数值➗4的余数不为0的时候,我直接清除接收缓存直接清中断返回。计数值➗4的余数为0的时候,我就把数据存下来并解码以备使用。 这样的处理方式,4帧数据中,3帧直接丢弃,只有1帧做了接收和数据处理。 这样本质上来说已经避免了CPU资源浪费。

3、上位机通信单独拎出强调

作为一个又写上位机又写下位机的苦命人,深知DSP上用于和上位机通信程序会占用大量的CPU资源。 这里单独拎出来讲一下,无论接收和发送数据,我都建议用小队列的方式放在主程序while(1)中,接收上位机命令是个不频繁的操作,但我还是建议接收中断直接把接收到的原始数据拷贝出来就关中断,上位机可把一帧数据才成几个小队列发过来。DSP这边通过检测帧头和帧尾这些手段来判断是否抓取了一个完整的数据包。  发送数据到上位机就是个体力活了,有时候要求上位机显示系统实时的状态信息,那么首先我们发送到上位机的数据就得做不得假啦,数据量肯定很大,而且还相对高频。 对于此,我的建议是高频小队列,什么意思呢? 你可以把你所有需要发送的数据都用队列的方式存储起来(存储这个动作相比于发送数据的动作耗时更短的), 然后比如我1kHz的频率,只要我队列不为空,我就取一个出来进行一次发送,但每次只发送8个字节或更少(一次如果只发8字节,发送数据的耗时是不长的)。 它等价于 50Hz 160字节。   这种做法的优势是,你如果一次性发送160字节,会占据CPU非常长的时间。 这一次发送会导致控制系统其他所有功能完全崩溃了。 

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

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

相关文章

Ubuntu22.04本地部署PaddleSpeech实验代码(GPU版)

前言 之前做了一个Ubuntu18.04.6本地部署PaddleSpeech实验代码(CPU版)的相关项目,因为是CPU版的,合成/训练等方面的耗时真的是非常感人,有了之前的经验,又部署了一个GPU版的,说实话虽然时间用的…

CVE-2022-22963 Spring Cloud Function SpEL命令注入

一、简介 Spring Cloud Function 是基于 Spring Boot的函数计算框架。该项目致力于促进函数为主的开发单元,它抽象出所有传输细节和基础架构,并提供一个通用的模型,用于在各种平台上部署基于函数的软件。在Spring Cloud Function相关版本&am…

Pytest框架之fixture详解

本文详细讲解了Pytest框架之fixture,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 相关文章 pytest作为python语言的测试框架,它的fixture有2种实现方式。 一种是xunit-style&#xf…

OpenLayers实战,OpenLayers获取用户定位位置并高亮显示用户所在行政区划边界

专栏目录: OpenLayers实战进阶专栏目录 前言 本篇文章通过国内的省、自治区和直辖市的GeoJson数据作为行政区划边界数据,然后根据用户定位位置,通过OpenLayers计算得到用户所在行政区划,并使用OpenLayers高亮显示用户所在行政区划边界。 本章是综合应用场景,所以代码稍…

ESP32 ESP-IDF LVGL移植和Wokwi仿真

陈拓 2023/10/21-2023/10/25 1. ESP-IDF开发环境 ESP-IDF的LVGL移植包括2个组件: lvgllvgl_esp32_drivers 目前lvgl_esp32_drivers在ESP-IDF 5.0以上版本编译通不过,所以我们安装ESP-IDF 4.4.5。 从https://dl.espressif.cn/dl/esp-idf/下载 安装说明…

纳米软件分享:芯片电学测试及测试参数指标介绍

电学测试是芯片测试的一个重要环节,用来描述和评估芯片的电性能、稳定性和可靠性。芯片电学测试包括直流参数测试、交流参数测试和高速数字信号性能测试等。 什么是芯片电学测试? 芯片电学测试就是检测芯片、元件等电性能参数是否满足设计的要求。检测的项目有电压…

【uniapp】短信验证码输入框

需求是短信验证码需要格子输入框 如图 网上找了一个案例改吧改吧 直接上代码 结构 <template><view class"verify-code"><!-- 输入框 --><input id"input" :value"code" class"input" :focus"isFocus"…

Ubuntu安装Jitsi Meet详细教程

文章目录 Ubutu系统安装启用root账户切换Ubuntu源设置DNS 主机名和域名配置安装open JDK安装Nginx安装 Jitsi Meetjitsi本地测试使用一个奇怪的BUG Jist服务管理 Ubutu系统安装 官方推荐用Ubuntu&#xff0c;网上很多教程也都是基于Ubuntu的&#xff0c;所以选择这个系统。 其…

【Python Numpy】Ndarray属性

文章目录 前言一、NumPy数组的常用属性1.1 常用属性1.2 示例代码 总结 前言 NumPy&#xff08;Numerical Python&#xff09;是Python中用于科学计算的一个重要库&#xff0c;它提供了一个强大的多维数组对象&#xff08;ndarray&#xff09;以及一系列用于处理这些数组的函数…

从0到1:CTFer成长之路——死亡 Ping 命令

死亡 ping 命令 绕过探测 手动尝试 慢 脚本生成转义后的字符&#xff0c;后面拼接命令 import urllib.parsewith open(r"C:\Users\LEGION\Desktop\RCE.txt", "w", encoding"utf-8") as f:for i in range(0, 255):encoded_str urllib.parse…

短篇小说 《镜花水月》

最近脑中不知道为什么&#xff0c;一直构想着这样一个故事&#xff0c;心血来潮&#xff0c;还是想把它直接付诸实践。如果大家有些兴趣可以读一读&#xff0c;欢迎评论留言&#xff0c;发表自己的看法&#xff0c;大家也可以给一些建议或者自己设计一些比较好的情节或者点&…

leetcode第80题:删除有序数组中的重复项 II

题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 …

一种实用的边的存储结构--链式前向星

文章目录 前言前向星定义存储结构优缺点 链式前向星边的定义边的插入边的查找运行示例 总结 前言 我们对于图的存储方式常用的有邻接矩阵&#xff08;适用于稠密图&#xff09;&#xff0c;对于边的查询效率较低&#xff0c;也有邻接表&#xff0c;对于边的查询效率高&#xf…

警报:Citrix和VMware漏洞的PoC利用代码已发布

导语 近日&#xff0c;虚拟化服务提供商VMware向客户发出警报&#xff0c;称其Aria Operations for Logs中的一个已修补安全漏洞的PoC利用代码已经发布。这个高危漏洞&#xff08;CVE-2023-34051&#xff09;是一种绕过身份验证的情况&#xff0c;可能导致远程代码执行。本文将…

【备考网络工程师】如何备考2023年网络工程师之上午常见考点篇(上)

目录 写在前面涉及知识点一、香农定理与奈奎斯特定理问题1.1 香农定理1.2 尼奎斯特定理 二、E1与T1问题三、数据传输延迟问题3.1 对于电缆3.2 对于卫星 四、数字化技术PCM计算问题五、CSMA/CD以太帧最小帧长计算问题六、CSMA/CD考点汇总七、CSMA/CA考点汇总八、各协议注意事项总…

初步认识 Web Components 并实现一个按钮

目录 1.Web Components 基本概念 1.1 三个场景 1.2 是什么 2.使用 Custom Elements 实现一个按钮 2.1 概念介绍 2.1.1 Shadow DOM 2.1.2 Element.attachShadow() 2.1.3 在组件中 使用 Shadow DOM 基本步骤 2.1.4 attributeChangedCallback 2.1.5 get observedAttribu…

绝对路径与相对路径

目录 一、绝对路径 二、相对路径 三、举例 一、绝对路径 绝对路径是指从根目录开始的完整路径&#xff0c;包括所有父目录的路径&#xff0c;直到目标文件或者目录 所在的位置。 全文件名全路径文件名绝对路经完整的路径 例如:在windows系统中&#xff0c;绝对路径通常以…

nuxt脚手架

nuxt(vue)和next(react)都是服务端渲染的 安装 - NuxtJS | Nuxt.js 中文网 首先要安装 create-nuxt-app: npm install create-nuxt-app -g 然后&#xff1a;npx create-nuxt-app master 建议在cmd中操作&#xff0c;可以单选和多选 然后就各种单选和多选&#xff0c;多选按…

实用篇-服务拆分及远程调用

一、服务拆分 服务拆分(也叫项目拆分) 注意事项&#xff1a; 不同的微服务&#xff0c;不要重复开发相同的业务要求微服务之间数据独立&#xff0c;不要访问其他微服务的数据库微服务可用将自己的业务暴漏为接口&#xff0c;供其他服务调用 1. Cloud-Demo拆分 首先有一个已…

项目管理之如何有效定义项目目标

项目目标管理是项目管理中非常重要的一个环节&#xff0c;它可以帮助项目团队明确目标&#xff0c;制定合理可行的计划&#xff0c;确保项目顺利实施并取得成功。在定义项目目标时&#xff0c;需要遵循SMART原则&#xff0c;确保目标具体、明确、可衡量、可实现、相关且有时间和…