从零开始操作系统-08:计时器

news2024/11/17 23:48:27

这一节主要主要是计时器。

所需要的文件在Github:https://github.com/yongkangluo/Ubuntu20.04OS/tree/main/Files/Lec7-ExternalInterrupt

计时器:

可编程间隔计时器:PIT(Programmalbe Interval Timer)8254

使用APIC自带的Timer:
更高精度并且能对CUP单独设置;

概述而言就是:
使用 两个Count来做计时:
FEE0 0380H :Initial Count;
FEE0 0390H :Current Count

if(ICR){
	do{
		CCR = ICR;
		while(CCR--);
		Interrput;
	} while(Timer Model)
}

计数器的行为设置:
在这里插入图片描述

手动测量频率
使用一个固定已知频率的时钟做参考:
Lapic 计时器发生中断时,经过了多少的间隔:
F t i m e r = F C P U / k I C R / F t i m e r = t / F R T C F_{timer} = F_{CPU} / k\\ ICR / F_{timer} = t / F_{RTC} Ftimer=FCPU/kICR/Ftimer=t/FRTC
使用CPU来计算是不准确的,可能存在超频的可能。所以需要用手动测量。使用主板上的COMS来作为时间参考。

步骤如下:

  1. 安装RTC和Lapic Timer 的临时中断服务例程
  2. 配置RTC的频率(1024赫兹)
  3. 打开中断
  4. 写入ICR
  5. PIE置位
  6. 阻塞
  7. 党LAPIC Timer触发之后,计算频率并关闭RTC
  8. 清楚临时例程
Code
void
timer_init(uint32_t frequency)
{
    timer_init_context();
    cpu_disable_interrupt();
    // 配置LAPIC中的中断寄存器; One shot, 中断号是202
    apic_write_reg(APIC_TIMER_LVT,
                   LVT_ENTRY_TIMER(APIC_TIMER_IV, LVT_TIMER_ONESHOT));
    // Time Driver设置为64
    apic_write_reg(APIC_TIMER_DCR, APIC_TIMER_DIV64);
    timer_ctx->base_frequency = 0;
    rtc_counter = 0;
    apic_timer_done = 0;
    // 安装APIC对一个的中断程序
    intr_subscribe(APIC_TIMER_IV, temp_intr_routine_apic_timer);
    intr_subscribe(RTC_TIMER_IV, temp_intr_routine_rtc_tick);
    // 开启RTC计时器
    rtc_enable_timer();    
    // 在APIC中写一个很大的常数                              
    apic_write_reg(APIC_TIMER_ICR, APIC_CALIBRATION_CONST); 
    // 开启中断
    cpu_enable_interrupt();
    wait_until(apic_timer_done);
    assert_msg(timer_ctx->base_frequency, "Fail to initialize timer (NOFREQ)");
    kprintf(KINFO "Base frequency: %u Hz\n", timer_ctx->base_frequency);
    timer_ctx->running_frequency = frequency;
    timer_ctx->tick_interval = timer_ctx->base_frequency / frequency;
    
    intr_unsubscribe(APIC_TIMER_IV, temp_intr_routine_apic_timer);
    intr_unsubscribe(RTC_TIMER_IV, temp_intr_routine_rtc_tick);
    apic_write_reg(APIC_TIMER_LVT,
                   LVT_ENTRY_TIMER(APIC_TIMER_IV, LVT_TIMER_PERIODIC));
    intr_subscribe(APIC_TIMER_IV, timer_update);
    apic_write_reg(APIC_TIMER_ICR, timer_ctx->tick_interval);
}

在这里插入图片描述

方法主要跟着B站Up主做的,B站视频链接在:https://www.bilibili.com/video/BV1jL4y1s7X6/?spm_id_from=333.788&vd_source=72ce864f895f9fbf22b81450817f2875

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

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

相关文章

Windows下文本生成图像AI画图尝鲜体验

工具库 transformers 的开源方 Hugging Face 发布了一个专注于 diffuser 模型的开源库,我们可以基于它,仅仅通过几行代码就开始生成自己的艺术作画。不过这个 diffuser 库是一个基础实现版本,训练和学习的数据也没有 OpenAI 的 DALL-E2、谷歌…

学习docker记录(三)

使用volume 创建一个数据卷 docker volume create test-first-volume创建完之后,可以在 /var/lib/docker/volumes/ 目录下看见新建了一个 test-first-volume文件夹 在Dockerfile中 volume的指定的目录是: /www/wwwroot/pictureManager/deploy原本以为…

三步教你快速入手一个新产品的测试

初入一家公司,当一个全新的产品摆在你的面前,你会如何快速入手呢? 虽说实践是熟悉系统的第一要素,但我们需要静静思考一下。 我是谁:QA 我在哪:产品组 我要做什么:保质量 有多少来熟悉&…

LeetCode 320 周赛

总结 本场周赛太拉跨了!T1做完后,T2一直被卡住,还好后面暂时跳过了T2去做T3,T3做完后又回过头来继续调试T2。在最后10分钟调过了(虽然后来看运行时长达到了1400ms(差点就过不了))。 …

vue3 斗兽棋游戏

