当前位置: 代码迷 >> 综合 >> rtthread--创建带传入参数的线程
  详细解决方案

rtthread--创建带传入参数的线程

热度:56   发布时间:2023-10-21 23:01:02.0

先上sample

/* * 该例程用于介绍创建线程时,向线程执行函数中传递参数的用法,传递参数实际上是传递指针*/
#define RT_THREAD_PRIORITY_MAX 32 //线程最低优先级
#define THREAD_STACK_SIZE 512 //线程栈空间
#define THREAD_TIMESLICE 5 //线程调度时间片typedef struct{
    int a;char b[10];
}test_struct;rt_thread_t my_tid3 = RT_NULL, my_tid4 = RT_NULL;
int source_value = 0;/*----------------------针对于结构体的多参数形式----------------------------*/
void my_tid3_thread_entry(void* params)
{
    test_struct* dest = NULL;dest = (test_struct*)params;rt_kprintf("this is my_tid3, dest->a=%d, dest->b:%s\n", dest->a, dest->b);
}void thread_with_struct_param(void* param)
{
    	if(NULL == param){
    rt_kprintf("[ERR]:%s, param is null\n", __func__);return;}if(RT_NULL == my_tid3){
    my_tid3 = rt_thread_create("my_tid3", my_tid3_thread_entry, (void*)param, THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 4, THREAD_TIMESLICE);if(RT_NULL != my_tid3)rt_thread_startup(my_tid3);}
}/*----------------------针对于整形的单参数形式----------------------------*/
void my_tid4_thread_entry(void* params)
{
    int value = (int)params;rt_kprintf("this is my_tid4, value = %d\n", value);
}
void thread_with_int_param(void* param)
{
    	if(NULL == param){
    rt_kprintf("[ERR]:%s, param is null\n", __func__);return;}if(RT_NULL == my_tid4){
    my_tid4 = rt_thread_create("my_tid4", my_tid4_thread_entry, (void*)param, THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 4, THREAD_TIMESLICE);if(RT_NULL != my_tid4)rt_thread_startup(my_tid4);}
}/* -----------------------控制台命令测试-----------------------------*/
void thread_param_test(int argc, char* argv[])
{
    	if(argc == 2){
    source_value = atoi(argv[1]);thread_with_int_param((void*)source_value);}else if(argc == 3){
    /*注意若不加static,当调用thread_with_param()后,param变量已经被释放,无法继续传递。*/static test_struct param;	memset(&param, 0, sizeof(test_struct));param.a = atoi(argv[1]);memcpy(&(param.b), argv[2], strlen(argv[2]));thread_with_struct_param(&param);}
}
MSH_CMD_EXPORT(thread_param_test, thread_param_test);	//shell命令

代码分析

线程创建函数接口

  • rtthread线程创建有两种方式动态创建和静态创建。重点关注这两个函数的两个形参:线程入口函数形参(void (entry)(void parameter))和入口函数参数(void* parameter)。
  • 说明通过void* parameter给void (entry)(void parameter)传递参数。
//动态创建
rt_thread_t rt_thread_create(const char* name,void (*entry)(void* parameter),void* parameter,rt_uint32_t stack_size,rt_uint8_t priority,rt_uint32_t tick);
//静态创建
r_err_t rt_thread_init(struct rt_thread* thread,const char* name,void (*entry)(void* parameter), void* parameter,void* stack_start, rt_uint32_t stack_size,rt_uint8_t priority, rt_uint32_t tick);

void*可以传递哪些参数

void* parameter,使函数更具有通用性,可以容纳任意类型的指针作为形参。
典型的如内存操作函数memcpy和memset的函数,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。

void * memcpy(void *dest, const void *src, size_t len);
void * memset(void *buffer, int c, size_t num);

void和void*常见使用

1、void,为“不确定类型”,不能用于定义变量,常用于以下场景:

  • 对函数返回类型的限定
  • 对函数参数限定
//第一个void,说明函数没有返回值;第二个void,说明函数不能传入参数。
void show_hello(void)
{
    printf("hello\n");
}

2、void*,为 “不确定类型指针”,常用于以下场景

  • 如果函数的参数可以是任意类型指针,那么应声明其参数为void * ;
  • 如果函数可以返回任意类型指针,那么应声明void* fun();
  • void *可以无需强制类型转换地赋给其它类型的指针;