main_mod.c 11 KB

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