代码拉取完成,页面将自动刷新
#include "bootpack.h"
#define PIT_CTRL 0x0043
#define PIT_CNT0 0x0040
#define TIMER_FLAGS_ALLOC 1 //已配置状态
#define TIMER_FLAGS_USING 2 //定时器运行中
struct TIMERCTL timerctl;
void init_pit(void)
{
int i;
io_out8(PIT_CTRL, 0x34);
io_out8(PIT_CNT0, 0x9c);
io_out8(PIT_CNT0, 0x2e);
timerctl.count = 0;
timerctl.next = 0xffffffff; // 因为最初没有正在运行的定时器
timerctl.using = 0;
for( i =0 ;i < MAX_TIMER; i++ ){
timerctl.timers0[i].flags=0; // 未使用
}
return;
}
struct TIMER *timer_alloc(void)
{
int i;
for (i = 0; i < MAX_TIMER; i++) {
if (timerctl.timers0[i].flags == 0) {
timerctl.timers0[i].flags = TIMER_FLAGS_ALLOC;
return &timerctl.timers0[i];
}
}
return 0; // 没找到
}
void timer_free(struct TIMER *timer)
{
timer->flags=0;
return;
}
void timer_init(struct TIMER *timer,struct FIFO32 *fifo,int data)
{
timer->fifo = fifo;
timer->data = data;
return;
}
void timer_settime(struct TIMER *timer,unsigned int timeout)
{
int e, i, j;
timer->timeout = timeout + timerctl.count;
timer->flags = TIMER_FLAGS_USING;
e = io_load_eflags();
io_cli();
//搜索注册位置
for (i = 0; i < timerctl.using; i++) {
if (timerctl.timers[i]->timeout >= timer->timeout) {
break;
}
}
/* ����������炷 */
for (j = timerctl.using; j > i; j--) {
timerctl.timers[j] = timerctl.timers[j - 1];
}
timerctl.using ++;
// i号之后全部后移移位
timerctl.timers[i] = timer;
timerctl.next = timerctl.timers[0]->timeout;
io_store_eflags(e);
return;
}
void inthandler20(int *esp)
{
int i,j;
io_out8(PIC0_OCW2,0x60); // 将IRQ-00信号接受完了的信息通知给PIC
timerctl.count++; // 每秒自动增加1
if (timerctl.next > timerctl.count){
return;// 还不到下一个时刻,所以结束
}
for (i = 0; i < timerctl.using; i++) {
// timers的定时器都处于动作中,所以不确认flags
if (timerctl.timers[i]->timeout > timerctl.count) {
break;
}
// 超时
timerctl.timers[i]->flags = TIMER_FLAGS_ALLOC;
fifo32_put(timerctl.timers[i]->fifo, timerctl.timers[i]->data);
}
// 正好有i个定时器超时了,其余的进行移位
timerctl.using -= i;
for (j = 0; j < timerctl.using; j++) {
timerctl.timers[j] = timerctl.timers[i + j];
}
if (timerctl.using > 0) {
timerctl.next = timerctl.timers[0]->timeout;
} else {
timerctl.next = 0xffffffff;
}
return;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。