11045|11

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

RT-THREAD初学---任务切换 [复制链接]

        各位学习RT-THREAD的前辈,大家好。本人初学RT-THREAD操作系统,刚刚调试了LED灯程序。我发现一个比较初级的问题,我想提出来,请大家帮我指点一下。

        我在程序里创建了两个线程入口,程序已贴出,如下所示。如果按照这样的配法,程序下载到STM32开发板里,没有问题。线程1和线程2都能够得到执行;可是如果我将线程 1里面的配置修改,将延时时间注释掉,另将rt_hw_led_off(0);也注释掉,也就是线程1的任务就是将LED灯点亮。然后什么也不做了。可是这样配置了,程序就会死在线程1里,线程2的程序得不到执行。这是为什么?还有就是RT-THREAD操作系统的不同优先级的任务切换到底是怎么切换的?我在编程 指南上没有找到答案。相同优先级的任务切换,是按照我们创建线程 时设置的时间片来确定的。可是不同优先级的任务切换我一直没弄明白,请各位前辈指点!不胜感激!

static void rt_thread_entry_led1(void* parameter)
{
    /* init led configuration */
    rt_hw_led_init();  //初始化LED灯控制脚
    while (1)
    {
        rt_hw_led_on(0);
        //rt_thread_delay(100); /* sleep 0.5 second and switch to other thread 500ms delay*/

        //rt_hw_led_off(0);
        //rt_thread_delay(100);
    }
}

 

 

 

代码如下:

int rt_application_init()
{
    rt_thread_t thread1,thread2;

    /* create led1 thread 动态线程*/
    thread1 = rt_thread_create("led1",
                              rt_thread_entry_led1, RT_NULL,
                              512,
                              20, 5);
    if (thread1 != RT_NULL)
        rt_thread_startup(thread1);
   
 thread2 = rt_thread_create("led2",
                           rt_thread_entry_led2,RT_NULL,
         512,
         21,5);
     if (thread2 != RT_NULL)
        rt_thread_startup(thread2); 

}

 

static void rt_thread_entry_led1(void* parameter)
{
    /* init led configuration */
    rt_hw_led_init();  //初始化LED灯控制脚
    while (1)
    {
        rt_hw_led_on(0);
        rt_thread_delay(100); /* sleep 0.5 second and switch to other thread 500ms delay*/

        rt_hw_led_off(0);
        rt_thread_delay(100);
    }
}

 

void rt_thread_entry_led2(void* parameter)
{
 while (1)
    {
   GPIO_SetBits(GPIOD,GPIO_Pin_10);
   rt_thread_delay(100);
   GPIO_ResetBits(GPIOD,GPIO_Pin_10);
   rt_thread_delay(100);
    }
}

[ 本帖最后由 lujunlxx520 于 2011-4-18 08:16 编辑 ]

最新回复

我也是初学者,学习了   详情 回复 发表于 2012-7-6 11:23
点赞 关注

回复
举报

849

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

回复 楼主 lujunlxx520 的帖子

看了一下LZ的程序,
LZ是两个线程,线程1的优先级是20,线程2的优先级是21,
   如果LZ把线程1的延时部分注释了,那么线程1就不会挂起,这样当我们的调度器在进行任务切换的时候,会发现,线程1与线程2 都在就绪列表中,但是线程1没有挂起,这样CPU会一直被线程1 占用,线程2永远得不到CPU的控制权。。。。
      这一点上与很多OS的原理是一样的。
 
个人签名只有想不到,没有做不到。
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复楼上

那您的意思就是说,我在每个任务执行完成之后,都要加一个延时了,如果没有这部分,那么线程1就不会被挂起,导致比他低的优先级的线程2的程序永远都无法执行?如果非要加这个延时,这个延时的最小时间是多少?
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

4
 

回复 板凳 lujunlxx520 的帖子

呵呵。。一般是这样,要想进行任务切换就必须要一个时间差还实现高优先级的线的程或同优先级的线程的时间片调度有挂起的实现。否则其他的线程怎么能得到CPU的控制权喃?
 
个人签名只有想不到,没有做不到。
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 
哈哈,恩。明白了。呵呵本来我是可以继续研究RT-THREAD的。可是现在要弄那个视频图像传输和处理。等我把这个弄好之后,继续学习RT-THREAD。到时候要多向你请教。能否加下您的QQ?您可以把QQ发到我的邮箱lujunlxx520@126.com。谢谢
 
 
 

回复

117

帖子

0

TA的资源

一粒金砂(高级)

6
 
通常,一个任务/线程,在设计时需要着重考虑它的运行时间长度,

如果永远在运行,那么比它优先级更低的线程将得不到运行;运行时间长度也从另一个侧面反映了用户应该为设置的优先级:运行时间长度越短的线程,能够为它赋予越高的优先级。(当然对于并无实时需求的线程,应该不按照这类法则)
 
个人签名RT-Thread:启动下一代RTOS演化
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

7
 
OS都要考虑给其他任务运行的机会的,高优先级任务必须要有阻塞时间的
 
 
 

回复

273

帖子

0

TA的资源

纯净的硅(中级)

8
 
学习了
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

9
 
我也是初学者,学习了
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

10
 
我在程序里创建了两个线程入口,
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

11
 
这个是必须的
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

12
 
我也是初学者,学习了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表