当前位置: 首页 > news >正文

【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法

文章目录

前言

Timer中断调度

Event中断调度

StateFlow调度

分析和应用

总结

参考资料


前言

        近期在一些嵌入式系统开发项目中,在使用嵌入式处理器时,遇到了挺多费时费力的事情。所以利用晚上和周末时间,在这些方面深入研究了一下,解锁了一些新技能。后面会用若干篇文章把它总结分享出来,以备将来翻看,同时也希望能够帮到这一领域的粉丝朋友们。

        由于实际项目比较庞大,而且不便在网络公开,所以就另起了一个Demo工程,重点介绍其中的原理、方法和特性分析

Timer中断调度

        Timer中断是硬件中断的一种,其在处理器中断框架中的位置如下图所示:

        Timer中断工作的过程如下:

        TDDRH:TDDR是一个16位的时钟分频因子寄存器,需要开发者写入分频的倍数。

        PSCH:PSC是一个16位的分频计数寄存器,能随着时钟节拍递减,递减到0时重新装载TDDRH:TDDR寄存器的值,然后继续循环。每循环一次后TIMH:TIM计数器减1。

        PRDH:PRD是一个32位的周期寄存器,需要开发者写入循环周期的长度。

        TIMH:TIM是一个32位的计数寄存器,能随着分频后的时钟节拍递减。递减到0时重新装载PRDH:PRD寄存器的值,然后继续循环。每循环一次后产生一个Timer中断脉冲。当Timer中断脉冲产生时,就可以作为一个Task调度的Flag,如果有多个不同周期的异步Task,就可以使用多个Timer中断来调度。

        举例:如果我们想制造一个0.01s的Timer中断,并且已知处理器的系统时钟是120MHz。首先设定分频因子为2,那么分频后的时钟频率是60MHz。PRDH:PRD = 0.01s/(1/60,000,000) = 600,000。

        Tips:如果循环周期计算出来不是整数,四舍五入的话就会引入设计误差,这时就可以通过调整分频因子来弥补这种误差。或者循环周期超出了32位的最大值,也可以调整分频因子来修正

Event中断调度

        Event中断是硬件中断的一大类,其在处理器中断框架中的位置如下图所示:

        Event中断工作的过程如下:

        本文以SCI通信事件为例,来讲解异步任务的调度。

        第一步,在Hardware Settings中勾上SCI数据接收后中断使能,并配置优先级level,示例如下:

        第二步,从模块库Scheduling中拖出ISR模块,示例如下:

        第三步,在硬Hardware Mapping中选择SCI接收中断,并勾上中断服务后清除状态flag,示例如下:

        第四步,在Simulink Model中创建f()函数调用子系统,连接到前面的ISR模块event端口上,示例如下:

        当SCI接收到数据时,就会产生一个中断脉冲。可以作为一个Task调度的Flag,比如响应SCI命令的Task。如果有多个类似的触发型异步Task,就可以使用多个event中断来调度。

StateFlow调度

        前面两种任务调度的方法都是依赖于处理器硬件的中断和对应的中断服务程序,这种调用方式通常只适用于小负荷的任务,因为软件不能长时间处于中断服务程序中。如果有大负荷的任务,就要引入Idel Task调度模块,在其内部使用StateFlow等纯软件的方法调度各个任务,示例如下:

        Idel Task调度的任务生成C语言中后,实际上就是在main()的while(1){}中全速循环的任务。大部分的软件任务实际上不需要这么快的循环速度,所以也可以用前面Timer周期的思想,用软件变量递减的方式做一些周期性的Flag。示例如下:

flag = 0;for(i=0;i<50000;i++){for(j=0;j<8;j++){Cnt1 -= 1;if(Cnt1 == 0){Cnt1 = 8;     }}Cnt2 -= 1;if(Cnt2 == 0){Cnt1 = 50000;flag = 1;}}

        Tips:这种软件循环周期,精度不如Timer中断周期高。

        有了周期循环的基础后,就可以使用StateFlow调用子系统的方式来调度多任务异步执行,示例如下:

