搜索
bottom↓
回复: 10

RT thread 线程初始化疑问?

[复制链接]

出0入0汤圆

发表于 2010-7-8 22:46:50 | 显示全部楼层 |阅读模式
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 这个)?

问题比较多,可能也比较浅,希望不要介意哈!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入663汤圆

发表于 2010-7-9 02:28:23 | 显示全部楼层
没读手册?静态线程和动态线程……
rtgui_workbench_event_loop()这个函数里面是个GUI事件处理循环(函数名就有loop,对吧),调用后就不返回了。

出0入0汤圆

 楼主| 发表于 2010-7-9 08:15:10 | 显示全部楼层
恩,看下了,确实,好像所有的没有循环的那些线程都调用这个函数进去处理了。

还有不明白的是rt_thread_init 的线程是在初始化的同时直接就创建了吗?

看代码里 rt_thread_init 的线程都是带参数的,而 rt_thread_create 的都参数都是RT_NULL ,

这两种有撒区别呢?

谢谢!

出0入0汤圆

 楼主| 发表于 2010-7-9 08:22:00 | 显示全部楼层
rt_thread_init 创建的是静态线程

rt_thread_create 创建的是动态线程

但是好像在编程指南中还是没看到关于这两种线程之间的区别,帮忙指导下。


谢谢!

出0入0汤圆

发表于 2010-7-9 09:14:05 | 显示全部楼层
看看 rt_thread_init()和rt_thread_create()的实现,了解下各参数的意思就明白了。
它们两个是平等的功能,并不是有什么依赖关系。

出0入0汤圆

发表于 2010-7-9 09:29:57 | 显示全部楼层
rt_thread_create会动态分配线程TCB和栈。

rt_thread_init则是由用户指定线程TCB和栈,然后对它们做初始化。

动态线程,在它运行结束后,系统会自动释放分配的线程TCB和栈内存空间。

出0入0汤圆

 楼主| 发表于 2010-7-9 12:48:41 | 显示全部楼层
这样的话一般什么样的线程需要设置成动态线程 什么类型的线程要分配为静态线程呢?

出0入0汤圆

发表于 2010-7-9 12:59:45 | 显示全部楼层
回复【6楼】reynold520  
这样的话一般什么样的线程需要设置成动态线程 什么类型的线程要分配为静态线程呢?
-----------------------------------------------------------------------
以RADIO为例, KEY这些是必须的,不可能会被移除的线程使用静态的.静态线程的栈和TCB都是在编译时分配好的.是确定的.
而红外学习和电台更新这两个线程,只有要需要时才被动态创建.线程退出后,自动释放资源.但有可能因为资源不足而创建失败.

出0入0汤圆

发表于 2010-7-9 13:04:54 | 显示全部楼层
可以参考这个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3975841&bbs_page_no=2&bbs_id=3066

出0入0汤圆

 楼主| 发表于 2010-7-9 20:00:02 | 显示全部楼层
谢谢楼上各位,大概明白是怎么样的了。。。

继续学习中,有问题在请教了!

出0入0汤圆

 楼主| 发表于 2010-7-9 21:31:20 | 显示全部楼层
在 player_thread 这个线程里面的switch 语句没有default ,是特意这样设计的还是一个疏忽呢? 如果 request.type 的值不是PLAYER_REQUEST_PLAY_SINGLE_FILE  ,那语句会执行到哪里去了? 好像没地方跑了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 14:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表