1 use core::{ptr::null_mut, sync::atomic::{AtomicBool, Ordering}}; 2 3 use alloc::sync::Arc; 4 5 use crate::{ 6 exception::softirq::{SoftirqNumber, SoftirqVec, softirq_vectors}, 7 include::bindings::bindings::video_refresh_framebuffer, 8 }; 9 10 #[derive(Debug)] 11 pub struct VideoRefreshFramebuffer{ 12 running: AtomicBool 13 } 14 15 impl SoftirqVec for VideoRefreshFramebuffer { 16 fn run(&self) { 17 if self.set_run() == false{ 18 return; 19 } 20 21 unsafe { 22 video_refresh_framebuffer(null_mut()); 23 } 24 25 self.clear_run(); 26 } 27 } 28 impl VideoRefreshFramebuffer { 29 pub fn new() -> VideoRefreshFramebuffer { 30 VideoRefreshFramebuffer { 31 running: AtomicBool::new(false) 32 } 33 } 34 35 fn set_run(&self) -> bool { 36 let x = self 37 .running 38 .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed); 39 if x.is_ok() { 40 return true; 41 } else { 42 return false; 43 } 44 } 45 46 fn clear_run(&self) { 47 self.running.store(false, Ordering::Release); 48 } 49 } 50 51 pub fn register_softirq_video() { 52 // kdebug!("register_softirq_video"); 53 let handler = Arc::new(VideoRefreshFramebuffer::new()); 54 softirq_vectors() 55 .register_softirq(SoftirqNumber::VideoRefresh, handler) 56 .expect("register_softirq_video run failed"); 57 } 58 // ======= 以下为给C提供的接口,video重构完后请删除 ======= 59 #[no_mangle] 60 pub extern "C" fn rs_register_softirq_video() { 61 register_softirq_video(); 62 } 63