分析和应用

        1、使用Timer中断调度任务的方法,任务周期的精度非常高,几乎不会波动,因为它的节拍源是非常稳定的系统时钟。

        2、能引起Timer中断周期波动的唯一因素是中断冲突。可以设置Timer中断的优先级,来决定当发生中断冲突时先执行哪个中断。也可以设置Timer中断是否允许抢占,来确定当有新中断产生时Timer中断是否会被打断。

        3、使用Event中断调度任务,与Timer中断的工作机制比较相似。并且依赖于处理器中断的原理,可以保证外部Event产生时可以非常快速地响应,也保证了嵌入式系统的实时性

        4、使用StateFlow调度任务,他的基础是软件延时控制的周期循环,很容易受到处理器负荷变化引起的波动。使用StateFlow调度任务的优点是调度非常灵活,能处理的任务量也可以比较大。

        5、一种比较完美的任务调度方法时把上述三种方式结合起来,避开各自的劣势,发挥各自的优势。首先可以使用Timer中断产生一个最小的单位周期(例如10ms),然后在此基础上利用软件计数延时的方式产生20ms和50ms的周期Flag,然后进一步开发Stateflow调度任务。这样既可以保证控制周期在一定程度上的稳定性,也能充分发挥Stateflow调度任务的灵活性,同时保留Event中断调度方式的实时性,这样整体嵌入式系统的性能就比较均衡了。如果具体的嵌入式系统应用场景中,值要求哪一方面的绝对性能,那么就可以完全只依赖于其中一种任务调度方式,抛弃其他的调度方式。

总结

        以上就是本人在研发中使用嵌入式处理器异步任务调度时,一些个人理解和分析的总结,主要介绍了三种异步任务调度的工作原理,展示了具体的使用方法,并对比分析了这些不同方式的特点差异和各自的适用场景

        后续还会分享另外几个最近解锁的嵌入式处理器新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。

参考资料

    TMS320F28003x Real-Time Microcontrollers datasheet.pdf


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

相关文章:

【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法

文章目录 前言 Timer中断调度 Event中断调度 StateFlow调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中&#xff0c;在使用嵌入式处理器时&#xff0c;遇到了挺多费时费力的事情。所以利用晚上和周末时间&#xff0c;在这些方面深入研究了一下&…...

揭秘Python的魔法:装饰器的超能力大揭秘 ‍♂️✨

文章目录 Python进阶之装饰器详解1. 引言装饰器的概念与意义装饰器在Python编程中的作用 2. 背景介绍2.1 函数作为对象2.2 高阶函数 3. 装饰器基础3.1 理解装饰器3.2 装饰器的工作原理 4. 带参数的装饰器4.1 为什么需要带参数4.2 实现带参数的装饰器使用函数包裹装饰器使用类实…...

怎么一键消除路人?教你三个消除方法

怎么一键消除路人&#xff1f;在数字时代&#xff0c;摄影已成为我们记录生活、表达情感的重要方式。然而&#xff0c;完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客&#xff0c;但却足以破坏你精心构图的美好瞬间。…...

Android Settings系统属性读写

Settings系统属性存储均为xml&#xff0c;分三种&#xff1a; 1.global&#xff1a;所有的偏好设置对系统的所有用户公开&#xff0c;第三方APP有读没有写的权限&#xff1b; 源码地址&#xff1a;frameworks/base/core/java/android/provider/Settings.java 对应xml路径&…...

2024年,企业的人才管理怎么做?这5点是关键!

当今时代&#xff0c;各行各业都面临着激烈的竞争。这些竞争归根结底都是人才的竞争。企业若想在竞争中掌握主动权&#xff0c;实现基业长青&#xff0c;就必须努力留住人才&#xff0c;并充分发挥他们的积极性、主动性和创造性。因此&#xff0c;做好人才管理是企业实现长期可…...

数据库DDL语句

数据库DDL语句&#xff1a; 查询所有数据库&#xff1a; show databases;查询当前数据库的名称 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]注意&#xff1a;排序规则指定后&#xff0c;它会影响…...

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…...

如何在go语言中调用c语言代码

