RT-Thread OS中使用C++类成员函数创建线程

RT-Thread线程创建接口使用的是C函数,对于C++类成员变量因含有隐式传参this,所以并不能直接把C++的类成员函数作为线程入口函数。
目前主流方式有两种:定义类静态成员函数使用模板函数

一、定义类静态成员函数

只需要在普通成员函数前加上static就变成了静态成员函数,静态成员函数没有隐式传参无需实例化也可以调用。但是静态成员函数只能访问类静态成员变量,使用不便,不推荐此法。

二、使用模板函数

使用模板函数来进行类成员函数的前置转换,将隐式传参转换成显示传参。使用方便,无限制。此方法也可适用于其它类似接口。
具体使用方法如下:

//main.cxx
#include <rtthread.h>
#include <string.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

//TYPE:类名
//void (TYPE::*run)():线程入口函数
//使用时类中线程入口必须和模板函数定义入口相同,此处为[run]
//你可以修改为指定的名称,建议以模板函数线程为标准来修改类成员函数线程入口名
template<typename TYPE,void (TYPE::*run)()>
void _thread_t(void *parameter)
{
    TYPE* t = (TYPE*)parameter;
    t->run();
}

class Test {
public:
    Test(){}
    virtual ~Test(){}
    //函数名保持和_thread_t函数模板线程入口名相同
    void run() {
        rt_kprintf("%s id:0x%x\n",__FUNCTION__ ,rt_thread_self());
    }
};

void thread_test()
{
    Test t;
    rt_kprintf("%s thread id:0x%x\n",__FUNCTION__ ,rt_thread_self());
    //entry:传递模板函数_thread_t
    rt_thread_t th = rt_thread_create("Test_th", _thread_t<Test,&Test::run>, &t, 512, 20, 5);
    if (RT_NULL == th) {
        rt_kprintf("thread create failed.\n");
        return;
    }
    rt_kprintf("start Test::run thread:0x%x\n",th);
    rt_thread_startup(th);
}

int main()
{

    return RT_EOK;
}
MSH_CMD_EXPORT(thread_test,thread test);

RT-Thread编译C++代码时请打开C++libc功能,并且需要将你的C++代码的文件名后缀更改为.cpp.cxx或其它表C++文件的后缀名。
编译运行在finsh终端输入help命令发现已经多了一条thread_test命令,键入此命令输出如下结果:

msh >thread_test
thread_test thread id:0x20001b10
start Test::run thread:0x2000105c
msh >run id:0x2000105c

可以发现run函数可以被正常调用且启动的线程ID和run函数里面运行的线程ID相同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread作品秀】基于RT-Thread的智慧农业物联网网关作者:frankpyq 概述智慧农业是目前物联网一个比较广泛的发展方向,基于从事农业物联网相关硬件的开发,结合这次RTT大赛,决定基于RT-Thread设计一款物联网网关。本物联网网关基于STM32H7为主芯片进行设计,分为硬件网关和物联网平台。硬件网关有以ART-PI开发板为核心板,自行设计了一个扩展板,板载一路4G通讯模块,一路LORA无线采集模块,一路RS485电路,2路继电器输出,4路LED指示,1路DS18B20温度采集,1个蜂鸣器;硬件网关可以通过无线LORA采集节点数据,最多可以接收32路无线节点采集;也可以通过RS485电路采集传感器数据。采集到数据后,通过4G模块发送到物联网平台。这里物联网平台我使用的是深圳市模拟科技有限公司的TLINK物联网平台。板载2路继电器和LED指示灯,可以通过平台下发命令控制开关。 开发环境硬件:ART-PI(STM32H750XB), ART-PI_TOP扩展板; RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Thread Studio版本: 2.0.0 RT-Thread使用情况概述(1)内核部分:调度器,信号量等。 调度器:创建多个线程来实现不同的工作。 信号量:用来线程间的同步。 (2)组件部分:UART框架,SENSOR框架。 UART框架:使用了3个串口,分别连接4G模块,LORA模块,RS485;分别用于跟平台通讯和采集传感器数据。 SENSOR框架:使用DS18B20采集设备机箱温度。 (3)软件包:暂未使用相关软件包。 硬件框架软件框架说明软件模块说明项目工程文件是基于官方SDK的点灯示例程序开始的。 (1)read_temp_entry线程:用于读取板载DS18B20温度传感器的数值。 (2)LoraU6RxData线程:用于采集无线LORA传感器节点的数据。传感器节点采用主动上报方式传输数据,最多挂载32个节点。 (3)led_shine_entry线程:LED灯闪烁,用于指示设备状态; (4)Task_Tlink_Tx线程:跟TLINk云平台通讯,包含登录和主动上报数据。 (5)TlinkRxData线程:用于接收和解析TLINK云平台下发的控制指令,并执行相关继电器动作。 演示效果(1)设备照片: (2)平台接收数据照片: (3)云组态照片: (4)演示视频: 比赛感悟认识RT-Thread已经是很多年前的事情了,当初也买了第一代的魔笛网络收音机开发板,但是很遗憾一直都没有在实际项目使用到。主要原因都是我手头的项目都是基于裸机开发的,都没有使用RTOS。基于RTT大赛的机缘,我就想努力尝试一把,先用起来,然后决定以后项目有需要的都上RTT系统。但是完事开头难,我这个项目当初想起来挺容易,但是实际做起来的时候,真的还是很不容易的。主要还是我的RTOS编程经验匮乏,对系统内核以及进程通信机制没有理解透彻,导致写程序的时候出了不少问题。从最开始的点灯,到后面的添加传感器驱动框架,添加串口驱动框架,实现了DS18B20传感器采集,实现了串口跟GPRS模块和LOR模块的通讯,实现了数据上TLINK云平台。完成数据上报云平台以及云平台下发控制指令和执行动作等等功能。这其,我基本没有使用额外的软件包和驱动等,主要还是对RTT不是很熟悉,可以说还基本没有上手。按照当初的设想,本来是要使用广和通的L610的模块,使用AT指令软件包,ONENET软件包等上移动ONENET云平台。但是由于时间太紧和基础太差的原因,20号之前只能完成这么多了。其实这两天我已经用L610模块连上了ONENET云平台,但是详细功能还没有实现,后面我会继续把这个项目做下去,争取把这个产品做完善。最后感谢举办方给我一个很好的学习和锻炼的机会,RTT我相信我会一直用下去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值