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

文章目录
前言
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调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中,在使用嵌入式处理器时,遇到了挺多费时费力的事情。所以利用晚上和周末时间,在这些方面深入研究了一下&…...
揭秘Python的魔法:装饰器的超能力大揭秘 ♂️✨
文章目录 Python进阶之装饰器详解1. 引言装饰器的概念与意义装饰器在Python编程中的作用 2. 背景介绍2.1 函数作为对象2.2 高阶函数 3. 装饰器基础3.1 理解装饰器3.2 装饰器的工作原理 4. 带参数的装饰器4.1 为什么需要带参数4.2 实现带参数的装饰器使用函数包裹装饰器使用类实…...
怎么一键消除路人?教你三个消除方法
怎么一键消除路人?在数字时代,摄影已成为我们记录生活、表达情感的重要方式。然而,完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客,但却足以破坏你精心构图的美好瞬间。…...
Android Settings系统属性读写
Settings系统属性存储均为xml,分三种: 1.global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限; 源码地址:frameworks/base/core/java/android/provider/Settings.java 对应xml路径&…...
2024年,企业的人才管理怎么做?这5点是关键!
当今时代,各行各业都面临着激烈的竞争。这些竞争归根结底都是人才的竞争。企业若想在竞争中掌握主动权,实现基业长青,就必须努力留住人才,并充分发挥他们的积极性、主动性和创造性。因此,做好人才管理是企业实现长期可…...
数据库DDL语句
数据库DDL语句: 查询所有数据库: show databases;查询当前数据库的名称 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]注意:排序规则指定后,它会影响…...
《艺术大观》知网艺术刊:可加急, 出刊上网快
《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿,共同探索艺术领域的前沿问题,促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论,包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…...
如何在go语言中调用c语言代码
1.安装c语言编译器 要使用cgo,需要安装c语言编译器 gcc 2.检查CGO_ENABLED时候开启 使用以下命令查看: go env CGO_ENABLED 如果go env CGO_ENABLED被禁用(为0),需要将其设置为开启(为1) 3.编写c语言程序,并用go语言调用c语言程序 1ÿ…...
Monodle centerNet3D 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署
一直想做一点3D目标检测,先来一篇单目3D目标检测Monodle(基于centernet的),训练代码参考官方【代码】,这里只讲讲如何部署。 模型和完整仿真测试代码,放在github上参考链接【模型和完整代码】。 1 模型训练…...
Android Studio 使用MQTT协议开发应用时怎样关闭MQTT连接
Android Studio 使用MQTT协议开发应用时怎样关闭MQTT连接 Android Studio 使用MQTT协议开发应用时关闭MQTT连接 在使用mqtt开发的时候,有时候需要通过 返回 按钮关闭界面或者Activity时,关闭当前页面使用的mqtt连接,这里有两种方式彻底销毁…...
Sping源码(八)—registerBeanPostProcessors
序言 之前我们用大量的篇幅介绍过invokeBeanFactoryPostProcessors()方法的执行流程。 而invokeBeanFactoryPostProcessors的主要逻辑就是遍历执行实现了BeanDefinitionRegistryPostProcesso类(主要是针对BeanDefinition的操作)和BeanFactoryPostProcessor(主要针对BeanFacrot…...
MaxEnt模型文章中存在的问题和处理方法(050B更新)2024.5.24
目前多数MaxEnt文章中存在的问题和处理方案。 **问题一:**变量数据使用问题,很多文章把所有变量数据直接使用,但是温度和土壤、植被类型等属于不同数据类型,在数据使用时参数配置是不一样的,产生的结果文件也是不一样的…...
Modular RPG Hero PBR
-掩码着色着色器提供了无限的颜色变化。(适用于标准/HDRP/URP 11.0.0) -为剑与盾/双剑/双剑姿态提供了简单的角色控制器。(不包括弓和魔杖控制器)(它是用旧的输入系统建造的) -HDRP/URP(11.0.0)SRP 100%支持常规着色器和遮罩着色着色器(基于着色器图形) -具有许多模块…...
机器学习之常用算法与数据处理
一、机器学习概念: 机器学习是一门多领域交叉学科,涉及概率论、统计学、计算机科学等多门学科。它的核心概念是通过算法让计算机从数据中学习,改善自身性能。机器学习专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识…...
Git管理
git作用:代码回溯 版本切换 多人协作 远程备份 git仓库:本地仓库:开发人员自己电脑上的Git仓库 原程仓库:远程服务器上的Git仓库 commit:提交,将本地文件和版本信息保存到本地仓库 push:推送࿰…...
osgearth 3.5 vs 2019编译
下载源码 git clone --recurse-submodules https://github.com/gwaldron/osgearth.git 修改配置文件 主要是修改bootstrap_vcpkg.bat,一处是vs的版本,第二处是-DCMAKE_BUILD_TYPERELEASE 构建 执行bootstrap_vcpkg.bat vs中生成安装 vs2019打开bu…...
2024最新 Jenkins + Docker 实战教程(六)- Jenkins配置邮箱接收构建通知
😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...
Python学习---基于TCP协议的网络通信程序案例
TCP简介: ●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) 如图…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
