zoukankan      html  css  js  c++  java
  • [RTT例程练习] 1.2 静态线程除初始化与脱离

    静态线程的栈是在编译时确定的,故不能由内核动态的创建或删除。静态线程只能通过detach 来使其脱离内核的调度而做不到 delete。

    所以静态线程中会像这样定义栈

    static rt_uint8_t thread1_stack[512];

    这一点是和ucosii 类似的,但ucosii 没有动态线程。

    个人感觉动态线程更有优势,也更像PC。尤其是在外扩了SRAM的情况下优势就更明显了。

    原官网有比较全的解释:

    总结
    什么是动态线程?什么是静态线程?两者有什么区别?
    RT-Thread中支持静态和动态两种定义方式。用线程来举例的话,rt_thread_init对应静态定义方式, rt_thread_create 对应动态定义方式。
    使用静态定义方式时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用rt_thread_init来完成线程的初始化工作。采用这种方式,线程控制块和堆栈占用的内存会放在RW段,这段内存空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放,而只能使用 rt_thread_detach 函数将该线程控制块从对象管理器中脱离。
    使用动态定义方式 rt_thread_create 时, RT-Thread 会动态申请线程控制块和堆栈空间。当不需要使用该线程时,调用rt_thread_delete函数就会将这段申请的内存空间重新释放到内存堆中(如果线程执行完毕,退出时,系统也会自动回收线程控制块和堆栈空间)

    代码就很简单了,类似于实验1.1 , 一个线程让另一个线程脱离调度器调度。

    #include <rtthread.h>
    
    static struct rt_thread thread1;
    
    static struct rt_thread thread2;
    
    static rt_uint8_t thread1_stack[512];
    
    static rt_uint8_t thread2_stack[512];
    
    /* entry for thread1 */
    static void thread1_entry(void* parameter)
    {
        rt_uint32_t count = 0;
    
        while(1)
        {
            rt_kprintf("thread count: %d\n", count++);
            rt_thread_delay(RT_TICK_PER_SECOND);
        }
    }   
    
    static void thread2_entry(void* parameter)
    {
        rt_thread_delay(RT_TICK_PER_SECOND * 10);
    
        rt_thread_detach(&thread1);
    
        rt_thread_delay(10);
    }
    
    int rt_application_init()
    {
        rt_err_t result;
    
        result = rt_thread_init(&thread1, "t1",
            thread1_entry, RT_NULL,
            &thread1_stack[0], sizeof(thread1_stack), 
            7, 10);
        if (result == RT_EOK)
            rt_thread_startup(&thread1);
    
        result = rt_thread_init(&thread2, "t2",
            thread2_entry, RT_NULL,
            &thread2_stack[0], sizeof(thread2_stack), 
            6, 10);
        if (result == RT_EOK)
            rt_thread_startup(&thread2);
        return 0;
    }
    

    输出结果:

    \ | /
    - RT - Thread Operating System
    / | \ 1.1.0 build Aug 10 2012
    2006 - 2012 Copyright by rt-thread team
    thread count: 0
    thread count: 1
    thread count: 2
    thread count: 3
    thread count: 4
    thread count: 5
    thread count: 6
    thread count: 7
    thread count: 8
    thread count: 9


  • 相关阅读:
    WPF-WPF的内部世界-Binding
    WPF-XMAL-布局和控件-布局(一)
    SQL Server的简单使用
    redis的简单使用
    JWT
    C# 面试
    dapper的使用
    .NET发展史
    idea Jrebel升级后看不到且无法重新安装Jrebel
    laydate时间点击后马上消失
  • 原文地址:https://www.cnblogs.com/lyyyuna/p/4123951.html
Copyright © 2011-2022 走看看