main_mod.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: main_mod.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2025-06-09
  7. 功能说明: 实时微系统。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. #include <linux/fs.h>
  12. #include <linux/sched.h>
  13. #include <linux/wait.h>
  14. #include "bsp.h"
  15. #include "rt.h"
  16. #include "app.h"
  17. #include "head.h"
  18. #include "tmp/bsp_share/bsp_ustimer.h"
  19. #include <sys/prctl.h>
  20. #include <sys/types.h>
  21. #include <sys/syscall.h>
  22. #include <signal.h>
  23. #include <stdbool.h>
  24. #include <errno.h>
  25. #include <stdio.h>
  26. // #define __USE_GNU
  27. #define _GNU_SOURCE
  28. #include <sched.h>
  29. #include <pthread.h>
  30. // #include <alchemy/task.h>
  31. static int m_reset; //看门狗复位变量
  32. struct completion *g_exit_completion_gprs_net_IEC_proc;
  33. static int g_exit_flag;
  34. bool SystemInit_finish_flag __attribute__((aligned(8))) = false;
  35. static int sync_cnt = 0;
  36. static pthread_t sync_tid = 0;
  37. enum
  38. {
  39. PTHREAD_MQ=0, // 消息队列
  40. PTHREAD_C0NSOLE, // 控制台
  41. PTHREAD_PRINTF, // 打印信息
  42. PTHREAD_MAIN_LOOP, // 主循环
  43. PTHREAD_MAIN_APP,
  44. PTHREAD_MAIN_DIDO_ADC,
  45. PTHREAD_RCD, // 录波
  46. PTHREAD_CAL_SAMPLE,
  47. PTHREAD_MAX_NUM
  48. };
  49. pthread_t AW_DTU_PTHREAD_TAB[PTHREAD_MAX_NUM]; //线程表
  50. struct rt_stat g_stat_periodus_5ms;
  51. int app_main (void *arg);
  52. int di_do_adc (void *arg);
  53. #ifdef ENCRYPT_SM2
  54. int gh_sm2_dev_init(void);
  55. void gh_sm2_dev_exit(void);
  56. #endif
  57. int console_init(void);
  58. void console_exit(void);
  59. int encrypt_test(void);
  60. int snprintf_test(void);
  61. extern void uart_putchar (int channel, char ch);
  62. extern int net_if_test(void);
  63. extern int clk_test(void);
  64. extern int ac_e2prom_test(void);
  65. void watchdog_m_reset(int flag){}
  66. extern int printf_e907_exit(void);
  67. int kernel_callback(void);
  68. static void main_mod_exit(int signo);
  69. // static DECLARE_WAIT_QUEUE_HEAD(wq);
  70. static int g_soft_irq_flag = 0;
  71. static struct proc_dir_entry *corp_info_proc_entry;
  72. int corp_info_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *data)
  73. {
  74. sprintf(buf, "XXXXXX XXXXXX XXXXXXX XXXXX XXXXXXX Co.,Ltd(XXXXXXXXXX) 2025\r\n");
  75. len = strlen(buf);
  76. return len;
  77. }
  78. pid_t gettid()
  79. {
  80. return syscall(SYS_gettid);
  81. }
  82. int mainloop_soft_isr(int irq, void *dev_id)
  83. {
  84. // int offset=0,tmp,count=1,count2=1,count3=0;
  85. // struct timespec ts;
  86. // struct rtc_time_t rtcs;
  87. struct sched_param sch_par;
  88. sch_par.sched_priority = 6;
  89. pthread_setschedparam(pthread_self(), SCHED_RR, &sch_par); // 设置当前线程优先级
  90. prctl(PR_SET_NAME, "mainloop_soft_isr_thread");
  91. #ifdef RT_THREAD_DEBUG
  92. rt_printf("Thread created successfully: %s,PID: %d LWP: %d\r\n",
  93. "mainloop_soft_isr_thread", (int)getpid(), (int)syscall(SYS_gettid));
  94. #endif
  95. while(1)
  96. {
  97. msleep(100);// 延时100ms
  98. kernel_callback();
  99. #if 0
  100. if(count++>=40)
  101. {
  102. //gps_get_time(&ts);
  103. //timespec_to_rtc(ts, &rtcs, 0);
  104. //tmp=GetUsCounterValue();
  105. //offset=tmp-offset;
  106. //rt_printf("%d---%d-%d-%d,%d:%d:%d mainloop=%d,offset=%d\r\n",ts.tv_sec,rtcs.year,rtcs.month,rtcs.day,rtcs.hour,rtcs.min,rtcs.ms,tmp,offset);
  107. //offset=tmp;
  108. //rt_printf("di=0x%08X\r\n",gpio_get_di());
  109. if(count3==0)
  110. gpio_kout_do(0,DO_OUT7);
  111. else
  112. {
  113. if((count3-1)!=DO_OUT4)
  114. gpio_kout_do(0,count3-1);
  115. }
  116. gpio_kout_do(1,count3);
  117. rt_printf("count=%d\r\n",count3);
  118. ++count3;
  119. if(count3>=DO_NUM)
  120. count3=0;
  121. gpio_kout_do(1,DO_PWM0);
  122. count=1;
  123. }
  124. #endif
  125. }
  126. }
  127. void mainloop_wakeup(void)
  128. {
  129. //rt_sirq_force(11);
  130. }
  131. int kernel_callback(void)
  132. {
  133. static unsigned char init_end_flag = 0; // sunxi 20190416 added
  134. // 延时100ms
  135. //wait_event_interruptible_timeout(wq,g_soft_irq_flag,HZ/10);
  136. g_soft_irq_flag = 0;
  137. // sunxi 20190416 added start
  138. if(!init_end_flag)
  139. {
  140. //corp_info_proc_entry = create_proc_entry("corp_info", 0400, NULL);
  141. if (corp_info_proc_entry)
  142. {
  143. //corp_info_proc_entry->read_proc = corp_info_read_proc;
  144. //corp_info_proc_entry->write_proc = NULL;
  145. }
  146. init_end_flag = 1;
  147. }
  148. // sunxi 20190416 added end
  149. // 检查是否需要退出。
  150. if(g_exit_flag)
  151. {
  152. hzk_exit();
  153. led_exit();
  154. net_debug_exit();
  155. net_debug_s_exit();
  156. if(g_exit_completion_gprs_net_IEC_proc)
  157. {
  158. ;//wait_for_completion(g_exit_completion_gprs_net_IEC_proc);
  159. }
  160. printf_e907_exit();
  161. //complete_and_exit(&exit_completion, 1);
  162. }
  163. return 0;
  164. }
  165. int cal_thread (void *arg)
  166. {
  167. uint32_t us0;
  168. int ms;
  169. struct sched_param sch_par;
  170. sch_par.sched_priority = 8;
  171. pthread_setschedparam(pthread_self(), SCHED_RR, &sch_par); // 设置当前线程优先级暂定 20200910
  172. while(SystemInit_finish_flag == false)
  173. {
  174. msleep(10);
  175. }
  176. uint32_t wdt_id;
  177. int rc = watchdog_add_item("cal_thread", &wdt_id,120);
  178. if(rc != 0) {
  179. printf("can not add cal_thread task to wdt\r\n");
  180. return -1;
  181. }
  182. ms = 50;
  183. us0 = ustimer_get_origin();
  184. prctl(PR_SET_NAME, "cal_thread");
  185. #ifdef RT_THREAD_DEBUG
  186. rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
  187. "cal_thread", (int)getpid(), (int)syscall(SYS_gettid));
  188. #endif
  189. while(1)
  190. {
  191. watchdog_feed(wdt_id);
  192. // 100ms执行一次
  193. ms = 50 - (ustimer_get_duration(us0)/USTIMER_US+ 500)/1000;
  194. if(ms < 0)
  195. {
  196. ms = 0;
  197. }
  198. msleep(ms);
  199. us0 = ustimer_get_origin();
  200. // 检查是否需要退出。
  201. if(g_exit_flag)
  202. {
  203. //complete_and_exit(&exit_completion2, 1);
  204. break;
  205. }
  206. sw_cal_app();
  207. hisory_file_app();
  208. //pw_quality_app();
  209. }
  210. watchdog_remove_item(wdt_id);
  211. return 0;
  212. }
  213. int main_mod_is_exit(void)
  214. {
  215. return g_exit_flag;
  216. }
  217. // sunxi 20190417 added start
  218. /*
  219. * 该接口在模块装载时调用,防止我们的模块在之前的内核版本中能被轻易使用。函数名称不要定义跟功能一样。
  220. */
  221. int mod_init(void)
  222. {
  223. char buf[256] = {0x00};
  224. int fd = rt_file_open("/proc/version", O_RDONLY, 0);
  225. if(fd < 0)
  226. return -1;
  227. rt_file_read(fd, buf, 256, NULL);
  228. rt_file_close(fd, 0);
  229. if(strstr(buf, "root@Ubuntu") && strstr(buf, "-LYQ"))
  230. return 0;
  231. return -3;
  232. }
  233. extern void gps_isr(void);
  234. int di_do_adc (void *unused)
  235. {
  236. pid_t tid;
  237. cpu_set_t set;
  238. struct sched_param sch_par;
  239. sch_par.sched_priority = 99;
  240. // Set CPU affinity [T536-CPU-3]
  241. tid = gettid();
  242. CPU_ZERO(&set);
  243. CPU_SET(3, &set);
  244. sched_setaffinity(tid, sizeof(cpu_set_t), &set);
  245. while(SystemInit_finish_flag == false)
  246. {
  247. msleep(10);
  248. }
  249. uint32_t wdt_id;
  250. int rc = watchdog_add_item("di_do_adc", &wdt_id,120);
  251. if(rc != 0) {
  252. printf("can not add di_do_adc task to wdt\r\n");
  253. return -1;
  254. }
  255. //adc_init();
  256. dido_init();
  257. rt_stat_init(&g_stat_periodus_5ms, "pit_5ms_priod(1us)");
  258. pthread_setschedparam(pthread_self(), SCHED_FIFO, &sch_par); // 设置当前线程优先级
  259. prctl(PR_SET_NAME, "di_do_adc");
  260. #ifdef RT_THREAD_DEBUG
  261. rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
  262. "di_do_adc", (int)getpid(), (int)syscall(SYS_gettid));
  263. #endif
  264. // zhl add
  265. struct shmem_fd shmem_fd;
  266. if (share_mem_init_v2(&shmem_fd) < 0){
  267. printf("--->shmem_init fail !!!\r\n");
  268. return -1;
  269. } else {
  270. printf("--->shmem_init success !!!\r\n");
  271. }
  272. // 装置类型us_machine_type (分布式:1,集中式:2)
  273. struct t_shmdata_machine_type machine_type = {0};
  274. machine_type.us_machine_type = 2;
  275. shm_packet_write_v2(SHM_ADDR_R_MACHINETYPE, (uint8_t *)&machine_type, sizeof(struct t_shmdata_machine_type));
  276. // printf("write SHM_ADDR_R_MACHINETYPE::0x%X -> us_updata: %d, us_op: %d, us_op_bk: %d, us_machine_type: %d, us_crc: 0x%04x\n\n",
  277. // SHM_ADDR_R_MACHINETYPE, machine_type.us_updata, machine_type.us_op, machine_type.us_op_bk, machine_type.us_machine_type, machine_type.us_crc);
  278. sleep(5); // 注:下发装置类型后,需要等待大于5s,才能读取到R核的ADC初始化标志信息
  279. // ADC初始化标志信息
  280. struct t_shmdata_flag adc_flag = {0};
  281. int ret_flag = shm_packet_read_v2(SHM_ADDR_W_FLAG, sizeof(adc_flag), (uint8_t *)&adc_flag, sizeof(adc_flag));
  282. if(adc_flag.us_cfg_adc_err == 1 && ret_flag > 0){
  283. rt_err_set(ERR_CODE_INIT_ADC, 0);
  284. }
  285. // printf("ret_flag: %d, read SHM_ADDR_W_FLAG:0x%X -> us_updata: %u, us_op: %u, us_op_bk: %u, us_cfg_adc_err: %u, us_crc: 0x%04x\n\n",
  286. // ret_flag, SHM_ADDR_W_FLAG, adc_flag.us_updata, adc_flag.us_op, adc_flag.us_op_bk, adc_flag.us_cfg_adc_err, adc_flag.us_crc);
  287. while(1)
  288. {
  289. static u8 flags = 0;
  290. static unsigned long us1 = 0;
  291. unsigned long origin_ext = 0;
  292. usleep(1000);
  293. // bsp_ustimer_delay(1000); // 1ms
  294. // 检查是否需要退出。
  295. if(g_exit_flag)
  296. {
  297. //complete_and_exit(&exit_completion2, 1);
  298. break;
  299. }
  300. origin_ext = bsp_ustimer_get_origin();
  301. if (flags) {
  302. rt_stat_in(&g_stat_periodus_5ms, (origin_ext - us1));
  303. }
  304. watchdog_feed(wdt_id);
  305. // adc_isr(0);
  306. if(adc_flag.us_cfg_adc_err == 0 && ret_flag > 0)
  307. {
  308. adc_isr_new(0);
  309. }
  310. //保护计算
  311. if(prt_flag)
  312. {
  313. pit_5ms_main(0);
  314. prt_flag=false;
  315. }
  316. gps_isr();
  317. us1 = origin_ext;
  318. flags = 1;
  319. }
  320. watchdog_remove_item(wdt_id);
  321. return 0;
  322. }
  323. //当装置修改app文件夹里面的文件时,需要调用该函数,以sync_cnt数减为0时,调用sync,写入flash,保存数文件。
  324. void start_sync(void)
  325. {
  326. sync_cnt = 50;//500ms
  327. }
  328. static int sync_func(void *arg)
  329. {
  330. // int ret = 0;
  331. uint32_t wdt_id;
  332. int rc = watchdog_add_item("sync_func", &wdt_id,60);
  333. if(rc != 0) {
  334. printf("can not add sync_func task to wdt\r\n");
  335. return 0;
  336. }
  337. sync_cnt = 0;
  338. prctl(PR_SET_NAME, "sync_func");
  339. #ifdef RT_THREAD_DEBUG
  340. rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
  341. "sync_func", (int)getpid(), (int)syscall(SYS_gettid));
  342. #endif
  343. while(1)
  344. {
  345. msleep(10);
  346. watchdog_feed(wdt_id);
  347. if(main_mod_is_exit())
  348. {
  349. break;
  350. }
  351. if(sync_cnt > 0)
  352. {
  353. if(--sync_cnt <= 0)
  354. {
  355. system("sync");
  356. // rt_printf_time("--- sync.\r\n");
  357. }
  358. }
  359. }
  360. watchdog_remove_item(wdt_id);
  361. return 0;
  362. }
  363. int main(void)
  364. {
  365. // pid_t pid;
  366. char *argv[] = { "/sbin/ifconfig", "eth1", "192.168.2.100",NULL};
  367. char *envp[] = { NULL };
  368. // struct task_struct * ts;
  369. // struct sched_param sp;
  370. int ret;
  371. SystemInit_finish_flag = false;
  372. //停止喂狗,让程序复位.在命令行中输入insmod f306.ko m_reset=1
  373. if(m_reset==1)
  374. {
  375. rt_printf("watchdog_m_reset(1)...\n");
  376. watchdog_m_reset(1);
  377. return 0;
  378. }
  379. call_usermodehelper("/sbin/ifconfig", argv, envp, UMH_WAIT_PROC);
  380. //if(mod_init() < 0) //jack.liu 20200904 认证信息先不使用
  381. // return -1;
  382. bsp_init(); // bsp必须先初始化
  383. rt_init(); // 实时系统后初始化
  384. app_init(); // 应用初始化最后初始化
  385. adc_init();
  386. // 建立主函数入口线程
  387. ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_LOOP], NULL, (void *)mainloop_soft_isr, NULL);
  388. if(ret)
  389. {
  390. rt_printf("mainloop_soft_isr thread create failed!\r\n");
  391. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  392. memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
  393. return ret;
  394. }
  395. // 创建主循环线程
  396. ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_APP], NULL, (void *)app_main, NULL);
  397. if(ret)
  398. {
  399. rt_printf("app_main thread create failed!\r\n");
  400. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  401. AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_APP] = 0;
  402. memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
  403. return ret;
  404. }
  405. #if 1
  406. // 创建三遥线程
  407. ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_DIDO_ADC], NULL, (void *)di_do_adc, NULL);
  408. if(ret)
  409. {
  410. rt_printf("di_do_adc thread create failed!\r\n");
  411. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  412. AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_DIDO_ADC] = 0;
  413. memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
  414. return ret;
  415. }
  416. // 创建采样数据计算线程
  417. ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_CAL_SAMPLE], NULL, (void *)cal_thread, NULL);
  418. if(ret)
  419. {
  420. rt_printf("cal_thread thread create failed!\r\n");
  421. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  422. AW_DTU_PTHREAD_TAB[PTHREAD_CAL_SAMPLE] = 0;
  423. memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
  424. return ret;
  425. }
  426. ret = pthread_create(&sync_tid, NULL, (void *)sync_func, NULL);
  427. if(ret)
  428. {
  429. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  430. sync_tid = 0;
  431. return ret;
  432. }
  433. // 设置进程名字
  434. prctl( PR_SET_NAME, "AW_DTU_CALL", 0, 0, 0);
  435. signal(SIGINT, main_mod_exit);
  436. #endif
  437. #ifdef RT_THREAD_DEBUG
  438. rt_printf("thread create success!\r\n");
  439. #endif
  440. // 主线程阻塞
  441. while(1) {
  442. usleep(1000*100);
  443. }
  444. return 0;
  445. }
  446. int net_debug_exit(void);
  447. int net_maintain_exit(void);
  448. int net_104_exit(void);
  449. static void main_mod_exit(int signo)
  450. {
  451. if (corp_info_proc_entry)
  452. {
  453. ;//remove_proc_entry("corp_info", NULL);
  454. }
  455. //
  456. if(m_reset == 1)
  457. {
  458. watchdog_m_reset(0);
  459. rt_printf("watchdog_m_reset(0)...\n");
  460. return ;
  461. }
  462. //gh_sm2_dev_exit();
  463. //console_exit();
  464. //watchdog_unregister_all();
  465. //rt_sirq_unregister(RT_SOFT_IRQ_MAINLOOP);
  466. net_maintain_exit();
  467. net_104_exit();
  468. net_104link_exit();
  469. g_exit_flag = 1;
  470. //wait_for_completion(&exit_completion);
  471. //wait_for_completion(&exit_completion2);
  472. app_exit();
  473. rt_exit();
  474. bsp_exit();
  475. // sunxi 20190418 goose_app_exit();
  476. open_inet_port();
  477. rt_printf("main_mod_exit\n");
  478. }