/* * 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 #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); }