G-CAMS-DATU/applications/thread/thread.c
2024-05-16 19:07:30 +08:00

326 lines
7.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-04-23 lijian the first version
*/
#include <thread.h>
/* 使用静态线程时,线程的栈需要设置字节对齐 */
rt_align(RT_ALIGN_SIZE)
static rt_uint8_t thread_io_key_stack[THREAD_STACK_SIZE_512];
static rt_uint8_t thread_io_speed_stack[THREAD_STACK_SIZE_512];
static rt_uint8_t thread_io_adc_stack[THREAD_STACK_SIZE_512];
static rt_uint8_t thread_wireless_stack[THREAD_STACK_SIZE_512];
static rt_uint8_t thread_485_stack[THREAD_STACK_SIZE_1024];
static rt_uint8_t thread_lcd_stack[THREAD_STACK_SIZE_1024];
static rt_uint8_t thread_yields_stack[THREAD_STACK_SIZE_256];
static rt_uint8_t thread_check_save_stack[THREAD_STACK_SIZE_256];
/*
* 优先级从5开始因4被定时器占据
* 电平检测 5
* 速度 6
* adc 6
* 无线与MQTT 7
* 485 8
* OLED 7
* 产量计算 8
* 掉电检测与历史数据保存 5
*/
//static rt_uint8_t thread_lcd_stack[THREAD_STACK_SIZE_512];
static struct rt_thread tid_IO_Key;
static struct rt_thread tid_IO_Speed;
static struct rt_thread tid_IO_ADC;
static struct rt_thread tid_WL;
static struct rt_thread tid_485;
static struct rt_thread tid_LCD;
static struct rt_thread tid_Yields;
static struct rt_thread tid_Check_Save;
/**
* 定时器回调函数30秒一次的心跳
* @param parameter
*/
//static void timer_callback(void* parameter)
//{
//// if (get_WIFI_STATUS() && get_MQTT_STATUS())
//// {
//// if (get_MQTT_UPDATE_FLAG())
//// {
//// MQTT_Keep_Alive();
//// }
//// }
//}
/* 线程的入口函数 */
static void Task_IO_Key(void *parameter)
{
gpio_input_init();
gpio_output_init();
while (1)
{
// updateKeyValue();
rt_thread_mdelay(1);
}
}
static void Task_IO_Speed(void *parameter)
{
// spi_flash_mb85rs_init();
// read_config();
while (1)
{
// updateSpeed();
rt_thread_mdelay(1000);
}
}
static void Task_IO_ADC(void *parameter)
{
adc_init();
while (1)
{
adc_read();
rt_thread_mdelay(500);
}
}
static void Task_Wireless(void *parameter)
{
AT_device_init();
LTE_init();
MQTT_init();
// rt_uint8_t var, Keep_Alive_OK,
rt_tick_t tick_start, tick_end;
tick_start = rt_tick_get();
while (1)
{
tick_end = rt_tick_get();
//两秒交替一次检测状态
if ((tick_end - tick_start) > 2000)
{
check_LTE_MQTT();
tick_start = tick_end;
}
//send MQTT
rt_thread_mdelay(3000);
}
// rt_timer_t timer = rt_timer_create("timer", // 定时器名称
// timer_callback, // 定时器到期时调用的回调函数
// RT_NULL, // 传递给回调函数的参数
// rt_tick_from_millisecond(30000), // 定时器超时时间单位为tick
// RT_TIMER_FLAG_PERIODIC); // 定时器模式,周期性执行
//
// // 启动定时器
// if (timer != RT_NULL)
// {
// rt_timer_start(timer);
// }
}
static void Task_485(void *parameter)
{
while (1)
{
//Modbus_init();
datu_init();
rt_thread_mdelay(100);
}
}
static void Task_Lcd(void *parameter)
{
oled_init();
while (1)
{
oled_menu();
rt_thread_mdelay(50);
}
}
static void Task_Yields(void *parameter)
{
// rt_uint32_t count = 0;
while (1)
{
//rt_kprintf("thread Yields count: %d\n", count++);
rt_thread_mdelay(500);
}
}
static void Task_Check_Save(void *parameter)
{
while (1)
{
// updateNeedleCount();
rt_thread_mdelay(1);
}
}
/* 线程 */
rt_uint8_t thread_IO_Key(void)
{
/* 静态创建线程 */
/* 初始化IO线程 ,名称是 Thread_IO入口是 THREAD_IO*/
rt_thread_init(&tid_IO_Key, //指向线程控制块的指针,是用户定义的一个静态或全局变量,线程控制块通常包含了线程的状态信息、栈指针、优先级
"Thread_IO_Key", //线程的名称
Task_IO_Key, //线程的入口函数,即线程开始执行时调用的函数
RT_NULL, //传递给线程入口函数的参数
thread_io_key_stack, //线程栈的起始地址,通常是一个指向预分配栈空间的指针,线程在运行中会在这个栈上存储局部变量、函数参数等
THREAD_STACK_SIZE_512, //线程栈的大小,单位通常是字节
THREAD_PRIORITY_5, //线程的优先级,数值越小表示优先级越高
THREAD_TIMESLICE_5); //时间片用于调度同优先级的线程。当有多个相同优先级的线程时它们会按照时间片轮转的方式共享CPU时间
/* 启动线程 */
rt_thread_startup(&tid_IO_Key);
return 0;
}
rt_uint8_t thread_IO_Speed(void)
{
/* 初始化速度线程 */
rt_thread_init(&tid_IO_Speed, "Thread_IO_Speed", Task_IO_Speed,
RT_NULL, thread_io_speed_stack,
THREAD_STACK_SIZE_512,
THREAD_PRIORITY_6,
THREAD_TIMESLICE_5);
/* 启动线程 */
rt_thread_startup(&tid_IO_Speed);
return 0;
}
rt_uint8_t thread_IO_ADC(void)
{
/* 初始化针数线程 */
rt_thread_init(&tid_IO_ADC, "Thread_IO_ADC", Task_IO_ADC,
RT_NULL, thread_io_adc_stack,
THREAD_STACK_SIZE_512,
THREAD_PRIORITY_6,
THREAD_TIMESLICE_3);
/* 启动线程 */
rt_thread_startup(&tid_IO_ADC);
return 0;
}
rt_uint8_t thread_Wireless(void)
{
/* 初始化网络线程 */
rt_thread_init(&tid_WL, "Thread_wireless", Task_Wireless,
RT_NULL, thread_wireless_stack,
THREAD_STACK_SIZE_512,
THREAD_PRIORITY_7,
THREAD_TIMESLICE_5);
/* 启动线程 */
rt_thread_startup(&tid_WL);
return 0;
}
rt_uint8_t thread_485(void)
{
/* 初始化485线程 */
rt_thread_init(&tid_485, "Thread_485", Task_485,
RT_NULL, thread_485_stack,
THREAD_STACK_SIZE_1024,
THREAD_PRIORITY_8,
THREAD_TIMESLICE_3);
/* 启动线程 */
rt_thread_startup(&tid_485);
return 0;
}
rt_uint8_t thread_LCD(void)
{
/* 初始化LCD线程 */
rt_thread_init(&tid_LCD, "Thread_lcd", Task_Lcd,
RT_NULL, thread_lcd_stack,
THREAD_STACK_SIZE_1024,
THREAD_PRIORITY_7,
THREAD_TIMESLICE_6);
/* 启动线程 */
rt_thread_startup(&tid_LCD);
return 0;
}
rt_uint8_t thread_Yields(void)
{
/* 初始化产量线程 */
rt_thread_init(&tid_Yields, "Thread_yields", Task_Yields,
RT_NULL, thread_yields_stack,
THREAD_STACK_SIZE_256,
THREAD_PRIORITY_8,
THREAD_TIMESLICE_5);
/* 启动线程 */
rt_thread_startup(&tid_Yields);
return 0;
}
rt_uint8_t thread_Check_Save(void)
{
/* 初始化掉电保存线程 */
rt_thread_init(&tid_Check_Save, "Thread_check_save", Task_Check_Save,
RT_NULL, thread_check_save_stack,
THREAD_STACK_SIZE_256,
THREAD_PRIORITY_5,
THREAD_TIMESLICE_3);
/* 启动线程 */
rt_thread_startup(&tid_Check_Save);
return 0;
}
/* 动态线程示例 */
//int thread(void)
//{
// /* 动态线程 ,名称是 thread1入口是 thread1_entry*/
// tid1 = rt_thread_create("thread1",
// thread1_entry, RT_NULL,
// THREAD_STACK_SIZE,
// THREAD_PRIORITY, THREAD_TIMESLICE);
// if (tid1 != RT_NULL)
// rt_thread_startup(tid1);
//
//}
//static void thread1_entry(void *parameter)
//{
// rt_uint32_t count = 0;
//
// while (1)
// {
// /* 线程 1 采用低优先级运行,一直打印计数值 */
// rt_kprintf("thread1 count: %d\n", count ++);
// rt_thread_mdelay(500);
// }
//}