rt.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: rt.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2020-06-18
  7. 功能说明: 实时微系统。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "rt.h"
  14. #include "debug_print.h"
  15. int g_clock_mode;
  16. int g_clock_mode_gps;
  17. /*------------------------------- 宏定义 --------------------------------------
  18. */
  19. /*------------------------------ 类型结构 -------------------------------------
  20. */
  21. /*------------------------------ 全局变量 -------------------------------------
  22. */
  23. struct init_t g_rt_init_func[] =
  24. {
  25. // RT_CLIB,不需要初始化
  26. // RT_FILE,不需要初始化
  27. // RT_IF,不需要初始化
  28. // RT_INTS,不需要初始化
  29. // RT_SOFT_IRQ,不需要初始化
  30. // RT_FIFO,不需要初始化
  31. {rt_printf_init, ERR_CODE_INIT_SOFTWARE}, // RT_PRINTF
  32. {env_init, ERR_CODE_ENV},
  33. {rt_console_init, ERR_CODE_INIT_SOFTWARE}, // RT_CONSOLE
  34. // 时钟设备由与设备操作相关的代码实现{clk_init,ERR_CODE_RTC}, // RT_CLOCK
  35. {rt_socket_init, ERR_CODE_INIT_SOFTWARE},
  36. {rt_err_init, ERR_CODE_INIT_SOFTWARE},
  37. };
  38. #define RT_INIT_NUM ((int)(sizeof(g_rt_init_func) / sizeof(g_rt_init_func[0])))
  39. INIT_FUNC g_rt_exit_func[] =
  40. {
  41. rt_err_exit,
  42. // clk_exit,
  43. rt_console_exit,
  44. rt_printf_exit,
  45. // rt_mq_exit,
  46. env_exit
  47. // rt_ints_exit
  48. };
  49. #define RT_EXIT_NUM ((int)(sizeof(g_rt_exit_func) / sizeof(INIT_FUNC)))
  50. /*------------------------------ 函数声明 -------------------------------------
  51. */
  52. /*------------------------------ 外部函数 -------------------------------------
  53. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  54. */
  55. int rt_init(void)
  56. {
  57. int i, ret;
  58. for (i = 0; i < RT_INIT_NUM; i++)
  59. {
  60. ret = g_rt_init_func[i].func();
  61. if (ret != 0)
  62. {
  63. rt_err_set(g_rt_init_func[i].err_code, 0);
  64. dp_err_n_c("rt_init err(i=%d,ret=%d)", i, ret);
  65. return ret;
  66. }
  67. }
  68. return 0;
  69. }
  70. int rt_exit(void)
  71. {
  72. int i, ret;
  73. for (i = 0; i < RT_EXIT_NUM; i++)
  74. {
  75. ret = g_rt_exit_func[i]();
  76. if (ret != 0)
  77. {
  78. dp_err_n_c("rt_exit err(i=%d,ret=%d)", i, ret);
  79. }
  80. }
  81. return 0;
  82. }
  83. /*------------------------------ 内部函数 -------------------------------------
  84. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  85. */
  86. /*------------------------------ 测试函数 -------------------------------------
  87. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  88. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  89. */
  90. /*------------------------------ 文件结束 -------------------------------------
  91. */