main.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  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(500);
  157. led_info_printf();
  158. msleep(500);
  159. // extern int test_kc_function(void);
  160. // test_kc_function();
  161. // msleep(500);
  162. #endif
  163. #if (1)
  164. dp_err_nt_rt("JZS_ALL_EN(0) = %d", JZS_ALL_EN(0));
  165. dp_err_nt_rt("KZ_OUT_ALL_EN(0) = %d", KZ_OUT_ALL_EN(0));
  166. dp_err_nt_rt("FUN_ALL_EN(0) = %d(%d, %d, %d)", FUN_ALL_EN(0), g_run_stu.bhall, pRunSet->tSwSet[0].btt_yxyb_gnztt, g_tRelay[0].run_stu.bhztt);
  167. dp_err_nt_rt("BH_GOOSE_EN_YB(0) = %d", BH_GOOSE_EN_YB(0));
  168. dp_err_nt_rt("BH_GOOSE_EN(0) = %d", BH_GOOSE_EN(0));
  169. dp_err_nt_rt("BH_GOOSE_COMMERR(0) = %d", BH_GOOSE_COMMERR(0));
  170. dp_err_nt_rt("BH_ALL_2(0) = %d", BH_ALL_2(0));
  171. dp_err_nt_rt("BH_ALL_EN(0) = %d", BH_ALL_EN(0));
  172. dp_err_nt_rt("FA_ALL_EN(0) = %d", FA_ALL_EN(0));
  173. dp_err_nt_rt("CHZ_ALL_EN(0) = %d", CHZ_ALL_EN(0));
  174. dp_err_nt_rt("TYTQ_ALL_EN(0) = %d", TYTQ_ALL_EN(0));
  175. dp_err_nt_rt("JL_ALL_EN(0) = %d", JL_ALL_EN(0));
  176. dp_err_nt_rt("pRunSet->dTBLValue[0] = %d", pRunSet->dTBLValue[0]);
  177. dp_err_nt_rt("pRunSet->dYC_num = %d", pRunSet->dYC_num);
  178. dp_err_nt_rt("toc[BH_GL1].dI = %d", pRunSet->tSwSet[0].toc[BH_GL1].dI);
  179. dp_err_nt_rt("toc[BH_GL1].dT = %d", pRunSet->tSwSet[0].toc[BH_GL1].dT);
  180. dp_err_nt_rt("tRunPara.dTBatBegin = %d", tRunPara.dTBatBegin);
  181. dp_err_nt_rt("tRunPara.dTBatInterval = %d", tRunPara.dTBatInterval);
  182. #endif
  183. {
  184. struct timespec ts;
  185. struct rtc_time_t ct;
  186. gps_get_time(&ts);
  187. timespec_to_rtc(ts, &ct, 1);
  188. rt_printf("当前时间: %04d-%02d-%02d %02d:%02d:%02d\r\n", ct.year+2000, ct.month, ct.day, ct.hour, ct.min, ct.ms/1000);
  189. }
  190. #if defined(CPU_AM335X)
  191. watchdog_unregister_module();
  192. #endif
  193. #if defined(BSP_CAN_ENABLE)
  194. // 复位所有子板
  195. can_app_reset(0);
  196. #endif
  197. #if defined(CAN_SLAVE_BOARD)
  198. // 复位所有子板
  199. can_app_reset(0);
  200. #endif
  201. #ifdef CPU_FUXI
  202. int rc = watchdog_add_item("mainloop", &wdt_id_mainloop,60);
  203. if(rc != 0) {
  204. printf("can not add mainloop task to wdt\r\n");
  205. return -1;
  206. }
  207. #endif
  208. us0_sec = bsp_ustimer_get_origin();
  209. rt_printf("主循环启动...\r\n");
  210. while(1)
  211. {
  212. us0 = bsp_ustimer_get_origin();
  213. // test_round();
  214. // uart_test();
  215. // flash_test();
  216. // adc_test();
  217. // gps_test();
  218. // dido_test();
  219. // rtc_test();
  220. #ifdef CPU_FUXI
  221. msleep(10);
  222. #endif
  223. // 系统的tick秒
  224. if(us0 - us0_sec > USTIMER_SEC)
  225. {
  226. g_tick_secs++;
  227. us0_sec += USTIMER_SEC;
  228. if(g_restart_count)
  229. {
  230. g_restart_count--;
  231. if(g_restart_count == 0)
  232. {
  233. rt_printf("装置重启\r\n");
  234. watchdog_reset_cpu(2); //装置复位
  235. }
  236. }
  237. }
  238. #if defined(BSP_CAN_ENABLE)
  239. equ_check_period();
  240. can_task();
  241. #else
  242. #ifdef CAN_SLAVE_BOARD
  243. can_task();
  244. #endif
  245. #endif
  246. #ifdef CPU_FUXI
  247. sys_time_check();
  248. #endif
  249. rt_err_app();
  250. soe_save();
  251. IECCommTask();
  252. Maintain_Applay();
  253. net_debug_app();
  254. IEC104_Ether_App();
  255. FA_status_write();
  256. sec_app();
  257. clk_app();
  258. AppPolling(); // 设备状态处理,如点灯等
  259. create_set_file();
  260. #ifdef TMP_CHIP_AHT20
  261. aht20_task();
  262. #endif
  263. #ifdef METERING_ENERGY
  264. metering_yc_refresh();
  265. DD_Calc();
  266. #endif
  267. #ifdef FUNC_DRIVE
  268. quit_drive();
  269. #endif
  270. #ifdef FUNC_RESET_EQU
  271. equ_PowerRest();
  272. #endif
  273. // 喂主循环软件狗
  274. watchdog_feed_mainloop();
  275. //统计大循环时间
  276. rt_stat_other_in(RT_STAT_BIG_LOOP,bsp_ustimer_get_duration(us0)/USTIMER_US);
  277. #ifdef LINUX_KERNEL_APP
  278. kernel_callback();
  279. #endif
  280. //us0 = ustimer_get_origin();
  281. rt_stat_other_in(7,bsp_ustimer_get_duration(us0)/USTIMER_US);
  282. }
  283. #ifdef CPU_FUXI
  284. watchdog_remove_item(wdt_id_mainloop);
  285. #endif
  286. return 0;
  287. }
  288. #if 0 // sunxi 20191018
  289. #ifndef LIB_61850_SW
  290. int gi_platelib_state=2;
  291. int app_goose_init(int fn)
  292. {
  293. return 0;
  294. }
  295. void app_goose_pub_data_handle(char *gse_data, int gseoutnum)
  296. {
  297. return;
  298. }
  299. int app_goose_recv_data_handle(unsigned int index, char *buf, const int buflen, char *outdata)
  300. {
  301. return 0;
  302. }
  303. void app_goose_timer_data_handle(const uint32_t us_diff)
  304. {
  305. return;
  306. }
  307. void goose_pub_init(char *gse_data, int gseoutnum)
  308. {
  309. return;
  310. }
  311. void app_goose_exit(void)
  312. {
  313. return;
  314. }
  315. void app_goose_inf_print(void)
  316. {
  317. }
  318. void lib61850_set_task_exit(void)
  319. {
  320. }
  321. int lib61850_start_task(void *arg)
  322. { return 0;
  323. }
  324. #endif
  325. #endif // sunxi 20191018