mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-10 08:06:48 +00:00
实现了定时任务队列
This commit is contained in:
parent
b75504c0e5
commit
232d793627
@ -52,6 +52,7 @@ void HPET_handler(uint64_t number, uint64_t param, struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
case 0: // 定时器0中断
|
case 0: // 定时器0中断
|
||||||
++timer_jiffies;
|
++timer_jiffies;
|
||||||
|
if (container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list)->expire_jiffies <= timer_jiffies) // 若当前时间比定时任务的时间间隔大,则进入中断下半部
|
||||||
set_softirq_status(TIMER_SIRQ);
|
set_softirq_status(TIMER_SIRQ);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,14 +1,81 @@
|
|||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include<common/kprint.h>
|
#include <common/kprint.h>
|
||||||
#include <exception/softirq.h>
|
#include <exception/softirq.h>
|
||||||
|
#include <mm/slab.h>
|
||||||
|
|
||||||
|
void test_timer()
|
||||||
|
{
|
||||||
|
printk_color(ORANGE, BLACK, "(test_timer)");
|
||||||
|
}
|
||||||
|
|
||||||
void timer_init()
|
void timer_init()
|
||||||
{
|
{
|
||||||
timer_jiffies = 0;
|
timer_jiffies = 0;
|
||||||
|
timer_func_init(&timer_func_head, NULL, NULL, -1UL);
|
||||||
register_softirq(0, &do_timer_softirq, NULL);
|
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);
|
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);
|
||||||
|
}
|
@ -9,3 +9,41 @@ uint64_t volatile timer_jiffies = 0; // 系统时钟计数
|
|||||||
void timer_init();
|
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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,16 +43,15 @@ void do_softirq()
|
|||||||
{
|
{
|
||||||
|
|
||||||
sti();
|
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_vector[i].action(softirq_vector[i].data);
|
||||||
softirq_status &= (~(1<<i));
|
softirq_status &= (~(1 << i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cli();
|
cli();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,5 +60,3 @@ void softirq_init()
|
|||||||
softirq_status = 0;
|
softirq_status = 0;
|
||||||
memset(softirq_vector, 0, sizeof(struct softirq_t) * MAX_SOFTIRQ_NUM);
|
memset(softirq_vector, 0, sizeof(struct softirq_t) * MAX_SOFTIRQ_NUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,6 +167,9 @@ void system_initialize()
|
|||||||
mm_init();
|
mm_init();
|
||||||
|
|
||||||
acpi_init();
|
acpi_init();
|
||||||
|
|
||||||
|
for (int i = 0; i < 1e7; ++i)
|
||||||
|
;
|
||||||
// 初始化中断模块
|
// 初始化中断模块
|
||||||
irq_init();
|
irq_init();
|
||||||
softirq_init();
|
softirq_init();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user