main.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /*************************************************************************
  2. * 版权所有:
  3. * 文件版本: V1.00
  4. * 文件名称: main.C主程序
  5. * 生成日期: 2008年8月8日
  6. * 作 者:
  7. * 功 能: 保护主函数处理,
  8. * 更新信息:
  9. * 更新日志1:
  10. * 日期:
  11. * 修改者:
  12. * 修改内容:
  13. * 修改原因:
  14. * 更新日志2:
  15. **************************************************************************/
  16. #include "head.h"
  17. #include "rt_printf.h"
  18. #include <sys/prctl.h>
  19. #include <unistd.h>
  20. #include <sys/syscall.h>
  21. // 系统秒,从程序启动时刻算起
  22. u32 g_tick_secs;
  23. // 系统重启定时器
  24. u32 g_restart_count;
  25. #if defined CPU_AM335X || defined CPU_FUXI
  26. extern bool SystemInit_finish_flag __attribute__((aligned(8)));
  27. #endif
  28. /********************************************************************
  29. 版权所有:
  30. 文件版本: V1.00
  31. 文件名称: main.c
  32. 生成日期: 2008年08月26日
  33. 作 者:
  34. 使用范围:
  35. 功 能:主函数
  36. 更新信息:
  37. 更新日志1:
  38. 修改者:
  39. 修改日期:
  40. 修改内容:
  41. 修改原因:
  42. *********************************************************************/
  43. int app_main (void *arg);
  44. int kernel_callback(void);
  45. int dt_cmd_rt_reset(void);
  46. int uart_test(void);
  47. int test_round(void);
  48. int ds18b20_init(void);
  49. int sntp_init(void);
  50. int rtc_test(void);
  51. int adc_test(void);
  52. int bkpt_disable(void);
  53. #ifdef CPU_FUXI
  54. uint32_t wdt_id_mainloop;
  55. extern int printf_e907_init(void);
  56. #endif
  57. void bkpt_isr(void)
  58. {
  59. rt_printf("x\r\n");
  60. }
  61. #if defined(CPU_AM335X)
  62. static void check_app_folder_recover(void)
  63. {
  64. //应用启动后,需要判断 /tmp/app_empty_flag 文件是否存在,如果存在,则说明这次启动 app 分区进行了恢复,你那边记录后把该文件删除掉。
  65. struct file * pfile = rt_file_open("/tmp/app_empty_flag",O_RDONLY ,0);
  66. if(IS_ERR(pfile))
  67. {
  68. ;
  69. }
  70. else
  71. {
  72. rt_printf("临时文件/tmp/app_empty_flag不存在,之前发生过app分区恢复操作.\r\n");
  73. soe_record_opt(EV_APP_FOLDER_RECOVER,0);
  74. rt_file_del("/tmp/app_empty_flag");
  75. }
  76. }
  77. #endif
  78. int app_main (void *unused)
  79. {
  80. int ret;
  81. uint64_t us0,us0_sec;
  82. // 将BKPT管脚设置为中断,防止由于EMC干扰,导致系统复位。
  83. #ifdef CPU_COLDFIRE
  84. bkpt_disable();
  85. rt_request_irq(12,4,bkpt_isr,"bkpt_isr");
  86. #endif
  87. //登记bsp回调函数
  88. rt_irq_level(0);
  89. #ifdef TMP_CHIP_DS18B20
  90. ds18b20_init(); //测温模块初始化,因为测温模块里面有个任务,所以放在这里初始
  91. #endif
  92. SystemInit();
  93. #ifdef CPU_FUXI
  94. SystemInit_finish_flag = true;
  95. #endif
  96. #ifdef CPU_FUXI
  97. printf_e907_init();
  98. #endif
  99. #ifdef RCD_STRAN_S
  100. _rcd_get_waveno(); /*装置地址要读出参数才有效*/
  101. #endif
  102. #ifndef CPU_FUXI
  103. watchdog_register_all();
  104. #endif
  105. dt_cmd_rt_reset();
  106. rt_stat_other_init(RT_STAT_BIG_LOOP,"主循环");
  107. rt_stat_other_init(1,"5ms_2");
  108. rt_stat_other_init(2,"5ms_3");
  109. rt_stat_other_init(3,"测量计算1");
  110. rt_stat_other_init(4,"测量计算2");
  111. rt_stat_other_init(5,"SOE保存");
  112. rt_stat_other_init(6,"临时测试");
  113. rt_stat_other_init(7,"主循环间隔");
  114. #ifdef SNTP_FUNC
  115. sntp_init();
  116. #endif
  117. {
  118. // 记录关键文件CRC
  119. char name[256];
  120. char log_info[128];
  121. sprintf(name,"上电完成。校验CRC:程序0x%04x, 资源表0x%04x, 板卡资源0x%04x, 通道配置0x%04x, 点表0x%04x。",
  122. m_CodeCrc,g_crc_rsc, g_crc_brd_res, g_crc_equ_cfg, g_crc_rectable);
  123. log_str_time(LOG_ERR,name,0,1);
  124. sprintf(log_info,"Device is powered on,crc:code=0x%04x,rsc=0x%04x,brd_res=0x%04x,equ_cfg=0x%04x,rectable=0x%04x",
  125. m_CodeCrc,g_crc_rsc, g_crc_brd_res, g_crc_equ_cfg, g_crc_rectable);
  126. load_hs_log_rcd(TYPE_DEV_RESTART,true,NULL,log_info,1);
  127. }
  128. ret = get_mt_port_proc();
  129. if(ret != 1) {
  130. close_inet_port();
  131. }
  132. #if defined(CPU_AM335X)
  133. check_app_folder_recover();
  134. #endif
  135. #ifdef CPU_FUXI
  136. // noted by sunxi: 经测试发现,装置运行10多分钟后,tmp文件里的rsc.bin和set_desc.bin会莫名消失。
  137. // 经分析得,伏羲系统会周期(十多分钟)删除掉tmp文件夹中的旧文件(rsc.bin和set_desc.bin 文件是在
  138. // 系统对时前产生的,所以时间默认比较早)。因此在这里统一对tmp文件夹的文件更新一下。
  139. system("touch /tmp/*");
  140. prctl(PR_SET_NAME, "app_main_loop");
  141. #endif
  142. #ifdef RT_THREAD_DEBUG
  143. rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
  144. "app_main_loop", (int)getpid(), (int)syscall(SYS_gettid));
  145. #endif
  146. rt_printf("主循环启动...\r\n");
  147. #if defined(CPU_AM335X)
  148. watchdog_unregister_module();
  149. #endif
  150. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  151. // 复位所有子板
  152. can_app_reset(0);
  153. #endif
  154. #if defined(CAN_SLAVE_BOARD)
  155. // 复位所有子板
  156. can_app_reset(0);
  157. #endif
  158. #ifdef CPU_FUXI
  159. int rc = watchdog_add_item("mainloop", &wdt_id_mainloop,60);
  160. if(rc != 0) {
  161. printf("can not add mainloop task to wdt\r\n");
  162. return -1;
  163. }
  164. #endif
  165. us0_sec = bsp_ustimer_get_origin();
  166. while(1)
  167. {
  168. us0 = bsp_ustimer_get_origin();
  169. // test_round();
  170. // uart_test();
  171. // flash_test();
  172. // adc_test();
  173. // gps_test();
  174. // dido_test();
  175. // rtc_test();
  176. #ifdef CPU_FUXI
  177. msleep(100);
  178. // shm_comm_test();
  179. #endif
  180. // 系统的tick秒
  181. if(us0 - us0_sec > USTIMER_SEC)
  182. {
  183. g_tick_secs++;
  184. us0_sec += USTIMER_SEC;
  185. if(g_restart_count)
  186. {
  187. g_restart_count--;
  188. if(g_restart_count == 0)
  189. {
  190. rt_printf("装置重启\r\n");
  191. watchdog_reset_cpu(2); //装置复位
  192. }
  193. }
  194. }
  195. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  196. equ_check_period();
  197. can_task();
  198. #else
  199. #ifdef CAN_SLAVE_BOARD
  200. can_task();
  201. #endif
  202. #endif
  203. #ifdef CPU_FUXI
  204. sys_time_check();
  205. #endif
  206. rt_err_app();
  207. soe_save();
  208. IECCommTask();
  209. Maintain_Applay();
  210. net_debug_app();
  211. IEC104_Ether_App();
  212. FA_status_write();
  213. sec_app();
  214. clk_app();
  215. AppPolling(); // 设备状态处理,如点灯等
  216. create_set_file();
  217. #ifdef TMP_CHIP_AHT20
  218. aht20_task();
  219. #endif
  220. #ifdef METERING_ENERGY
  221. metering_yc_refresh();
  222. DD_Calc();
  223. #endif
  224. #ifdef FUNC_DRIVE
  225. quit_drive();
  226. #endif
  227. #ifdef FUNC_RESET_EQU
  228. equ_PowerRest();
  229. #endif
  230. // 喂主循环软件狗
  231. watchdog_feed_mainloop();
  232. //统计大循环时间
  233. rt_stat_other_in(RT_STAT_BIG_LOOP,bsp_ustimer_get_duration(us0)/USTIMER_US);
  234. #ifdef LINUX_KERNEL_APP
  235. kernel_callback();
  236. #endif
  237. //us0 = ustimer_get_origin();
  238. rt_stat_other_in(7,bsp_ustimer_get_duration(us0)/USTIMER_US);
  239. }
  240. #ifdef CPU_FUXI
  241. watchdog_remove_item(wdt_id_mainloop);
  242. #endif
  243. return 0;
  244. }
  245. #if 0 // sunxi 20191018
  246. #ifndef LIB_61850_SW
  247. int gi_platelib_state=2;
  248. int app_goose_init(int fn)
  249. {
  250. return 0;
  251. }
  252. void app_goose_pub_data_handle(char *gse_data, int gseoutnum)
  253. {
  254. return;
  255. }
  256. int app_goose_recv_data_handle(unsigned int index, char *buf, const int buflen, char *outdata)
  257. {
  258. return 0;
  259. }
  260. void app_goose_timer_data_handle(const uint32_t us_diff)
  261. {
  262. return;
  263. }
  264. void goose_pub_init(char *gse_data, int gseoutnum)
  265. {
  266. return;
  267. }
  268. void app_goose_exit(void)
  269. {
  270. return;
  271. }
  272. void app_goose_inf_print(void)
  273. {
  274. }
  275. void lib61850_set_task_exit(void)
  276. {
  277. }
  278. int lib61850_start_task(void *arg)
  279. { return 0;
  280. }
  281. #endif
  282. #endif // sunxi 20191018