制作一个RISC-V的操作系统十五-软件定时器

embedded/2024/9/22 13:01:40/

文章目录

  • 定时器分类
  • 定时器相关分类
  • 软件定时器设计
    • 初始化
    • 创建
    • 删除
    • 触发流程
    • 图形示意
  • 优化
  • 代码

定时器分类

硬件定时器:由硬件频率和触发限制的大小决定,只有一个,精度高
软件定时器:基于硬件定时器实现,精度大于等于硬件定时器,但通过软件(代码)实现,所以实现的个数没有上限
在这里插入图片描述

定时器相关分类

单次:就是定时器设置一个时间,当到达该时间后就会退出,该定时器将被销毁,不再起作用
周期:就是定时器只要设置一次,后面将定期触发定时器

超时函数:定时器超时后执行的函数
中断上下文:就是中断处理中执行超时函数,每次时间变化都会触发中断,自然而然都有机会执行超时函数,那么实时性很高
任务上下文:就是超时函数作为一个进程来执行,超时后也需要调度才能执行,实时性差

在这里插入图片描述

软件定时器设计

初始化

time结构体中有函数指针和调用该函数的参数和定时的时间
初始化中会将每个time结构体赋值为空
在这里插入图片描述

创建

找到一个还没有被设置的time结构体然后赋值
在这里插入图片描述

删除

找到对应的time结构体然后赋值为空
在这里插入图片描述

触发流程

时间中断,然后时间中断处理函数中触发关于检查是否要触发软中断函数的函数,如果符合某个软件定时器的定时数字就会调用该软件定时器的处理函数
在这里插入图片描述

图形示意

每次硬件定时器中断触发tick变化,然后timecheck会将timelist中不同timer的定时的数字对比,然后决定是否触发其处理函数
在这里插入图片描述

优化

  • 由于每次timecheck都需要循环挨个比对,如果让时间快到的放在前面,那么能比对的次数会少些,所以按照超时时间排序
  • 链表实现的是对空间的优化,如果用数组来存储软件定时器,那么可能导致某些没被用的空间浪费掉,采用链表需要就申请空间,能够节约空间
    在这里插入图片描述

进一步优化比对的次数,跳表算法,类似二分,从上层往下层比对。
如果为20,首先到达11发现小于26,此时到下层,发现大于17,到达17,发现小于26,调到下一层,再次比对20,比对成功
在这里插入图片描述

代码

在创建软件定时器函数时,会在开始和最后又上锁和解锁,试想下,目标是实现创建软件定时器实现在当前时刻几秒后软件定时器能按时触发。如果中间有定时中断发送,那么定时器设置到一半,就会去处理中断,此时也会去检查软件定时器,假设此时软件定时器想的是当前时刻的一个时刻后,那么此时由于中断中会将该时刻加一个,但检查时候由于软件定时器没有设置完成,那么会导致错过这个时刻,要等到下次定时器中断才会检查软件定时器并成功调用其中处理函数

https://github.com/FULLK/risllkos/tree/main/Fullkenerl10


http://www.ppmy.cn/embedded/20332.html

相关文章

GraspNet-1Billion 论文阅读

文章目录 GraspNet-1Billion总体数据集评价指标网络pointnet:Approach Network:Operation Network:Tolerance Network 摘要相关工作基于深度学习的抓取预测算法抓取数据集点云深度学习 GraspNet-1Billion CVPR2020 上海交大 论文和数据集地址&#xff1…

Python基础12-爬虫抓取网页内容

在本文中,我们将学习如何使用 Python 的 requests 和 BeautifulSoup 库进行网页抓取。我们将从基本的网页请求开始,逐步扩展到更高级的主题,如处理分页、AJAX 请求、正则表达式和异步抓取。 1. 使用 requests 获取网页 要检索网页的内容&am…

使用Unity扫描场景内的二维码,使用插件ZXing

使用Unity扫描场景内的二维码,使用插件ZXing 使用Unity扫描场景内的二维码,ZXing可能没有提供场景内扫描的方法,只有调用真实摄像机扫描二维码的方法。 实现的原理是:在摄像机上添加脚本,发射射线,当射线打…

PeLK: 大卷积核强势回归,高达101 × 101,提出了外围卷积

paper:https://arxiv.org/pdf/2403.07589 code:暂无 目录 0. 摘要 1. 引言 2. 相关工作 2.1. Large Kernel Convolutional Networks 2.2. Peripheral Vision for Machine Learning 3. 密集卷积优于条纹卷积 4. 参数高效的大核卷积神经网络 4.1. …

【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …

前端框架编译器之模板编译

编译原理概述 编译原理:是计算机科学的一个分支,研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言:Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码:机器码、汇…

bayesplot|分享一个可视化贝叶斯模型的R包

1.bayesplot介绍 该包主要用于贝叶斯模型的可视化分析,提供了一系列工具来帮助评估、理解和诊断贝叶斯模型。这个包特别适用于与 Stan 以及其他提供 MCMC 样本的软件如 JAGS 和 BUGS 的模型输出。 后验分布图:包括密度图、直方图和区间图,用于展示模型…

vscode连接远程Linux服务器时,没有权限新建文件夹或者文件

参考链接: VS code 保存或新建文件没有权限的问题 vscode连接远程Linux服务器时,没有权限新建文件夹或者文件: 用一条命令解决: sudo chown -R myuser /path/to/foldermyuser是当前用户名, /path/to/folder是 需要操…