main.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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. //登记bsp回调函数
  83. rt_irq_level(0);
  84. SystemInit();
  85. #ifdef CPU_FUXI
  86. SystemInit_finish_flag = true;
  87. #endif
  88. #ifdef CPU_FUXI
  89. printf_e907_init();
  90. #endif
  91. #ifdef RCD_STRAN_S
  92. _rcd_get_waveno(); /*装置地址要读出参数才有效*/
  93. #endif
  94. #ifndef CPU_FUXI
  95. watchdog_register_all();
  96. #endif
  97. dt_cmd_rt_reset();
  98. rt_stat_other_init(RT_STAT_BIG_LOOP,"主循环");
  99. rt_stat_other_init(1,"5ms_2");
  100. rt_stat_other_init(2,"5ms_3");
  101. rt_stat_other_init(3,"测量计算1");
  102. rt_stat_other_init(4,"测量计算2");
  103. rt_stat_other_init(5,"SOE保存");
  104. rt_stat_other_init(6,"临时测试");
  105. rt_stat_other_init(7,"主循环间隔");
  106. #ifdef SNTP_FUNC
  107. sntp_init();
  108. #endif
  109. {
  110. // 记录关键文件CRC
  111. char name[256];
  112. char log_info[128];
  113. sprintf(name,"上电完成。校验CRC:程序0x%04x, 资源表0x%04x, 板卡资源0x%04x, 通道配置0x%04x, 点表0x%04x。",
  114. m_CodeCrc,g_crc_rsc, g_crc_brd_res, g_crc_equ_cfg, g_crc_rectable);
  115. log_str_time(LOG_ERR,name,0,1);
  116. 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",
  117. m_CodeCrc,g_crc_rsc, g_crc_brd_res, g_crc_equ_cfg, g_crc_rectable);
  118. load_hs_log_rcd(TYPE_DEV_RESTART,true,NULL,log_info,1);
  119. }
  120. ret = get_mt_port_proc();
  121. if(ret != 1) {
  122. close_inet_port();
  123. }
  124. #if defined(CPU_AM335X)
  125. check_app_folder_recover();
  126. #endif
  127. #ifdef CPU_FUXI
  128. // noted by sunxi: 经测试发现,装置运行10多分钟后,tmp文件里的rsc.bin和set_desc.bin会莫名消失。
  129. // 经分析得,伏羲系统会周期(十多分钟)删除掉tmp文件夹中的旧文件(rsc.bin和set_desc.bin 文件是在
  130. // 系统对时前产生的,所以时间默认比较早)。因此在这里统一对tmp文件夹的文件更新一下。
  131. system("touch /tmp/*");
  132. prctl(PR_SET_NAME, "app_main_loop");
  133. #endif
  134. #ifdef RT_THREAD_DEBUG
  135. rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
  136. "app_main_loop", (int)getpid(), (int)syscall(SYS_gettid));
  137. #endif
  138. #if (1) /* 打印信息测试函数 */
  139. dp_info_nt("最大定值个数 MAX_SET_NUMBER = %d", MAX_SET_NUMBER);
  140. dp_info_nt("装置参数 EQUIP_PARA_NUMBER = %d, PARA_NUM = %d", EQUIP_PARA_NUMBER, PARA_NUM);
  141. dp_info_nt("保护定值 SW_SET_NUMBER = %d, SW_SET_NUMBER = %d", SW_SET_NUMBER, SW_SET_NUMBER);
  142. dp_info_nt("开关个数 SWITCH_NUM_MAX = %d, 全部开关保护定值总个数 SET_NUMBER = %d", SWITCH_NUM_MAX, SET_NUMBER);
  143. dp_info_nt("公共定值 PUB_SET_NUMBER = %d, SET_PUB_NUM = %d", PUB_SET_NUMBER, SET_PUB_NUM);
  144. dp_info_nt("内部定值 CSTSET_NUMBER = %d, CSTSET_NUM = %d", CSTSET_NUMBER, CSTSET_NUM);
  145. dp_info_nt("固有参数 FIXEDSET_TABLE_NUMBER = %d", FIXEDSET_TABLE_NUMBER);
  146. msleep(100);
  147. equ_info_printf();
  148. msleep(100);
  149. equ_info_printf_di();
  150. msleep(100);
  151. equ_info_printf_do();
  152. msleep(100);
  153. equ_info_printf_ac();
  154. msleep(100);
  155. factor_printf();
  156. msleep(100);
  157. led_info_printf();
  158. msleep(100);
  159. extern int test_kc_function(void);
  160. test_kc_function();
  161. #endif
  162. {
  163. struct timespec ts;
  164. struct rtc_time_t ct;
  165. gps_get_time(&ts);
  166. timespec_to_rtc(ts, &ct, 1);
  167. rt_printf("当前时间: %04d-%02d-%02d %02d:%02d:%02d\r\n", ct.year+2000, ct.month, ct.day, ct.hour, ct.min, ct.ms/1000);
  168. }
  169. #if defined(CPU_AM335X)
  170. watchdog_unregister_module();
  171. #endif
  172. #if defined(BSP_CAN_ENABLE)
  173. // 复位所有子板
  174. can_app_reset(0);
  175. #endif
  176. #if defined(CAN_SLAVE_BOARD)
  177. // 复位所有子板
  178. can_app_reset(0);
  179. #endif
  180. #ifdef CPU_FUXI
  181. int rc = watchdog_add_item("mainloop", &wdt_id_mainloop,60);
  182. if(rc != 0) {
  183. printf("can not add mainloop task to wdt\r\n");
  184. return -1;
  185. }
  186. #endif
  187. us0_sec = bsp_ustimer_get_origin();
  188. rt_printf("主循环启动...\r\n");
  189. while(1)
  190. {
  191. us0 = bsp_ustimer_get_origin();
  192. // test_round();
  193. // uart_test();
  194. // flash_test();
  195. // adc_test();
  196. // gps_test();
  197. // dido_test();
  198. // rtc_test();
  199. #ifdef CPU_FUXI
  200. msleep(100);
  201. // shm_comm_test();
  202. #endif
  203. // 系统的tick秒
  204. if(us0 - us0_sec > USTIMER_SEC)
  205. {
  206. g_tick_secs++;
  207. us0_sec += USTIMER_SEC;
  208. if(g_restart_count)
  209. {
  210. g_restart_count--;
  211. if(g_restart_count == 0)
  212. {
  213. rt_printf("装置重启\r\n");
  214. watchdog_reset_cpu(2); //装置复位
  215. }
  216. }
  217. }
  218. #if defined(BSP_CAN_ENABLE)
  219. equ_check_period();
  220. can_task();
  221. #else
  222. #ifdef CAN_SLAVE_BOARD
  223. can_task();
  224. #endif
  225. #endif
  226. #ifdef CPU_FUXI
  227. sys_time_check();
  228. #endif
  229. rt_err_app();
  230. soe_save();
  231. IECCommTask();
  232. Maintain_Applay();
  233. net_debug_app();
  234. IEC104_Ether_App();
  235. FA_status_write();
  236. sec_app();
  237. clk_app();
  238. AppPolling(); // 设备状态处理,如点灯等
  239. create_set_file();
  240. #ifdef TMP_CHIP_AHT20
  241. aht20_task();
  242. #endif
  243. #ifdef METERING_ENERGY
  244. metering_yc_refresh();
  245. DD_Calc();
  246. #endif
  247. #ifdef FUNC_DRIVE
  248. quit_drive();
  249. #endif
  250. #ifdef FUNC_RESET_EQU
  251. equ_PowerRest();
  252. #endif
  253. // 喂主循环软件狗
  254. watchdog_feed_mainloop();
  255. //统计大循环时间
  256. rt_stat_other_in(RT_STAT_BIG_LOOP,bsp_ustimer_get_duration(us0)/USTIMER_US);
  257. #ifdef LINUX_KERNEL_APP
  258. kernel_callback();
  259. #endif
  260. //us0 = ustimer_get_origin();
  261. rt_stat_other_in(7,bsp_ustimer_get_duration(us0)/USTIMER_US);
  262. }
  263. #ifdef CPU_FUXI
  264. watchdog_remove_item(wdt_id_mainloop);
  265. #endif
  266. return 0;
  267. }
  268. #if 0 // sunxi 20191018
  269. #ifndef LIB_61850_SW
  270. int gi_platelib_state=2;
  271. int app_goose_init(int fn)
  272. {
  273. return 0;
  274. }
  275. void app_goose_pub_data_handle(char *gse_data, int gseoutnum)
  276. {
  277. return;
  278. }
  279. int app_goose_recv_data_handle(unsigned int index, char *buf, const int buflen, char *outdata)
  280. {
  281. return 0;
  282. }
  283. void app_goose_timer_data_handle(const uint32_t us_diff)
  284. {
  285. return;
  286. }
  287. void goose_pub_init(char *gse_data, int gseoutnum)
  288. {
  289. return;
  290. }
  291. void app_goose_exit(void)
  292. {
  293. return;
  294. }
  295. void app_goose_inf_print(void)
  296. {
  297. }
  298. void lib61850_set_task_exit(void)
  299. {
  300. }
  301. int lib61850_start_task(void *arg)
  302. { return 0;
  303. }
  304. #endif
  305. #endif // sunxi 20191018