RT thread 线程初始化疑问?
void player_init(){
rt_err_t result;
/* create player thread */
player_thread_mq = rt_mq_create("player", sizeof(struct player_request),
8, RT_IPC_FLAG_FIFO);
RT_ASSERT(player_thread_mq != RT_NULL);
result = rt_thread_init(&player_thread_tid, "ply_bg", player_thread, RT_NULL,
player_thread_stack, sizeof(player_thread_stack),
20, 5); //这部分是线程初始化,可是怎么没看见这个线程在哪里创建的啊?
if (result != RT_EOK) rt_kprintf("player thread init failed\n");
else
{
rt_thread_startup(&player_thread_tid);
player_ui_init();//在此函数里面有创建了一个player_entry 的线程,但是这个线程也不是一个循环,好像只是GUI 的显示?
}
}
问题:为什么有些函数没有见到创建就直接初始化了(比方说这个player_thread )? 而有些线程有创建却又没见初始化呢(比方说这个 key_thread_entry)?还有些创建了,入口函数里面却又不是死循环,是代表这个线程创建后只执行一次吗(比方说 player_entry 这个)?
问题比较多,可能也比较浅,希望不要介意哈! 没读手册?静态线程和动态线程……
rtgui_workbench_event_loop()这个函数里面是个GUI事件处理循环(函数名就有loop,对吧),调用后就不返回了。 恩,看下了,确实,好像所有的没有循环的那些线程都调用这个函数进去处理了。
还有不明白的是rt_thread_init 的线程是在初始化的同时直接就创建了吗?
看代码里 rt_thread_init 的线程都是带参数的,而 rt_thread_create 的都参数都是RT_NULL ,
这两种有撒区别呢?
谢谢! rt_thread_init 创建的是静态线程
rt_thread_create 创建的是动态线程
但是好像在编程指南中还是没看到关于这两种线程之间的区别,帮忙指导下。
谢谢! 看看 rt_thread_init()和rt_thread_create()的实现,了解下各参数的意思就明白了。
它们两个是平等的功能,并不是有什么依赖关系。 rt_thread_create会动态分配线程TCB和栈。
rt_thread_init则是由用户指定线程TCB和栈,然后对它们做初始化。
动态线程,在它运行结束后,系统会自动释放分配的线程TCB和栈内存空间。 这样的话一般什么样的线程需要设置成动态线程 什么类型的线程要分配为静态线程呢? 回复【6楼】reynold520
这样的话一般什么样的线程需要设置成动态线程 什么类型的线程要分配为静态线程呢?
-----------------------------------------------------------------------
以RADIO为例, KEY这些是必须的,不可能会被移除的线程使用静态的.静态线程的栈和TCB都是在编译时分配好的.是确定的.
而红外学习和电台更新这两个线程,只有要需要时才被动态创建.线程退出后,自动释放资源.但有可能因为资源不足而创建失败. 可以参考这个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3975841&bbs_page_no=2&bbs_id=3066 谢谢楼上各位,大概明白是怎么样的了。。。
继续学习中,有问题在请教了! 在 player_thread 这个线程里面的switch 语句没有default ,是特意这样设计的还是一个疏忽呢? 如果 request.type 的值不是PLAYER_REQUEST_PLAY_SINGLE_FILE,那语句会执行到哪里去了? 好像没地方跑了。
页:
[1]