RT-thread 自设计线程(任务)模板
按照模块化设计思想,每个功能任务对应一个线程,每个线程对应一个 头文件和源文件。
线程内使用的线程同步或通信的IPC,应提前声明和初始化。在所有线程启动前完成。单独成为一个函数。
功能任务划分
1)功能任务独立,并行原则。
2)功能组合
由相同的事件触发的若干功能组合为1个任务。
运行周期相同的功能组合为1个任务。
紧耦合的功能组合为1个任务。
具有固定顺序的多个功能组合为1个任务。
3)占用CPU时间较多的功能单独为1个任务。
任务优先级
1)由中断触发的任务,尽可能高优先级。
2)从实时性考虑,紧迫性高的任务优先级高。
3)从重要性考虑,保证关键任务执行,它的任务优先级高。
4)从频繁性考虑,短周期的任务,它的任务优先级高。
5)从快捷性考虑,耗时短的任务,它的优先级高。
6)从传递性考虑,上游任务高于下游任务的优先级。
举例:键盘检测、串口通信优先级高,OLED显示、数码管显示优先级低。
线程(任务)模板
#ifndef TASK1_H #define TASK1_H #include <rtthread.h> #include "stm32g0xx_hal.h" /********************************************************************************/ /*********************************任务线程间的通信和同步*****************************/ /********************************************************************************/ rt_err_t init_task1mb_ipc(void);//创建邮箱,邮件内容为 rt_err_t post_task1mb(rt_ubase_t mail, rt_int32_t timeout);//向邮箱寄邮件,邮件内容为 rt_err_t wait_task1mb(rt_ubase_t* pmail,rt_int32_t timeout);//等,接收新邮件,邮件内容为 /********************************************************************************/ /***********************************线程接口函数***********************************/ /********************************************************************************/ void task1_setup(void);/*初始化和启动任务线程*/ #endif
#include <task1.h> #include <rtthread.h> #include "stm32g0xx_hal.h" /* RT-Thread 定义线程控制块指针 */ static rt_thread_t app_task1_thread = RT_NULL; /* 定义邮箱控制块指针 */ static rt_mailbox_t task1mb = RT_NULL; /*******************用于线程同步和通信的函数*******************/ /* *********************************************** * 函 数 名: init_task1mb_ipc() * 功能说明: 创建邮箱,邮件内容为 * 形 参:none * 返 回 值: RT_EOK * 全局变量: ************************************************ */ rt_err_t init_task1mb_ipc(void)//创建邮箱,邮件内容为 { rt_err_t result; /*创建一个邮箱*/ task1mb = rt_mb_create("task1mb", /* 邮箱名字 */ 15, /* 邮箱大小 ,同从机最大数量*/ RT_IPC_FLAG_FIFO /*RT_IPC_FLAG_PRIO*/
);/* 信号量模式 FIFO(0x00)*/ result = RT_ERROR; if (motor0x03mb != RT_NULL) result = RT_EOK; return result; } /* *********************************************** * 函 数 名: post_task1mb * 功能说明: 发出32bit邮件 * 形 参: * 返 回 值: RT_EOK ************************************************ */ rt_err_t post_task1mb(rt_ubase_t mail, rt_int32_t timeout)//向邮箱寄邮件,邮件内容为电机从机的地址 { rt_err_t uwRet; uwRet = rt_mb_send_wait(task1mb, mail, timeout); //RT_WAITING_FOREVER); /* 发送一个事件,事件标志EventID*/ return (uwRet); /* 发送一个事件,事件标志EventID*/ } /* *********************************************** * 函 数 名: wait_task1mb() * 功能说明: 等,接收邮件 * 形 参: * 返 回 值: RT_EOK ************************************************ */ rt_err_t wait_task1mb(rt_ubase_t* pmail,rt_int32_t timeout)//等,接收新邮件,邮件内容为电机从机的地址 { rt_err_t uwRet; /* 等待接邮箱消息 */ uwRet = rt_mb_recv(task1mb, /* 邮箱对象句柄 */ pmail, /* 接收邮箱消息 */ timeout);/* 指定超时事件, 一直等 */ return uwRet; } /*******************线程相关的函数********************/ /* *********************************************** * 函 数 名: task1_entry * 功能说明: 线程程序,通过串口从下位机电机控制器读数据 * 形 参:无 * 返 回 值: 无 * 全局变量: ************************************************ */ ;/*全局变量,本线程函数使用*/ static void task1_entry(void* parameter)/*通过WIFI通信,修改寄存器值*/ { /* RT-Thread 线程入口函数声明 */ uint8_t ret; ret =0; /*应用逻辑*/ while(1) { /*应用逻辑*/ rt_thread_delay(50); /* 延时 500 个 tick, 让出CPU */ } } /* *********************************************** * 函 数 名: task1_setup * 功能说明: 初始化,线程程序,通过串口从下位机电机控制器读数据 * 形 参:无 * 返 回 值: 无 ************************************************ */ void task1_setup(void)/*通过WIFI通信,修改本机寄存器值*/ { /*创建线程控制块,并赋给一个该类型指针变量f*/ task1_thread = /* 线程控制块指针 */ rt_thread_create( "task1", /* 线程名字 */ task1_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ 1024, /* 线程栈大小 */ 5, /* 线程的优先级 */ 200); /* 线程时间片 */ /* 启动线程,开启调度 */ if (task1_thread != RT_NULL){ rt_thread_startup(task1_thread); return; } rt_kprintf("error@ %s %s:%d\r\n", __FILE__, __FUNCTION__, __LINE__);//当前行所在文件名、函数名、第**行代码 }