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

先上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 *可以无需强制类型转换地赋给其它类型的指针;
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值