1.安装c语言编译器 要使用cgo&#xff0c;需要安装c语言编译器 gcc 2.检查CGO_ENABLED时候开启 使用以下命令查看&#xff1a; go env CGO_ENABLED 如果go env CGO_ENABLED被禁用(为0),需要将其设置为开启(为1) 3.编写c语言程序&#xff0c;并用go语言调用c语言程序 1&#xff…...

Monodle centerNet3D 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署

一直想做一点3D目标检测&#xff0c;先来一篇单目3D目标检测Monodle&#xff08;基于centernet的&#xff09;&#xff0c;训练代码参考官方【代码】&#xff0c;这里只讲讲如何部署。 模型和完整仿真测试代码&#xff0c;放在github上参考链接【模型和完整代码】。 1 模型训练…...

Android Studio 使用MQTT协议开发应用时怎样关闭MQTT连接

Android Studio 使用MQTT协议开发应用时怎样关闭MQTT连接 Android Studio 使用MQTT协议开发应用时关闭MQTT连接 在使用mqtt开发的时候&#xff0c;有时候需要通过 返回 按钮关闭界面或者Activity时&#xff0c;关闭当前页面使用的mqtt连接&#xff0c;这里有两种方式彻底销毁…...

Sping源码(八)—registerBeanPostProcessors

