mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
实现了定时任务队列
This commit is contained in:
parent
b75504c0e5
commit
232d793627
@ -52,7 +52,8 @@ void HPET_handler(uint64_t number, uint64_t param, struct pt_regs *regs)
|
||||
{
|
||||
case 0: // 定时器0中断
|
||||
++timer_jiffies;
|
||||
set_softirq_status(TIMER_SIRQ);
|
||||
if (container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list)->expire_jiffies <= timer_jiffies) // 若当前时间比定时任务的时间间隔大,则进入中断下半部
|
||||
set_softirq_status(TIMER_SIRQ);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1,14 +1,81 @@
|
||||
#include "timer.h"
|
||||
#include<common/kprint.h>
|
||||
#include <common/kprint.h>
|
||||
#include <exception/softirq.h>
|
||||
#include <mm/slab.h>
|
||||
|
||||
void test_timer()
|
||||
{
|
||||
printk_color(ORANGE, BLACK, "(test_timer)");
|
||||
}
|
||||
|
||||
void timer_init()
|
||||
{
|
||||
timer_jiffies = 0;
|
||||
timer_func_init(&timer_func_head, NULL, NULL, -1UL);
|
||||
register_softirq(0, &do_timer_softirq, NULL);
|
||||
|
||||
struct timer_func_list_t *tmp = (struct timer_func_list_t *)kmalloc(sizeof(struct timer_func_list_t), 0);
|
||||
timer_func_init(tmp, &test_timer, NULL, 5);
|
||||
timer_func_add(tmp);
|
||||
|
||||
kdebug("timer func initialized.");
|
||||
}
|
||||
|
||||
void do_timer_softirq(void* data)
|
||||
void do_timer_softirq(void *data)
|
||||
{
|
||||
|
||||
struct timer_func_list_t *tmp = container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list);
|
||||
|
||||
while ((!list_empty(&timer_func_head.list)) && (tmp->expire_jiffies <= timer_jiffies))
|
||||
{
|
||||
timer_func_del(tmp);
|
||||
tmp->func(tmp->data);
|
||||
kfree(tmp);
|
||||
tmp = container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list);
|
||||
}
|
||||
|
||||
printk_color(ORANGE, BLACK, "(HPET%ld)", timer_jiffies);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化定时功能
|
||||
*
|
||||
* @param timer_func 队列结构体
|
||||
* @param func 定时功能处理函数
|
||||
* @param expire_jiffies 定时时长
|
||||
*/
|
||||
void timer_func_init(struct timer_func_list_t *timer_func, void (*func)(void *data), void *data, uint64_t expire_jiffies)
|
||||
{
|
||||
list_init(&timer_func->list);
|
||||
timer_func->func = func;
|
||||
timer_func->data = data,
|
||||
timer_func->expire_jiffies = timer_jiffies + expire_jiffies;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将定时功能添加到列表中
|
||||
*
|
||||
* @param timer_func 待添加的定时功能
|
||||
*/
|
||||
void timer_func_add(struct timer_func_list_t *timer_func)
|
||||
{
|
||||
struct timer_func_list_t *tmp = container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list);
|
||||
|
||||
if (list_empty(&timer_func_head.list) == false)
|
||||
while (tmp->expire_jiffies < timer_func->expire_jiffies)
|
||||
tmp = container_of(list_next(&tmp->list), struct timer_func_list_t, list);
|
||||
|
||||
list_add(&tmp->list, &(timer_func->list));
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将定时功能从列表中删除
|
||||
*
|
||||
* @param timer_func
|
||||
*/
|
||||
void timer_func_del(struct timer_func_list_t *timer_func)
|
||||
{
|
||||
list_del(&timer_func->list);
|
||||
}
|
@ -8,4 +8,42 @@ uint64_t volatile timer_jiffies = 0; // 系统时钟计数
|
||||
|
||||
void timer_init();
|
||||
|
||||
void do_timer_softirq(void* data);
|
||||
void do_timer_softirq(void* data);
|
||||
|
||||
/**
|
||||
* @brief 定时功能队列
|
||||
*
|
||||
*/
|
||||
struct timer_func_list_t
|
||||
{
|
||||
struct List list;
|
||||
uint64_t expire_jiffies;
|
||||
void (*func)(void* data);
|
||||
void* data;
|
||||
}timer_func_head;
|
||||
|
||||
/**
|
||||
* @brief 初始化定时功能
|
||||
*
|
||||
* @param timer_func 队列结构体
|
||||
* @param func 定时功能处理函数
|
||||
* @param data 传输的数据
|
||||
* @param expire_jiffies 定时时长
|
||||
*/
|
||||
void timer_func_init(struct timer_func_list_t * timer_func, void (*func)(void*data), void*data,uint64_t expire_jiffies);
|
||||
|
||||
/**
|
||||
* @brief 将定时功能添加到列表中
|
||||
*
|
||||
* @param timer_func 待添加的定时功能
|
||||
*/
|
||||
void timer_func_add(struct timer_func_list_t* timer_func);
|
||||
|
||||
/**
|
||||
* @brief 将定时功能从列表中删除
|
||||
*
|
||||
* @param timer_func
|
||||
*/
|
||||
void timer_func_del(struct timer_func_list_t* timer_func);
|
||||
|
||||
|
||||
|
@ -37,21 +37,20 @@ void unregister_softirq(uint32_t irq_num)
|
||||
|
||||
/**
|
||||
* @brief 软中断处理程序
|
||||
*
|
||||
*
|
||||
*/
|
||||
void do_softirq()
|
||||
{
|
||||
|
||||
|
||||
sti();
|
||||
for(uint32_t i=0;i<MAX_SOFTIRQ_NUM&&softirq_status;++i)
|
||||
for (uint32_t i = 0; i < MAX_SOFTIRQ_NUM && softirq_status; ++i)
|
||||
{
|
||||
if(softirq_status&(1<<i))
|
||||
if (softirq_status & (1 << i))
|
||||
{
|
||||
softirq_vector[i].action(softirq_vector[i].data);
|
||||
softirq_status &= (~(1<<i));
|
||||
softirq_status &= (~(1 << i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
cli();
|
||||
}
|
||||
@ -61,5 +60,3 @@ void softirq_init()
|
||||
softirq_status = 0;
|
||||
memset(softirq_vector, 0, sizeof(struct softirq_t) * MAX_SOFTIRQ_NUM);
|
||||
}
|
||||
|
||||
|
||||
|
@ -167,6 +167,9 @@ void system_initialize()
|
||||
mm_init();
|
||||
|
||||
acpi_init();
|
||||
|
||||
for (int i = 0; i < 1e7; ++i)
|
||||
;
|
||||
// 初始化中断模块
|
||||
irq_init();
|
||||
softirq_init();
|
||||
|
Loading…
x
Reference in New Issue
Block a user