diff --git a/.config b/.config index 3af62a0..5df140b 100644 --- a/.config +++ b/.config @@ -17,7 +17,9 @@ CONFIG_RT_USING_HOOK=y CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 CONFIG_IDLE_THREAD_STACK_SIZE=1024 -# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 # # kservice optimization @@ -289,11 +291,7 @@ CONFIG_ULOG_OUTPUT_LVL=7 CONFIG_ULOG_USING_ISR_LOG=y CONFIG_ULOG_ASSERT_ENABLE=y CONFIG_ULOG_LINE_BUF_SIZE=128 -CONFIG_ULOG_USING_ASYNC_OUTPUT=y -CONFIG_ULOG_ASYNC_OUTPUT_BUF_SIZE=2048 -CONFIG_ULOG_ASYNC_OUTPUT_BY_THREAD=y -CONFIG_ULOG_ASYNC_OUTPUT_THREAD_STACK=1024 -CONFIG_ULOG_ASYNC_OUTPUT_THREAD_PRIORITY=30 +# CONFIG_ULOG_USING_ASYNC_OUTPUT is not set # # log format @@ -568,16 +566,6 @@ CONFIG_ULOG_BACKEND_USING_CONSOLE=y # CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set # end of enhanced kernel services -# -# POSIX extension functions -# -# CONFIG_PKG_USING_POSIX_GETLINE is not set -# CONFIG_PKG_USING_POSIX_WCWIDTH is not set -# CONFIG_PKG_USING_POSIX_ITOA is not set -# CONFIG_PKG_USING_POSIX_STRINGS is not set -# CONFIG_PKG_USING_POSIX_CTYPES is not set -# end of POSIX extension functions - # # acceleration: Assembly language or algorithmic acceleration packages # @@ -605,7 +593,6 @@ CONFIG_ULOG_BACKEND_USING_CONSOLE=y # CONFIG_PKG_USING_UC_MODBUS is not set # end of Micrium: Micrium software products porting for RT-Thread -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set # CONFIG_PKG_USING_PARTITION is not set @@ -791,7 +778,6 @@ CONFIG_ULOG_BACKEND_USING_CONSOLE=y # CONFIG_PKG_USING_UPARAM is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set -# CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set diff --git a/.gitignore b/.gitignore index 4dd406c..e87ac6e 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ settings/ *.uvguix* /Release/ +/makefile.targets diff --git a/.settings/.rtmenus b/.settings/.rtmenus index e907fa7..dc6d203 100644 Binary files a/.settings/.rtmenus and b/.settings/.rtmenus differ diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 766a9e6..98d0366 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/RTK/ST_rtksvr.c b/RTK/ST_rtksvr.c index aee3f71..c435fcb 100644 --- a/RTK/ST_rtksvr.c +++ b/RTK/ST_rtksvr.c @@ -355,7 +355,7 @@ int decoderaw(rtksvr_t *svr, int index) nav_t *nav; // sbsmsg_t *sbsmsg=NULL; int i, ret, ephsat, ephset, fobs = 0; - rtksvrlock(svr); +// todo rtksvrlock(svr); for (i = 0; i < svr->nb[index]; i++) { @@ -404,7 +404,7 @@ int decoderaw(rtksvr_t *svr, int index) } svr->nb[index] = 0; - rtksvrunlock(svr); +// rtksvrunlock(svr); return fobs; } diff --git a/applications/main.c b/applications/main.c index ca4637d..3117612 100644 --- a/applications/main.c +++ b/applications/main.c @@ -40,23 +40,10 @@ int main(void) } } -struct test{ - int a; - int b; - int *a_p; - int *b_p; -}test,* test_p; + void test_entry() { -// const char testbuff[] = {0xD3,0x00,0x13,0x3E,0xD7,0xD3,0x02,0x02,0x98,0x0E,0xDE,0xEF,0x34,0xB4,0xBD,0x62,0xAC,0x09,0x41,0x98,0x6F,0x33,0x36,0x0B,0x98}; -// rt_device_write(serial3,0,testbuff,sizeof(testbuff)); -// LOG_I("rtksvr_t size= %d",sizeof(rtksvr_t)); - test.a=1; - test.b=2; - test.a_p=&test.a; - test.b_p=&test.b; - test_p = &test; - LOG_I("%d",&test_p->a); + } MSH_CMD_EXPORT(test_entry,test_entry); diff --git a/rtconfig.h b/rtconfig.h index 343f9b9..2478b3e 100644 --- a/rtconfig.h +++ b/rtconfig.h @@ -15,6 +15,9 @@ #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 1024 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 /* kservice optimization */ @@ -183,11 +186,6 @@ #define ULOG_USING_ISR_LOG #define ULOG_ASSERT_ENABLE #define ULOG_LINE_BUF_SIZE 128 -#define ULOG_USING_ASYNC_OUTPUT -#define ULOG_ASYNC_OUTPUT_BUF_SIZE 2048 -#define ULOG_ASYNC_OUTPUT_BY_THREAD -#define ULOG_ASYNC_OUTPUT_THREAD_STACK 1024 -#define ULOG_ASYNC_OUTPUT_THREAD_PRIORITY 30 /* log format */ diff --git a/task/rtk_task.c b/task/rtk_task.c index 906f473..42f1816 100644 --- a/task/rtk_task.c +++ b/task/rtk_task.c @@ -34,26 +34,49 @@ static char thread_user_rtcm_data_stack[get_rtcm_user_data_stack_size]; static struct rt_thread get_ref_rtcm_data; static char thread_ref_rtcm_data_stack[get_rtcm_ref_data_stack_size]; - struct rt_mutex userf_svrlock; rtksvr_t *svr; /* rtk server struct */ //serial3 -->user serial_rtcm_buff[0][] //serial6 -->ref serial_rtcm_buff[1][] - +char buff[8000]; static void thread_get_ref_rtcm_data(void *parameter) { while (1) { - rt_completion_wait(&rtcm_ref_data_process_completion, RT_WAITING_FOREVER); + //to make sure there is only one sem exist at uart,keep data from being damaged by dma transmit. //rt thread could not get uart status when it receiving data. //it may cross frame lost if the system runs slow. if (rt_sem_take(&uart6_simpack.rx_sem, RT_WAITING_FOREVER) == RT_EOK) //need a completion sem connect to rtcm data processing thread. { - READ_SERIAL6(svr->buff[1]); - svr->nb[1] = uart6_simpack.rx_num; - rt_event_send(&uart_event, EVENT_REF_RTCM_DATA_FLAG); + if (rt_completion_wait(&rtcm_ref_data_process_completion, RT_WAITING_NO) == RT_EOK) + { + READ_SERIAL6(svr->buff[1]); + +// READ_SERIAL6(buff); + svr->nb[1] = uart6_simpack.rx_num; + rt_event_send(&uart_event, EVENT_REF_RTCM_DATA_FLAG); + } + else + { + if (uart6_simpack.rx_num != 0) + { + char *drop = rt_malloc(uart6_simpack.rx_num); + if (drop == RT_NULL) + { + LOG_E("heap not enough for thread_get_ref_rtcm_data"); + } + else + { + READ_SERIAL6(drop); + rt_free(drop); + } + + } + } + } + } } @@ -62,15 +85,35 @@ static void thread_get_user_rtcm_data(void *parameter) while (1) { - rt_completion_wait(&rtcm_user_data_process_completion, RT_WAITING_FOREVER); //to make sure there is only one sem exist at uart,keep data from being damaged by dma transmit. //rt thread could not get uart status when it receiving data. //it may cross frame lost if the system runs slow. if (rt_sem_take(&uart3_simpack.rx_sem, RT_WAITING_FOREVER) == RT_EOK) //need a completion sem connect to rtcm data processing thread. { - READ_SERIAL3(svr->buff[0]); - svr->nb[0] = uart3_simpack.rx_num; - rt_event_send(&uart_event, EVENT_UAER_RTCM_DATA_FLAG); + if (rt_completion_wait(&rtcm_user_data_process_completion, RT_WAITING_NO) == RT_EOK) + { + READ_SERIAL3(svr->buff[0]); + svr->nb[0] = uart3_simpack.rx_num; + rt_event_send(&uart_event, EVENT_UAER_RTCM_DATA_FLAG); + } + else + { + if (uart3_simpack.rx_num != 0) + { + char *drop = rt_malloc(uart3_simpack.rx_num); + if (drop == RT_NULL) + { + LOG_E("heap not enough for thread_get_user_rtcm_data"); + } + else + { + READ_SERIAL3(drop); + rt_free(drop); + } + + } + } + } } } @@ -84,12 +127,12 @@ static int nmeacycle = 5000; /* nmea request cycle (ms) */ static int nmeareq = 0; /* nmea request type (0:off,1:lat/lon,2:single) */ extern prcopt_t prcopt_; extern solopt_t solopt_; -static obsd_t data[MAXOBS * 2]; /* 7616 B */ +//static obsd_t data[MAXOBS * 2]; /* 7616 B */ static void thread_rtk_proces(void *parameter) { double pos[3] = { 0.0, 0.0, 0.0 }, npos[3] = { 0.0, 0.0, 0.0 }; static double nmeapos[] = { 0, 0, 0 }; - + uint32_t recevd_event = 0; svr = (rtksvr_t *) rt_malloc(sizeof(rtksvr_t)); if (svr == RT_NULL) { @@ -118,12 +161,11 @@ static void thread_rtk_proces(void *parameter) double tt; uint32_t tick, ticknmea, tick1hz, tickreset; uint8_t *p, *q; - int i, j, n = 0, fobs[2] = { 0 }, cycle, cputime=0; - uint8_t nr, nu; + int n = 0, fobs[2] = { 0 }, cycle, cputime = 0; svr->state = 1; - obs.data = data; -// obs.data = (obsd_t *)rt_malloc(sizeof(obsd_t)*MAXOBS*2); +// obs.data = data; + svr->tick = tickget(); ticknmea = tick1hz = svr->tick - 1000; tickreset = svr->tick - 30000; @@ -141,60 +183,94 @@ static void thread_rtk_proces(void *parameter) { tick = tickget(); - uint32_t recevd_event = 0; + rt_event_recv(&uart_event, (EVENT_UAER_RTCM_DATA_FLAG | EVENT_REF_RTCM_DATA_FLAG), (RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR), RT_WAITING_FOREVER, &recevd_event); - if (recevd_event & EVENT_UAER_RTCM_DATA_FLAG) + if (recevd_event & EVENT_UAER_RTCM_DATA_FLAG || recevd_event & EVENT_REF_RTCM_DATA_FLAG) { - fobs[0] = decoderaw(svr, 0); - rt_completion_done(&rtcm_user_data_process_completion); + if (recevd_event & EVENT_UAER_RTCM_DATA_FLAG) + { + fobs[0] = decoderaw(svr, 0); + rt_completion_done(&rtcm_user_data_process_completion); + } + if (recevd_event & EVENT_REF_RTCM_DATA_FLAG) + { + fobs[1] = decoderaw(svr, 1); + rt_completion_done(&rtcm_ref_data_process_completion); + } } - else if (recevd_event & EVENT_REF_RTCM_DATA_FLAG) + else { - fobs[1] = decoderaw(svr, 1); - rt_completion_done(&rtcm_ref_data_process_completion); - } - else { +// rt_thread_sleep(5); continue; } + uint8_t nr = 0; + uint8_t nu = 0; + /* 将基准站和移动站的观测数据合二为一 这里重新申请了一个MAXOBS*2 的数组, 我觉得是不是有点问题? */ - for (i = 0; i < fobs[0]; i++) + obs.n = 0; + + for (int i = 0; i < fobs[0]; i++) { - obs.n = 0; - nr = nu = 0; - for (j = 0; j < svr->obs[0][i].n && obs.n < MAXOBS * 2; j++) + for (int j = 0; j < svr->obs[0][i].n; j++) { - obs.data[obs.n++] = svr->obs[0][i].data[j]; nu++; } - - for (j = 0; j < svr->obs[1][i].n && obs.n < MAXOBS * 2; j++) + } + for (int i = 0; i < fobs[1]; i++) + { + for (int j = 0; j < svr->obs[1][i].n; j++) { - obs.data[obs.n++] = svr->obs[1][0].data[j]; nr++; } - /* rtk positioning */ - rtksvrlock(svr); - rtkpos(&svr->rtk, obs.data, obs.n, &svr->nav); - rtksvrunlock(svr); - - /* 如果解算结果有效, 设置解算时间点 */ - if (svr->rtk.sol.stat != SOLQ_NONE) + } + nu = (nu > MAXOBS) ? MAXOBS : nu; + nr = (nr > MAXOBS * 2 - nu) ? (MAXOBS * 2) - nr : nr; + if (nu + nr == 0) + { +// rt_thread_mdelay(5); + continue; + } + obs.data = (obsd_t *) rt_malloc(sizeof(obsd_t) * (nu + nr)); + obs.n = 0; + for (int i = 0; i < fobs[0]; i++) + { + for (int j = 0; j < svr->obs[0][i].n && obs.n < nu; j++) { - /* adjust current time */ - tt = (int) (tickget() - tick) / 1000.0 + DTTOL; - timeset(gpst2utc(timeadd(svr->rtk.sol.time, tt))); - - /* write solution */ -// writesol_mini(svr, i); - } - /* 如果设定的运算时间到了发现还没有计算完, 则记录没有计算完的观测次数 */ - if ((int) (tickget() - tick) >= svr->cycle) - { - svr->prcout += fobs[0] - i - 1; + obs.data[obs.n++] = svr->obs[0][i].data[j]; } } + for (int i = 0; i < fobs[1]; i++) + { + for (int j = 0; j < svr->obs[1][i].n && obs.n < nu + nr; j++) + { + obs.data[obs.n++] = svr->obs[1][i].data[j]; + } + } + + /* rtk positioning */ +// rtksvrlock(svr); + rtkpos(&svr->rtk, obs.data, obs.n, &svr->nav); + +// rtksvrunlock(svr); + rt_free(obs.data); + obs.data = RT_NULL; + /* 如果解算结果有效, 设置解算时间点 */ + if (svr->rtk.sol.stat != SOLQ_NONE) + { + /* adjust current time */ + tt = (int) (tickget() - tick) / 1000.0 + DTTOL; + timeset(gpst2utc(timeadd(svr->rtk.sol.time, tt))); + + /* write solution */ +// writesol_mini(svr, i); + } + /* 如果设定的运算时间到了发现还没有计算完, 则记录没有计算完的观测次数 */ +// if ((int) (tickget() - tick) >= svr->cycle) +// { +// svr->prcout += fobs[0] - i - 1; +// } /* send null solution if no solution (1hz) */ if (svr->rtk.sol.stat == SOLQ_NONE && (int) (tick - tick1hz) >= 1000) { @@ -213,9 +289,10 @@ static void thread_rtk_proces(void *parameter) svr->cputime = cputime; /* sleep until next cycle */ - sleepms(15); + } } + sleepms(1); } static void user_init_task(rt_thread_t thread, const char *name, void (*entry)(void *parameter), void *stack_start, @@ -242,21 +319,20 @@ void task_init(void) { rt_event_init(&uart_event, "uart_event", RT_IPC_FLAG_PRIO); - rt_mutex_init(&userf_svrlock,"svrlock",RT_IPC_FLAG_PRIO); + rt_mutex_init(&userf_svrlock, "svrlock", RT_IPC_FLAG_PRIO); rt_completion_init(&rtcm_user_data_process_completion); rt_completion_init(&rtcm_ref_data_process_completion); - rt_thread_t trd=rt_thread_create("rtk_proces", thread_rtk_proces, RT_NULL, 3000, thread_rtk_proces_priority, DEFAULT_USER_THREA_TICK); + rt_thread_t trd = rt_thread_create("rtk_proces", thread_rtk_proces, RT_NULL, 8000, thread_rtk_proces_priority, + DEFAULT_USER_THREA_TICK); rt_thread_startup(trd); user_init_task(&get_user_rtcm_data, "thread_get_user_rtcm_data", thread_get_user_rtcm_data, thread_user_rtcm_data_stack, get_rtcm_user_data_stack_size, THREAD_get_user_rtcm_data_priority, DEFAULT_USER_THREA_TICK, RT_TRUE); - user_init_task(&get_ref_rtcm_data, "thread_get_ref_rtcm_data", thread_get_ref_rtcm_data, - thread_ref_rtcm_data_stack, - get_rtcm_ref_data_stack_size, THREAD_get_ref_rtcm_data_priority, DEFAULT_USER_THREA_TICK, RT_TRUE); + user_init_task(&get_ref_rtcm_data, "thread_get_ref_rtcm_data", thread_get_ref_rtcm_data, thread_ref_rtcm_data_stack, + get_rtcm_ref_data_stack_size, THREAD_get_ref_rtcm_data_priority, DEFAULT_USER_THREA_TICK, RT_TRUE); // user_init_task(&rtk_proces, "rtk_proces", thread_rtk_proces, thread_rtk_proces_stack, // rtk_proces_stack_size, thread_rtk_proces_priority, DEFAULT_USER_THREA_TICK, RT_TRUE); - } diff --git a/task/rtk_task.h b/task/rtk_task.h index f6cd00b..cbae79f 100644 --- a/task/rtk_task.h +++ b/task/rtk_task.h @@ -24,9 +24,9 @@ extern struct rt_mutex userf_svrlock; -struct rt_mutex userf_svrlock; -#define rtksvrlock(svr) rt_mutex_take(&userf_svrlock,RT_WAITING_FOREVER) -#define rtksvrunlock(svr) rt_mutex_release(&userf_svrlock) +//struct rt_mutex userf_svrlock; +//#define rtksvrlock(svr) rt_mutex_take(&userf_svrlock,RT_WAITING_FOREVER) +//#define rtksvrunlock(svr) rt_mutex_release(&userf_svrlock) extern uart_simpack uart3_simpack; //from user_uart.h extern uart_simpack uart6_simpack; //from user_uart.h diff --git a/user_uart/user_uart.c b/user_uart/user_uart.c index 1f952bc..37d34df 100644 --- a/user_uart/user_uart.c +++ b/user_uart/user_uart.c @@ -38,7 +38,7 @@ rt_device_t uart3_init(void) config.baud_rate = BAUD_RATE_460800; //修改波特率为 460800 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_1; //停止位 1 - config.bufsz = 4096; //修改缓冲区 buff size 为 2048 + config.bufsz = 8000; //修改缓冲区 buff size 为 2048 config.parity = PARITY_NONE; //无奇偶校验位 rt_device_control(serial3, RT_DEVICE_CTRL_CONFIG, &config); if (rt_device_set_rx_indicate(serial3, uart3_rx_complete) != RT_EOK) @@ -64,10 +64,10 @@ rt_device_t uart6_init(void) LOG_E("could not find device: %s", USER_UART6_NAME); return RT_NULL; } - config.baud_rate = BAUD_RATE_460800; //修改波特率为 460800 + config.baud_rate = BAUD_RATE_115200; //修改波特率为 460800 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_1; //停止位 1 - config.bufsz = 4096; //修改缓冲区 buff size 为 2048 + config.bufsz = 8000; //修改缓冲区 buff size 为 2048 config.parity = PARITY_NONE; //无奇偶校验位 rt_device_control(serial6, RT_DEVICE_CTRL_CONFIG, &config); if (rt_device_set_rx_indicate(serial6, uart6_rx_complete) != RT_EOK) diff --git a/user_uart/user_uart.h b/user_uart/user_uart.h index 9652bbf..e4cdf6c 100644 --- a/user_uart/user_uart.h +++ b/user_uart/user_uart.h @@ -19,7 +19,7 @@ #define USER_UART6_NAME "uart6" #define READ_SERIAL3(...) rt_device_read(serial3,0,__VA_ARGS__,uart3_simpack.rx_num) -#define READ_SERIAL6(...) rt_device_read(serial6,0,__VA_ARGS__,uart3_simpack.rx_num) +#define READ_SERIAL6(...) rt_device_read(serial6,0,__VA_ARGS__,uart6_simpack.rx_num) rt_device_t serial3; rt_device_t serial6;