首页 > 其他分享 >RT-thread 自设计线程(任务)模板

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

时间:2023-04-12 09:13:13浏览次数:39  
标签:RT rt thread task1mb task1 任务 线程

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

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

 

                

标签:RT,rt,thread,task1mb,task1,任务,线程
From: https://www.cnblogs.com/excellentHellen/p/17308597.html

相关文章

  • Proxmox 7.4 “Virtual Environment”发布
    Proxmox是一家商业公司,提供基于DebianGNU/Linux的专门产品。该公司已经发布了其“虚拟环境“系列的更新,引入了更新的虚拟机和文件系统包以及一个新的黑暗主题。近日,Proxmox宣布推出新的虚拟环境7.4版本,该版本是基于Debian11.6“Bullseye”的最新版本,但使用了更新的Li......
  • Proxmox 7.4 “Virtual Environment”发布
    Proxmox是一家商业公司,提供基于DebianGNU/Linux的专门产品。该公司已经发布了其“虚拟环境“系列的更新,引入了更新的虚拟机和文件系统包以及一个新的黑暗主题。近日,Proxmox宣布推出新的虚拟环境7.4版本,该版本是基于Debian11.6“Bullseye”的最新版本,但使用了更新的Li......
  • Proxmox 7.4 “Virtual Environment”发布
    Proxmox是一家商业公司,提供基于DebianGNU/Linux的专门产品。该公司已经发布了其“虚拟环境“系列的更新,引入了更新的虚拟机和文件系统包以及一个新的黑暗主题。近日,Proxmox宣布推出新的虚拟环境7.4版本,该版本是基于Debian11.6“Bullseye”的最新版本,但使用了更新的Li......
  • sqlalchemy快速插入数据,scoped_session线程安全,加载类上的装饰器,基本增删改查,django中
    今日内容sqlalchemy快速插入数据sqlalchemy是什么orm框架,跟其他web框架没有必然联系,可以独立使用安装,快速使用,执行原生sql创建表和删除表不能创建数据库不能修改字段(增加,删除)使用orm插入第一步:生成engine对象engine=create_engine("mysql+pymysql://[email protected].......
  • 【Java 线程池】【四】ThreadPoolExector中的Worker工作者原理
    1 前言上一节我们看了ThreadPoolExecutor线程池的execute内部方法流程,addWorker方法流程,看到Worker是线程池内部的工作者,每个Worker内部持有一个线程,addWorker方法创建了一个Worker工作者,并且放入HashSet的容器中,那么这节我们就来看看Worker是如何工作的。2  内部属性我们......
  • Docker CLI docker compose convert常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • flask框架06 sqlalchemy使用 scoped_session线程安全 一对多 多对多 增删改查
    今日内容详细目录今日内容详细1sqlalchemy快速插入数据2scoped_session线程安全2.1基本使用2.2加在类上的装饰器3基本增删查改3.1基本增删查改和高级查询3.2原生sql3.3django中执行原生sql4一对多4.1表模型4.2新增和基于对象的查询5多对多5.1表模型5.2增加和基于......
  • QuartZ Cron表达式简记
    表达式范例:*/5****?每隔5秒执行一次0*/1***?每隔1分钟执行一次0023**?每天23点执行一次001**?每天凌晨1点执行一次:0011*?每月1号凌晨1点执行一次0023L*?......
  • java arrays类方法parallelSort,学习总结
    Arrays.sort与Arrays.parallelSort区别Arrays.sort()Arrays.sort()方法对对象或原始数据类型的数组进行排序。此方法中使用的排序算法是Dual-Pivot Quicksort。 换句话说,它是快速排序算法的自定义实现,以实现更好的性能。此方法是单线程的 ,有两种变体:sort(array)–将整......
  • flask之sqlalchemy快速插入数据-scoped_session线程安全-基本增删改查-表模型一对多-
    目录flask之sqlalchemy快速插入数据-scoped_session线程安全-基本增删改查-表模型一对多-多对多-连表查询今日内容1sqlalchemy快速插入数据2scoped_session线程安全2.1基本使用2.2加在类上的装饰器3基本增删改查3.1基本增删改查和高级查询3.2原生sql3.3django中执行原生sq......