20211301 学习笔记8
教材知识点总结
5.1硬件定时器
-
定时器:时钟源和可编程计数器组成的硬件设备
-
时钟源:晶体振荡器,产生周期性电信号
-
定时器中断:计数减到0
5.2 个人计算机定时器
-
实时时钟:RTC,小型备用电池供电,PC关机也能持续运行,提供时间和日期
-
可编程间隔定时器:PIT,与CPU分离的一个硬件定时器
-
多核CPU中的本地定时器:多核CPU中,每个核都是一个独立的处理器,有自己的本地定时器,由CPU时钟驱动
-
高分辨率定时器:时间戳定时器(TSC)。由系统时钟驱动,通过寄存器读取,不同系统主板的时钟频率可能不同,TSC不适合作为实时设备
5.3 CPU操作
- 每个CPU都有一个程序计数器PC,也称为指针IP,以及一个标志或状态寄存器SR,一个堆栈指针SP和几个通用寄存器,PC指向内存中要执行的下一条指令时,SR包含CPU的当前状态
-
异常(陷阱):错误状态,由于无效地址、非法指令、越权
-
中断:I/O设备或协处理器发送给CPU的外部信号,请求CPU服务
5.4 中断处理
-
中断控制器:外部设备的中断被馈送到中断控制器的预定义输入行,按优先级对中断输入排序,并将最高优先级的中断作为中断请求
-
中断向量:对于每个中断,生成一个唯一编号
-
中断向量表:获取中断向量号后,CPU用它作为内存中中断向量表中的条目索引
-
中断处理程序:条目包含一个指向~的入口地址来实际处理中断
5.5 时钟服务函数
-
timezone已经过期,应设置为NULL
-
系统调用:
-
settimeofday系统调用
-
time系统调用
time_t time(time_t*t)
-
times系统调用
-
data:打印或设置系统日期和时间
-
time:报告进程在用户模式和系统模式下的执行时间和总时间
-
hwclock:查询并设置硬件时钟,也可以通过BIOS来完成
5.6 间隔定时器
-
三种类型:虚拟时钟
-
setitimer():系统调用创建
-
getitimer():系统调用返回间隔定时器状态
-
函数setitimer():用当前值填充,指定的定时器在下次到期之前剩余的时间
-
函数getitimer():指定定时器设置为new_value的值
-
示例:
代码实现
- 通过settimeofday设置系统时间
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int main() {
struct timeval tv;
// 设置要设置的时间,这里假设要设置为2023年11月5日 12:00:00
tv.tv_sec = 1735615200; // 时间戳表示的秒数
tv.tv_usec = 0; // 微秒数
// 调用 settimeofday 函数设置系统时间
if (settimeofday(&tv, NULL) == -1) {
perror("settimeofday");
return 1;
}
printf("系统时间已设置成功!\n");
return 0;
}
- time系统调用示例
#include<stdio.h>
#include<time.h>
time_t start,end;
int main()
{
int i;
start = time(NULL);
printf("start=%ld\n",start);
for (i=0;i<123456789;i++);
end = time(NULL);
printf("end =%ld time = %ld\n",end,end-start);
}
苏格拉底提问
-
硬件计时器:
-
时钟服务函数: