softirq.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /**
  2. * @file softirq.h
  3. * @author fslongjin (longjin@RinGoTek.cn)
  4. * @brief 软中断
  5. * @version 0.1
  6. * @date 2022-04-08
  7. *
  8. * @copyright Copyright (c) 2022
  9. *
  10. */
  11. #pragma once
  12. #include <common/glib.h>
  13. #define MAX_SOFTIRQ_NUM 64
  14. #define TIMER_SIRQ 0 // 时钟软中断号
  15. #define VIDEO_REFRESH_SIRQ 1 // 帧缓冲区刷新软中断
  16. /**
  17. * @brief 发起软中断
  18. *
  19. */
  20. #define raise_softirq(sirq_num) \
  21. do \
  22. { \
  23. set_softirq_status(1 << sirq_num); \
  24. } while (0);
  25. /**
  26. * @brief 清除软中断标志位(需要软中断处理程序手动调用)
  27. *
  28. */
  29. #define softirq_ack(sirq_num) \
  30. do \
  31. { \
  32. softirq_status &= (~(1 << sirq_num)); \
  33. } while (0);
  34. extern uint64_t softirq_status;
  35. struct softirq_t
  36. {
  37. void (*action)(void *data); // 软中断处理函数
  38. void *data;
  39. };
  40. struct softirq_t softirq_vector[MAX_SOFTIRQ_NUM] = {0};
  41. /**
  42. * @brief 软中断注册函数
  43. *
  44. * @param irq_num 软中断号
  45. * @param action 响应函数
  46. * @param data 响应数据结构体
  47. */
  48. void register_softirq(uint32_t irq_num, void (*action)(void *data), void *data);
  49. /**
  50. * @brief 卸载软中断
  51. *
  52. * @param irq_num 软中断号
  53. */
  54. void unregister_softirq(uint32_t irq_num);
  55. void set_softirq_status(uint64_t status);
  56. uint64_t get_softirq_status();
  57. /**
  58. * @brief 软中断处理程序
  59. *
  60. */
  61. void do_softirq();
  62. void softirq_init();