97 lines
3.2 KiB
C
97 lines
3.2 KiB
C
|
/*
|
||
|
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*
|
||
|
* Change Logs:
|
||
|
* Date Author Notes
|
||
|
* 2022-06-15 fize the first version
|
||
|
*/
|
||
|
|
||
|
#include <rtk_task.h>
|
||
|
|
||
|
#define LOG_TAG "USER_TASK"
|
||
|
|
||
|
#define THREAD_get_rtcm_data_priority 10
|
||
|
#define THREAD_rtcm_data_proces_priority 9
|
||
|
|
||
|
#define get_rtcm_data_stack_size DEFAULT_USER_THREAD_STACK_SIZE
|
||
|
#define rtcm_data_proces_stack_size DEFAULT_USER_THREAD_STACK_SIZE
|
||
|
|
||
|
rtcm_t rtcm_data;
|
||
|
struct rt_completion get_rtcm_data_completion;
|
||
|
struct rt_completion rtcm_data_process_completion;
|
||
|
|
||
|
static struct rt_thread get_rtcm_data;
|
||
|
static char thread_get_rtcm_data_stack[get_rtcm_data_stack_size];
|
||
|
static struct rt_thread rtcm_data_proces;
|
||
|
static char thread_rtcm_data_proces_stack[DEFAULT_USER_THREAD_STACK_SIZE];
|
||
|
|
||
|
|
||
|
static char rtcm_buff[2048];
|
||
|
|
||
|
static void thread_get_rtcm_data(void *parameter)
|
||
|
{
|
||
|
|
||
|
init_rtcm(&rtcm_data);
|
||
|
rt_completion_init(&get_rtcm_data_completion);
|
||
|
while (1)
|
||
|
{
|
||
|
rt_sem_take(&uart3_simpack.rx_sem, 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_completion_wait(&rtcm_data_process_completion, RT_WAITING_FOREVER)==RT_EOK) //need a completion sem connect to rtcm data processing thread.
|
||
|
{
|
||
|
get_rtcm_data_completion.flag = RT_UNCOMPLETED;
|
||
|
length = uart3_simpack.rx_num;
|
||
|
READ_SERIAL3(rtcm_buff);
|
||
|
rt_completion_done(&get_rtcm_data_completion);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void thread_rtcm_data_proces(void *parameter)
|
||
|
{
|
||
|
rt_completion_init(&rtcm_data_process_completion);
|
||
|
rt_completion_done(&rtcm_data_process_completion);
|
||
|
while (1)
|
||
|
{
|
||
|
rt_completion_wait(&get_rtcm_data_completion, RT_WAITING_FOREVER);
|
||
|
rtcm_data_process_completion.flag = RT_UNCOMPLETED;
|
||
|
for (int var = 0; var < uart3_simpack.rx_num; var++)
|
||
|
{
|
||
|
input_rtcm3(&rtcm_data, rtcm_buff[var]);
|
||
|
}
|
||
|
rt_completion_done(&rtcm_data_process_completion);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
static void user_init_task(rt_thread_t thread, const char *name, void (*entry)(void *parameter), void *stack_start,
|
||
|
rt_uint32_t stack_size, rt_uint8_t priority, rt_uint32_t tick, rt_uint32_t start)
|
||
|
{
|
||
|
rt_err_t result = RT_EOK;
|
||
|
result = rt_thread_init(thread, name, entry, RT_NULL, stack_start, stack_size, priority, tick);
|
||
|
if (start)
|
||
|
{
|
||
|
if (result == RT_EOK)
|
||
|
{
|
||
|
rt_thread_startup(thread);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOG_E("task init failed :%s", name);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*===========================================================================================================*/
|
||
|
void task_init(void)
|
||
|
{
|
||
|
user_init_task(&get_rtcm_data, "get_rtcm_data", thread_get_rtcm_data, thread_get_rtcm_data_stack,
|
||
|
get_rtcm_data_stack_size, THREAD_get_rtcm_data_priority, DEFAULT_USER_THREA_TICK, RT_TRUE);
|
||
|
user_init_task(&rtcm_data_proces, "rtcm_data_proces", thread_rtcm_data_proces, thread_rtcm_data_proces_stack, rtcm_data_proces_stack_size, THREAD_rtcm_data_proces_priority, DEFAULT_USER_THREA_TICK, RT_TRUE);
|
||
|
}
|
||
|
|