RT-Thread学习笔记(三)—— BlinkLED (5)

和之前一样,在用户入口代码中调用这个函数:

extern int blink_led_init(void);
int main(void)
{
    /* user app entry */
        blink_led_init();
    return 0;
}

编译,进入debug模式,运行,成功观察到现象:

BlinkLED运行结果

BlinkLED运行结果2.3.3.静态线程与动态线程的异同

通过2.3.2中创建了一个静态线程和一个动态线程运行可以看出,两者在运行结果上并无差异,那实际应用中该如何选择呢?
使用静态线程时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用 rt_thread_init() 来完成线程的初始化工作。采用这种方式,线程控制块和堆栈占用的内存会放在 RW/ZI 段,这段空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放,而只能使用 rt_thread_detach() 函数将该线程控制块从对象管理器中脱离。
使用动态定义方式 rt_thread_create() 时, RT-Thread 会动态申请线程控制块和堆栈空间。在编译时,编译器是不会感知到这段空间的,只有在程序运行时, RT-Thread 才会从系统堆中申请分配这段内存空间,当不需要使用该线程时,调用 rt_thread_delete() 函数就会将这段申请的内存空间重新释放到内存堆中。
这两种方式各有利弊,静态定义方式会占用 RW/ZI 空间,但是不需要动态分配内存,运行时效率较高,实时性较好。动态方式不会占用额外的 RW/ZI 空间,占用空间小,但是运行时需要动态分配内存,效率没有静态方式高。总的来说,这两种方式就是空间和时间效率的平衡,可以根据实际环境需求选择采用具体的分配方式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzpp.html