mod.rs 1.5 KB

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