序言 之前我们用大量的篇幅介绍过invokeBeanFactoryPostProcessors()方法的执行流程。 而invokeBeanFactoryPostProcessors的主要逻辑就是遍历执行实现了BeanDefinitionRegistryPostProcesso类(主要是针对BeanDefinition的操作)和BeanFactoryPostProcessor(主要针对BeanFacrot…...

MaxEnt模型文章中存在的问题和处理方法(050B更新)2024.5.24

目前多数MaxEnt文章中存在的问题和处理方案。 **问题一&#xff1a;**变量数据使用问题&#xff0c;很多文章把所有变量数据直接使用&#xff0c;但是温度和土壤、植被类型等属于不同数据类型&#xff0c;在数据使用时参数配置是不一样的&#xff0c;产生的结果文件也是不一样的…...

Modular RPG Hero PBR

-掩码着色着色器提供了无限的颜色变化。(适用于标准/HDRP/URP 11.0.0) -为剑与盾/双剑/双剑姿态提供了简单的角色控制器。(不包括弓和魔杖控制器)(它是用旧的输入系统建造的) -HDRP/URP(11.0.0)SRP 100%支持常规着色器和遮罩着色着色器(基于着色器图形) -具有许多模块…...

机器学习之常用算法与数据处理

一、机器学习概念&#xff1a; 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、计算机科学等多门学科。它的核心概念是通过算法让计算机从数据中学习&#xff0c;改善自身性能。机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识…...

Git管理

git作用:代码回溯 版本切换 多人协作 远程备份 git仓库&#xff1a;本地仓库&#xff1a;开发人员自己电脑上的Git仓库 原程仓库&#xff1a;远程服务器上的Git仓库 commit&#xff1a;提交&#xff0c;将本地文件和版本信息保存到本地仓库 push&#xff1a;推送&#xff0…...

osgearth 3.5 vs 2019编译

下载源码 git clone --recurse-submodules https://github.com/gwaldron/osgearth.git 修改配置文件 主要是修改bootstrap_vcpkg.bat&#xff0c;一处是vs的版本&#xff0c;第二处是-DCMAKE_BUILD_TYPERELEASE 构建 执行bootstrap_vcpkg.bat vs中生成安装 vs2019打开bu…...

2024最新 Jenkins + Docker 实战教程(六)- Jenkins配置邮箱接收构建通知

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…...

Python学习---基于TCP协议的网络通信程序案例

TCP简介&#xff1a; ●TCP 面向连接、可靠的、基于字节流的传输控制协议 ●TCP的特点 ○面向连接 ○可靠传输 ■应答机制 ■超时重传 ■错误校验 ■流量管控 ●TCP通信模型 TCP严格区分客户…...

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…...

每天五分钟深度学习框架PyTorch:创建具有特殊值的tensor张量

本文重点 tensor张量是一个多维数组,本节课程我们将学习一些pytorch中已经封装好的方法,使用这些方法我们可以快速创建出具有特殊意义的tensor张量。 创建一个值为空的张量 import torch import numpy as np a=torch.empty(1) print(a) print(a.dim()) print(s.shape) 如图…...

Taotoken的TokenPlan套餐如何实现更经济的模型调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken的TokenPlan套餐如何实现更经济的模型调用 1. 理解TokenPlan的计费模式 在模型应用开发过程中&#xff0c;成本的可预测性…...

诚信标签工厂端解决方案 适配俄标 CRPT 体系一体化技术方案

俄罗斯诚实标签依托 CRPT 体系执行强制管控&#xff0c;各类出口货品必须完成 Data Matrix 编码采集、格式转换、多层包装数据绑定&#xff0c;数据合规后方可通关流通。美妆食品、日化建材、玩具五金等品类包装形态差异较大&#xff0c;人工采集方式普遍存在识别精度不足、批量…...

SSH工具对比:新手用户和熟练运维,选型逻辑有什么不同

结论 新手用户和熟练运维在选择 SSH 工具时&#xff0c;关注点往往完全不同。 新手更在意的是&#xff1a;能不能顺利连接、界面是否直观、文件和配置是否容易找到、网站出问题时能不能快速定位。 而熟练运维更在意的是&#xff1a;连接效率、命令自由度、多服务器管理能力、原…...

VMware ESXi 9.1.0.0集成NVME+网卡驱动版发布|新特性+驱动集成+部署升级+FAQ全指南

一、ESXi 9.1.0.0 正式版核心新特性 VMware ESXi 9.1.0.0&#xff08;2026 年 5 月发布&#xff09;是 vSphere 9.1 核心组件&#xff0c;聚焦硬件兼容扩展、性能跃升、安全加固、运维简化四大方向&#xff0c;重点强化 NVMe 存储与网卡生态适配&#xff0c;以下为关键更新&am…...

别再手动编译了!Matlab一键调用CEC2017测试函数的完整配置指南(附30个函数调用示例)

别再手动编译了&#xff01;Matlab一键调用CEC2017测试函数的完整配置指南&#xff08;附30个函数调用示例&#xff09; 算法研究者们常常需要借助标准测试函数来验证优化算法的性能&#xff0c;而CEC2017测试函数集因其复杂性和多维度的挑战性&#xff0c;成为评估算法鲁棒性的…...

探索Windows 10上的Android世界:揭秘WSA-Windows-10项目的3个技术突破

探索Windows 10上的Android世界&#xff1a;揭秘WSA-Windows-10项目的3个技术突破 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 想象一下&#…...

二十六.签名与脚本(1)--脚本介绍

1.区块链脚本介绍在之前的章节中&#xff0c;我们了解了签名与验证相关&#xff0c;但是btc的交易数据&#xff0c;签名和验证&#xff0c;不是单纯的&#xff0c;还有脚本深度参与其中。我们从开始来&#xff1a;bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletT…...

企业云盘签章技术方案:从数字签名原理到工程落地

背景 电子签章在企业云盘中的落地&#xff0c;不只是一个"上传盖章图片"的功能实现。本质上&#xff0c;它是一套涉及数字签名、PKI基础设施、文档完整性校验的综合性技术方案。本文从技术选型角度&#xff0c;说清楚企业云盘内置签章需要解决哪些问题、主流实现方案…...

通过TaotokenCLI工具一键配置开发环境接入参数

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken CLI工具一键配置开发环境接入参数 对于需要接入多个大模型服务的开发者而言&#xff0c;手动配置每个项目的API密钥、…...

如何扩展GASShooter:添加新武器、新能力与新游戏机制的终极指南

如何扩展GASShooter&#xff1a;添加新武器、新能力与新游戏机制的终极指南 【免费下载链接】GASShooter Advanced FPS/TPS Sample Project for Unreal Engine 4s GameplayAbilitySystem plugin 项目地址: https://gitcode.com/gh_mirrors/ga/GASShooter GASShooter是Un…...