RT-thread 自设计线程(任务)模板

发布时间 2023-04-12 09:04:57作者: 辛河

按照模块化设计思想,每个功能任务对应一个线程,每个线程对应一个 头文件和源文件。

线程内使用的线程同步或通信的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__);//当前行所在文件名、函数名、第**行代码 }