From eed9077675c75e016217a38bf288b90b89a785ef Mon Sep 17 00:00:00 2001 From: fslongjin Date: Tue, 26 Jul 2022 16:16:25 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20=E5=BD=93=E8=BF=9B=E7=A8=8B=E5=9C=A8?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E6=80=81=E9=80=80=E5=87=BA=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=B1=8F=E5=B9=95=E5=88=B7=E6=96=B0=E8=BD=AF=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=E4=BC=9A=E4=B8=80=E7=9B=B4=E4=BF=9D=E6=8C=81=E5=9C=A8pending?= =?UTF-8?q?=E7=9A=84=E7=8A=B6=E6=80=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/driver/timers/HPET/HPET.c | 7 +++++++ kernel/driver/video/video.c | 8 ++------ kernel/exception/softirq.c | 5 +++++ kernel/exception/softirq.h | 1 + 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/kernel/driver/timers/HPET/HPET.c b/kernel/driver/timers/HPET/HPET.c index 1575fc0bc..a038afe26 100644 --- a/kernel/driver/timers/HPET/HPET.c +++ b/kernel/driver/timers/HPET/HPET.c @@ -1,5 +1,6 @@ #include "HPET.h" #include +#include #include #include #include @@ -74,6 +75,12 @@ void HPET_handler(uint64_t number, uint64_t param, struct pt_regs *regs) if (timer_jiffies >= video_refresh_expire_jiffies || (video_last_refresh_pid != current_pcb->pid)) { raise_softirq(VIDEO_REFRESH_SIRQ); + // 超过130ms仍未刷新完成,则重新发起刷新(防止由于进程异常退出导致的屏幕无法刷新) + if (unlikely(timer_jiffies >= (video_refresh_expire_jiffies + (1 << 17)))) + { + video_refresh_expire_jiffies = timer_jiffies + (1 << 20); + clear_softirq_pending(VIDEO_REFRESH_SIRQ); + } } break; diff --git a/kernel/driver/video/video.c b/kernel/driver/video/video.c index 60657d020..b60ac2a08 100644 --- a/kernel/driver/video/video.c +++ b/kernel/driver/video/video.c @@ -75,12 +75,8 @@ void init_frame_buffer(bool level) */ void video_refresh_framebuffer(void *data) { - // 暂时设置一个很大的值作为屏障,防止二次进入该区域(造成#GP) - video_refresh_expire_jiffies = timer_jiffies + 100000; - video_last_refresh_pid = current_pcb->pid; - + video_refresh_expire_jiffies = cal_next_n_ms_jiffies(REFRESH_INTERVAL << 1); memcpy((void *)sc_info.fb_vaddr, (void *)sc_info.double_fb_vaddr, (sc_info.length << 2)); - video_refresh_expire_jiffies = cal_next_n_ms_jiffies(REFRESH_INTERVAL); } /** @@ -103,7 +99,7 @@ int video_init(bool level) // timer_func_init(tmp, &video_refresh_framebuffer, NULL, 10*REFRESH_INTERVAL); // timer_func_add(tmp); register_softirq(VIDEO_REFRESH_SIRQ, &video_refresh_framebuffer, NULL); - + video_refresh_expire_jiffies = cal_next_n_ms_jiffies(10 * REFRESH_INTERVAL); raise_softirq(VIDEO_REFRESH_SIRQ); diff --git a/kernel/exception/softirq.c b/kernel/exception/softirq.c index 846fb68e2..8f5a69283 100644 --- a/kernel/exception/softirq.c +++ b/kernel/exception/softirq.c @@ -106,6 +106,11 @@ void do_softirq() cli(); } +int clear_softirq_pending(uint32_t irq_num) +{ + clear_softirq_running(irq_num); +} + void softirq_init() { softirq_pending = 0; diff --git a/kernel/exception/softirq.h b/kernel/exception/softirq.h index 136f1794d..816d81e91 100644 --- a/kernel/exception/softirq.h +++ b/kernel/exception/softirq.h @@ -57,6 +57,7 @@ void unregister_softirq(uint32_t irq_num); void set_softirq_pending(uint64_t status); uint64_t get_softirq_pending(); +int clear_softirq_pending(uint32_t irq_num); /** * @brief 软中断处理程序 *