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;