-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Open
Description
Describe problem solved by the proposed feature
获取句柄的方式
方法一:作为线程参数传递
/* 定义全局句柄变量 */
rt_mq_t mq_handle = RT_NULL;
void thread_entry(void* parameter)
{
/* 1. 将 void* 强转回 rt_mq_t */
rt_mq_t mq = (rt_mq_t)parameter;
char buf[10];
while (1)
{
/* 2. 使用句柄接收消息 */
if (rt_mq_recv(mq, &buf, sizeof(buf), RT_WAITING_FOREVER) == RT_EOK)
{
rt_kprintf("Received: %s\n", buf);
}
}
}
int main(void)
{
/* 创建消息队列 */
mq_handle = rt_mq_create("mq1", 10, 5, RT_IPC_FLAG_FIFO);
/* 创建线程时,将 mq_handle 作为第4个参数传递 */
rt_thread_t tid = rt_thread_create("t1", thread_entry, (void*)mq_handle,
1024, 25, 10);
if (tid != RT_NULL) rt_thread_startup(tid);
return 0;
}
方法二:使用 extern 全局变量
rt_mq_t global_mq = RT_NULL; // 定义
void system_init(void) {
global_mq = rt_mq_create("mq_global", 10, 5, RT_IPC_FLAG_FIFO);
}
方法三:使用 rt_object_find
void thread_consumer_entry(void* parameter)
{
rt_mq_t find_mq;
/* 1. 通过名字查找对象 */
/* 注意:rt_object_find 返回的是 rt_object_t,需要强转,且需要指定类型 */
rt_object_t obj = rt_object_find("sensor_mq", RT_Object_Class_MessageQueue);
if (obj == RT_NULL)
{
rt_kprintf("Error: MQ not found!\n");
return;
}
/* 2. 强转为消息队列句柄 */
find_mq = (rt_mq_t)obj;
/* 3. 使用 */
char buffer[10];
rt_mq_recv(find_mq, buffer, 10, RT_WAITING_FOREVER);
}
如果大家工程上大部分采用find话,那是不是得考虑名字的唯一性问题,#10968 中提议修改rt_object_init 接口的方法是否可行?
Describe your preferred solution
No response
Describe possible alternatives
No response
Metadata
Metadata
Assignees
Labels
No labels