近来掘金举办前端比赛,所以写了一个小游戏参加,而且熟悉一下vue3,写了一下游戏,思来想去就写了一个斗兽棋游戏。 欢迎去给我加油 点赞评论收藏 ,试玩地址 游戏地址 童年斗兽棋 - 码上掘金 https://code.juejin.cn/pen/716…

四川水泥杂志四川水泥杂志社四川水泥编辑部2022年第11期目录

水泥与混凝土 外加剂含固量对混凝土性能影响的分析 金世鑫; 1-4 《四川水泥》投稿:cnqikantg126.com 粉煤灰在干混砂浆中的应用研究 方光旭;古再努尔依明;杨博;陈南希;张琰琦; 5-7 浅析透光混凝土在建筑空间中的应用 李嘉;李嘉鑫; 8-10 研究与探讨…

c++ 智能指针 shared_ptr

C 智能指针 shared_ptr 详解与示例_码农小明的博客-CSDN博客_shared_ptr 一、简介 shared_ptr 是c11的智能类,可以在任何地方都不使用的时候自动删除和相关指针,从而彻底消除内存泄漏和指针悬空的问题。 她遵循共享所有权,即不同的shared_pt…

CVPR‘15 Joint action recognition and pose estimation from video

任务:action recognition and pose estimation 思路:对动作和姿态进行统一建模,将动作分成姿态,再将姿态分成part,学习三种level特征,通过动态规划有效的推断动作标签和姿态。 方法:统一建模…

通俗理解计算机操作系统的作用

“操作系统”,简称“OS”,是一个包含多个部分和多个目标的大型程序。 它的第一项工作是在你第一次打开计算机时启动并运行计算机。它的另一项工作是启动和结束应用程序,并给每个程序一个运行时间。它是那台计算机上所有其他程序的“老大”。当…

【App自动化测试】(一)Appium和移动端自动化

目录1. 目前mobile自动化解决方案1.1 iOS和Android 测试工具1.2 自动化工具的选择1.3 选择自动化工具的考虑因素2. Appium介绍2.1 Appium介绍2.2 多架构支持2.3 推荐Appium的理由2.4. Appium框架介绍2.4.1 Appium引擎列表2.4.2 Appium设计理念前言: 本文为在霍格沃兹…

多智能体强化学习MARL的概念和框架

1.多智能体强化学习 系统里的agents数量大于1,agents彼此之间不是独立的 每个agent的动作都能影响到下一个状态每个agent都能影响到其他agent 除非agent之间是独立的,否则单一agent的RL方法不适合MARL 2.MARL的类型 Fully cooperative(完…

智慧医院智慧医疗解决方案

IBM于2009年提出“智慧医疗”这一理念。作为“智慧的地球”战略的重要组成部分,致力于构建一个“以病人为中心”的医疗服务体系。通过在服务成本、服务质量和服务可及性三方面取得一个良好的平衡,从而优化医疗实践成果、创新医疗服务模式和业务市场&…

Unity插件Obi.Rope详解

前言 Obi.Rope插件的使用方法 绳子的创建 创建后的Obi Rope,Inspector面板如下所示,组件比较多,其中Obi Solver是绳子,布料,液体等的总处理器,也可以单独分出来此组件为一个独立的游戏对象。 绳子的形状…

风控标签体系的使用与介绍

随着大数据技术的深入研究与应用,企业的专注点日益聚焦于怎样利用大数据来为精细化运营及精准营销服务,进而深入挖掘潜在的商业价值。于是,用户画像的概念也就应运而生。 在推荐系统中, 【推荐系统内容,详情可以关注番…

弘玑Cyclone2022产品发布会:全新上线智能文档处理交互平台——尚书台

近日,在弘玑Cyclone“智无边界,数字未来”发布会上,弘玑Cyclone2022年超级自动化系列产品全新亮相,首席产品官贾岿博士带领产品团队以创新技术对新时代语境下的数字生产力进行了全新解读。 上期为大家介绍了人人可用的数字化工作…

Java工具库Guava的数学运算常用方法示例代码

场景 Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验: Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验_霸道流氓气质的博客-CSDN博客_guava 校验 为什么使用 Guava Math 1、Guava Math 针对各种不常见…

web网页设计期末课程大作业:美食餐饮文化主题网站设计——中华美德6页面HTML+CSS+JavaScript

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

MCE | 表观遗传:YTHDF蛋白调节 m6A-RNA

近期,美国康奈尔大学 Samie R. Jaffrey 研究组在 Cell 上发表了题为 “A Unified Model for the Function of YTHDF Proteins in Regulating m6A-Modified mRNA” 的研究,揭示了 YTHDF 蛋白调节 m6A 修饰的 mRNA 的功能统一模型。与“不同的 m6A 位点结合…

反向传播——机器学习

目录 一、实验内容 二、实验过程 1、算法思想 2、算法原理 3、算法分析 三、源程序代码 四、运行结果及分析 五、实验总结 一、实验内容 掌握线性反向传播的原理;掌握线性反向传播的算法Python实现;熟悉非线性反向传播的原理;掌握非线性…

图的存储方式

一、邻接矩阵 图的邻接矩阵存储方式就是用两个数组来表示图。一个一维数组存储图的顶点信息,另一个二维数组存储图中边的信息。 对于无向图来说,我们可以用1表示两顶点相连,用0表示两顶点不相连。任意顶点的度为邻接矩阵中该节点的行或列的…