main.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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. {
  147. struct timespec ts;
  148. struct rtc_time_t ct;
  149. gps_get_time(&ts);
  150. timespec_to_rtc(ts, &ct, 1);
  151. rt_printf("当前时间: %04d-%02d-%02d %02d:%02d:%02d\r\n", ct.year+2000, ct.month, ct.day, ct.hour, ct.min, ct.ms/1000);
  152. }
  153. rt_printf("主循环启动...\r\n");
  154. #if defined(CPU_AM335X)
  155. watchdog_unregister_module();
  156. #endif
  157. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  158. // 复位所有子板
  159. can_app_reset(0);
  160. #endif
  161. #if defined(CAN_SLAVE_BOARD)
  162. // 复位所有子板
  163. can_app_reset(0);
  164. #endif
  165. #ifdef CPU_FUXI
  166. int rc = watchdog_add_item("mainloop", &wdt_id_mainloop,60);
  167. if(rc != 0) {
  168. printf("can not add mainloop task to wdt\r\n");
  169. return -1;
  170. }
  171. #endif
  172. us0_sec = bsp_ustimer_get_origin();
  173. while(1)
  174. {
  175. us0 = bsp_ustimer_get_origin();
  176. // test_round();
  177. // uart_test();
  178. // flash_test();
  179. // adc_test();
  180. // gps_test();
  181. // dido_test();
  182. // rtc_test();
  183. #ifdef CPU_FUXI
  184. msleep(10);
  185. // shm_comm_test();
  186. #endif
  187. // 系统的tick秒
  188. if(us0 - us0_sec > USTIMER_SEC)
  189. {
  190. g_tick_secs++;
  191. us0_sec += USTIMER_SEC;
  192. if(g_restart_count)
  193. {
  194. g_restart_count--;
  195. if(g_restart_count == 0)
  196. {
  197. rt_printf("装置重启\r\n");
  198. watchdog_reset_cpu(2); //装置复位
  199. }
  200. }
  201. }
  202. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  203. equ_check_period();
  204. can_task();
  205. #else
  206. #ifdef CAN_SLAVE_BOARD
  207. can_task();
  208. #endif
  209. #endif
  210. #ifdef CPU_FUXI
  211. sys_time_check();
  212. #endif
  213. rt_err_app();
  214. soe_save();
  215. IECCommTask();
  216. Maintain_Applay();
  217. net_debug_app();
  218. IEC104_Ether_App();
  219. #ifndef GW_AREA_MAIN_2021
  220. FA_status_write();
  221. #endif
  222. sec_app();
  223. clk_app();
  224. AppPolling(); // 设备状态处理,如点灯等
  225. create_set_file();
  226. #ifdef TMP_CHIP_AHT20
  227. aht20_task();
  228. #endif
  229. #ifdef METERING_ENERGY
  230. metering_yc_refresh();
  231. DD_Calc();
  232. #endif
  233. #ifdef FUNC_DRIVE
  234. quit_drive();
  235. #endif
  236. #ifdef FUNC_RESET_EQU
  237. equ_PowerRest();
  238. #endif
  239. // 喂主循环软件狗
  240. watchdog_feed_mainloop();
  241. //统计大循环时间
  242. rt_stat_other_in(RT_STAT_BIG_LOOP,bsp_ustimer_get_duration(us0)/USTIMER_US);
  243. #ifdef LINUX_KERNEL_APP
  244. kernel_callback();
  245. #endif
  246. //us0 = ustimer_get_origin();
  247. rt_stat_other_in(7,bsp_ustimer_get_duration(us0)/USTIMER_US);
  248. }
  249. #ifdef CPU_FUXI
  250. watchdog_remove_item(wdt_id_mainloop);
  251. #endif
  252. return 0;
  253. }
  254. #if 0 // sunxi 20191018
  255. #ifndef LIB_61850_SW
  256. int gi_platelib_state=2;
  257. int app_goose_init(int fn)
  258. {
  259. return 0;
  260. }
  261. void app_goose_pub_data_handle(char *gse_data, int gseoutnum)
  262. {
  263. return;
  264. }
  265. int app_goose_recv_data_handle(unsigned int index, char *buf, const int buflen, char *outdata)
  266. {
  267. return 0;
  268. }
  269. void app_goose_timer_data_handle(const uint32_t us_diff)
  270. {
  271. return;
  272. }
  273. void goose_pub_init(char *gse_data, int gseoutnum)
  274. {
  275. return;
  276. }
  277. void app_goose_exit(void)
  278. {
  279. return;
  280. }
  281. void app_goose_inf_print(void)
  282. {
  283. }
  284. void lib61850_set_task_exit(void)
  285. {
  286. }
  287. int lib61850_start_task(void *arg)
  288. { return 0;
  289. }
  290. #endif
  291. #endif // sunxi 20191018