| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546 |
- /******************************************************************************
- 版权所有:
- 文件名称: main_mod.c
- 文件版本: 01.01
- 创建作者: sunxi
- 创建日期: 2025-06-09
- 功能说明: 实时微系统。
- 其它说明:
- 修改记录:
- */
- #include <linux/fs.h>
- #include <linux/sched.h>
- #include <linux/wait.h>
- #include "bsp.h"
- #include "rt.h"
- #include "app.h"
- #include "head.h"
- #include "tmp/bsp_share/bsp_ustimer.h"
- #include <sys/prctl.h>
- #include <sys/types.h>
- #include <sys/syscall.h>
- #include <signal.h>
- #include <stdbool.h>
- #include <errno.h>
- #include <stdio.h>
- // #define __USE_GNU
- #define _GNU_SOURCE
- #include <sched.h>
- #include <pthread.h>
- static int m_reset; //看门狗复位变量
- struct completion *g_exit_completion_gprs_net_IEC_proc;
- static int g_exit_flag;
- bool SystemInit_finish_flag __attribute__((aligned(8))) = false;
- static int sync_cnt = 0;
- static pthread_t sync_tid = 0;
- enum
- {
- PTHREAD_MQ=0, // 消息队列
- PTHREAD_C0NSOLE, // 控制台
- PTHREAD_PRINTF, // 打印信息
- PTHREAD_MAIN_LOOP, // 主循环
- PTHREAD_MAIN_APP,
- PTHREAD_MAIN_DIDO_ADC,
- PTHREAD_RCD, // 录波
- PTHREAD_CAL_SAMPLE,
- PTHREAD_MAX_NUM
- };
- pthread_t AW_DTU_PTHREAD_TAB[PTHREAD_MAX_NUM]; //线程表
- struct rt_stat g_stat_periodus_5ms;
- int app_main (void *arg);
- int di_do_adc (void *arg);
- #ifdef ENCRYPT_SM2
- int gh_sm2_dev_init(void);
- void gh_sm2_dev_exit(void);
- #endif
- int console_init(void);
- void console_exit(void);
- int encrypt_test(void);
- int snprintf_test(void);
- extern void uart_putchar (int channel, char ch);
- extern int net_if_test(void);
- extern int clk_test(void);
- extern int ac_e2prom_test(void);
- void watchdog_m_reset(int flag){}
- extern int printf_e907_exit(void);
- int kernel_callback(void);
- static void main_mod_exit(int signo);
- // static DECLARE_WAIT_QUEUE_HEAD(wq);
- static int g_soft_irq_flag = 0;
- static struct proc_dir_entry *corp_info_proc_entry;
- int corp_info_read_proc(char *buf, char **start, off_t offset, int len, int *eof, void *data)
- {
- sprintf(buf, "XXXXXX XXXXXX XXXXXXX XXXXX XXXXXXX Co.,Ltd(XXXXXXXXXX) 2025\r\n");
- len = strlen(buf);
- return len;
- }
- pid_t gettid()
- {
- return syscall(SYS_gettid);
- }
- int mainloop_soft_isr(int irq, void *dev_id)
- {
- // int offset=0,tmp,count=1,count2=1,count3=0;
- // struct timespec ts;
- // struct rtc_time_t rtcs;
- struct sched_param sch_par;
- sch_par.sched_priority = 6;
- pthread_setschedparam(pthread_self(), SCHED_RR, &sch_par); // 设置当前线程优先级
- prctl(PR_SET_NAME, "mainloop_soft_isr_thread");
- rt_printf("Thread created successfully: %s,PID: %d LWP: %d\r\n",
- "mainloop_soft_isr_thread", (int)getpid(), (int)syscall(SYS_gettid));
- while(1)
- {
- msleep(100);// 延时100ms
- kernel_callback();
- #if 0
- if(count++>=40)
- {
- //gps_get_time(&ts);
- //timespec_to_rtc(ts, &rtcs, 0);
- //tmp=GetUsCounterValue();
- //offset=tmp-offset;
- //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);
- //offset=tmp;
-
- //rt_printf("di=0x%08X\r\n",gpio_get_di());
- if(count3==0)
- gpio_kout_do(0,DO_OUT7);
- else
- {
- if((count3-1)!=DO_OUT4)
- gpio_kout_do(0,count3-1);
- }
- gpio_kout_do(1,count3);
- rt_printf("count=%d\r\n",count3);
- ++count3;
- if(count3>=DO_NUM)
- count3=0;
- gpio_kout_do(1,DO_PWM0);
- count=1;
- }
- #endif
- }
- }
- void mainloop_wakeup(void)
- {
- //rt_sirq_force(11);
- }
- int kernel_callback(void)
- {
- static unsigned char init_end_flag = 0; // sunxi 20190416 added
- // 延时100ms
- //wait_event_interruptible_timeout(wq,g_soft_irq_flag,HZ/10);
- g_soft_irq_flag = 0;
- // sunxi 20190416 added start
- if(!init_end_flag)
- {
- //corp_info_proc_entry = create_proc_entry("corp_info", 0400, NULL);
- if (corp_info_proc_entry)
- {
- //corp_info_proc_entry->read_proc = corp_info_read_proc;
- //corp_info_proc_entry->write_proc = NULL;
- }
- init_end_flag = 1;
- }
- // sunxi 20190416 added end
- // 检查是否需要退出。
- if(g_exit_flag)
- {
- hzk_exit();
- led_exit();
- net_debug_exit();
- net_debug_s_exit();
- if(g_exit_completion_gprs_net_IEC_proc)
- {
- ;//wait_for_completion(g_exit_completion_gprs_net_IEC_proc);
- }
- printf_e907_exit();
- //complete_and_exit(&exit_completion, 1);
- }
- return 0;
- }
- int cal_thread (void *arg)
- {
- uint32_t us0;
- int ms;
- struct sched_param sch_par;
- sch_par.sched_priority = 8;
- pthread_setschedparam(pthread_self(), SCHED_RR, &sch_par); // 设置当前线程优先级暂定 20200910
- while(SystemInit_finish_flag == false)
- {
- msleep(10);
- }
- uint32_t wdt_id;
- int rc = watchdog_add_item("cal_thread", &wdt_id,120);
- if(rc != 0) {
- printf("can not add cal_thread task to wdt\r\n");
- return -1;
- }
- ms = 50;
- us0 = ustimer_get_origin();
- prctl(PR_SET_NAME, "cal_thread");
- rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
- "cal_thread", (int)getpid(), (int)syscall(SYS_gettid));
- while(1)
- {
- watchdog_feed(wdt_id);
-
- // 100ms执行一次
- ms = 50 - (ustimer_get_duration(us0)/USTIMER_US+ 500)/1000;
- if(ms < 0)
- {
- ms = 0;
- }
- msleep(ms);
- us0 = ustimer_get_origin();
- // 检查是否需要退出。
- if(g_exit_flag)
- {
- //complete_and_exit(&exit_completion2, 1);
- break;
- }
- sw_cal_app();
- hisory_file_app();
- //pw_quality_app();
- }
- watchdog_remove_item(wdt_id);
- return 0;
- }
- int main_mod_is_exit(void)
- {
- return g_exit_flag;
- }
- // sunxi 20190417 added start
- /*
- * 该接口在模块装载时调用,防止我们的模块在之前的内核版本中能被轻易使用。函数名称不要定义跟功能一样。
- */
- int mod_init(void)
- {
- char buf[256] = {0x00};
- int fd = rt_file_open("/proc/version", O_RDONLY, 0);
- if(fd < 0)
- return -1;
- rt_file_read(fd, buf, 256, NULL);
- rt_file_close(fd, 0);
- if(strstr(buf, "root@Ubuntu") && strstr(buf, "-LYQ"))
- return 0;
- return -3;
- }
- int di_do_adc (void *unused)
- {
- pid_t tid;
- cpu_set_t set;
- struct sched_param sch_par;
- sch_par.sched_priority = 99;
- // Set CPU affinity [T536-CPU-3]
- tid = gettid();
- CPU_ZERO(&set);
- CPU_SET(3, &set);
- sched_setaffinity(tid, sizeof(cpu_set_t), &set);
- while(SystemInit_finish_flag == false)
- {
- msleep(10);
- }
- uint32_t wdt_id;
- int rc = watchdog_add_item("di_do_adc", &wdt_id,120);
- if(rc != 0) {
- printf("can not add di_do_adc task to wdt\r\n");
- return -1;
- }
- //adc_init();
- dido_init();
- rt_stat_init(&g_stat_periodus_5ms, "pit_5ms_priod(1us)");
- pthread_setschedparam(pthread_self(), SCHED_FIFO, &sch_par); // 设置当前线程优先级
- prctl(PR_SET_NAME, "di_do_adc");
- rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
- "di_do_adc", (int)getpid(), (int)syscall(SYS_gettid));
- while(1)
- {
- static u8 flags = 0;
- static unsigned long us1 = 0;
- unsigned long origin_ext = 0;
- usleep(1000);
- // bsp_ustimer_delay(1000); // 1ms
- // 检查是否需要退出。
- if(g_exit_flag)
- {
- //complete_and_exit(&exit_completion2, 1);
- break;
- }
- origin_ext = bsp_ustimer_get_origin();
- if (flags) {
- rt_stat_in(&g_stat_periodus_5ms, (origin_ext - us1));
- }
-
- watchdog_feed(wdt_id);
- adc_isr(0);
- //保护计算
- if(prt_flag)
- {
- pit_5ms_main(0);
- prt_flag=false;
- }
- // led_polling_5ms(); // ewen 临时测试用 ygl -
- us1 = origin_ext;
- flags = 1;
- }
- watchdog_remove_item(wdt_id);
- return 0;
- }
- //当装置修改app文件夹里面的文件时,需要调用该函数,以sync_cnt数减为0时,调用sync,写入flash,保存数文件。
- void start_sync(void)
- {
- sync_cnt = 50;//500ms
- }
- static int sync_func(void *arg)
- {
- // int ret = 0;
- uint32_t wdt_id;
- int rc = watchdog_add_item("sync_func", &wdt_id,60);
- if(rc != 0) {
- printf("can not add sync_func task to wdt\r\n");
- return 0;
- }
- sync_cnt = 0;
- prctl(PR_SET_NAME, "sync_func");
- rt_printf("Thread created successfully: %s, PID: %d LWP: %d\r\n",
- "sync_func", (int)getpid(), (int)syscall(SYS_gettid));
- while(1)
- {
- msleep(10);
- watchdog_feed(wdt_id);
- if(main_mod_is_exit())
- {
- break;
- }
- if(sync_cnt > 0)
- {
- if(--sync_cnt <= 0)
- {
- system("sync");
- // rt_printf_time("--- sync.\r\n");
- }
- }
-
-
- }
- watchdog_remove_item(wdt_id);
- return 0;
- }
- int main(void)
- {
- // pid_t pid;
- char *argv[] = { "/sbin/ifconfig", "eth1", "192.168.2.100",NULL};
- char *envp[] = { NULL };
- // struct task_struct * ts;
- // struct sched_param sp;
- int ret;
- SystemInit_finish_flag = false;
-
- //停止喂狗,让程序复位.在命令行中输入insmod f306.ko m_reset=1
- if(m_reset==1)
- {
- rt_printf("watchdog_m_reset(1)...\n");
- watchdog_m_reset(1);
- return 0;
- }
- call_usermodehelper("/sbin/ifconfig", argv, envp, UMH_WAIT_PROC);
-
- //if(mod_init() < 0) //jack.liu 20200904 认证信息先不使用
- // return -1;
- bsp_init(); // bsp必须先初始化
- rt_init(); // 实时系统后初始化
- app_init(); // 应用初始化最后初始化
- adc_init();
- // 建立主函数入口线程
- ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_LOOP], NULL, (void *)mainloop_soft_isr, NULL);
- if(ret)
- {
- rt_printf("mainloop_soft_isr thread create failed!\r\n");
- rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
- memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
- return ret;
- }
- // 创建主循环线程
- ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_APP], NULL, (void *)app_main, NULL);
- if(ret)
- {
- rt_printf("app_main thread create failed!\r\n");
- rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
- AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_APP] = 0;
- memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
- return ret;
- }
- #if 1
- // 创建三遥线程
- ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_DIDO_ADC], NULL, (void *)di_do_adc, NULL);
- if(ret)
- {
- rt_printf("di_do_adc thread create failed!\r\n");
- rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
- AW_DTU_PTHREAD_TAB[PTHREAD_MAIN_DIDO_ADC] = 0;
- memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
- return ret;
- }
- // 创建采样数据计算线程
- ret = pthread_create(&AW_DTU_PTHREAD_TAB[PTHREAD_CAL_SAMPLE], NULL, (void *)cal_thread, NULL);
- if(ret)
- {
- rt_printf("cal_thread thread create failed!\r\n");
- rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
- AW_DTU_PTHREAD_TAB[PTHREAD_CAL_SAMPLE] = 0;
- memset((char *)&AW_DTU_PTHREAD_TAB,0,sizeof(AW_DTU_PTHREAD_TAB));
- return ret;
- }
- ret = pthread_create(&sync_tid, NULL, (void *)sync_func, NULL);
- if(ret)
- {
- rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
- sync_tid = 0;
- return ret;
- }
- // 设置进程名字
- prctl( PR_SET_NAME, "AW_DTU_CALL", 0, 0, 0);
- signal(SIGINT, main_mod_exit);
- #endif
- rt_printf("thread create success!\r\n");
-
- // 主线程阻塞
- while(1) {
- usleep(1000*100);
- }
- return 0;
- }
- int net_debug_exit(void);
- int net_maintain_exit(void);
- int net_104_exit(void);
- static void main_mod_exit(int signo)
- {
- if (corp_info_proc_entry)
- {
- ;//remove_proc_entry("corp_info", NULL);
- }
- //
- if(m_reset == 1)
- {
- watchdog_m_reset(0);
- rt_printf("watchdog_m_reset(0)...\n");
- return ;
- }
- //gh_sm2_dev_exit();
- //console_exit();
-
- //watchdog_unregister_all();
- //rt_sirq_unregister(RT_SOFT_IRQ_MAINLOOP);
-
- net_maintain_exit();
- net_104_exit();
- net_104link_exit();
- g_exit_flag = 1;
- //wait_for_completion(&exit_completion);
- //wait_for_completion(&exit_completion2);
- app_exit();
- rt_exit();
- bsp_exit();
- // sunxi 20190418 goose_app_exit();
- open_inet_port();
- rt_printf("main_mod_exit\n");
- }
|