摘要: RTT 的mutex 实现了优先级继承算法,可用其来解决优先级反转的问题。还是来自官网:thread2和worker线程虽然优先级比thread1要高,但是这两个线程均在进程开始出就执行了延时函数,于是轮到 thread1 执行,然后 thread1获得互斥量,thread2延时结束后,虽然它的优先... 阅读全文
posted @ 2013-02-18 11:44 lyyyuna 阅读(440) 评论(0) 推荐(1) 编辑
摘要: 优先级反转是不希望出现的现象。简单来说,有三个线程A, B, C, 优先级A>B>C,A和C有共享资源S。A.B挂起,C运行且有S,A没有S所以一直挂起,B进入调度,调度完之后C再运行直到释放S之后,A才能运行。可以看出,A虽然优先级最高,但实际运行却是最后一个运行,其实际的优先级反转了。下面这段来... 阅读全文
posted @ 2013-02-18 11:37 lyyyuna 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 之前说过,相同优先级的线程,在自己的时间片用光之后,会被剥夺调度器,让给同优先级的其他线程。程序:#include static struct rt_thread thread1;static struct rt_thread thread2;static char thread1_stack[51... 阅读全文
posted @ 2013-02-18 11:27 lyyyuna 阅读(276) 评论(0) 推荐(0) 编辑
摘要: RTT 是抢占式的RTOS,高优先级的线程会先执行。这个例程显示了是如何抢占的。解释我懒得写了,下面这段来自官网论坛:因为更高的优先级,thread1率先得到执行,随后它调用延时,时间为3个系统tick,于是thread2得到执行。可以从打印结果中发现一个规律,在第一次thread2了打印两次thr... 阅读全文
posted @ 2013-02-18 11:20 lyyyuna 阅读(264) 评论(0) 推荐(0) 编辑
摘要: RTT 支持相同优先级,而ucosii 不支持。如果一个线程不调用rt-thread_delay() 来让出调度器,那么它就会一直运行,其它线程永远处于就绪态。而相同优先级的线程,在初始化或创建时还定义了其单次运行的最长的时间片,强迫其让出调度器。这里,使用rt_thread_yield(); 也可... 阅读全文
posted @ 2013-02-18 11:06 lyyyuna 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 静态线程的栈是在编译时确定的,故不能由内核动态的创建或删除。静态线程只能通过detach 来使其脱离内核的调度而做不到 delete。所以静态线程中会像这样定义栈static rt_uint8_t thread1_stack[512];这一点是和ucosii 类似的,但ucosii 没有动态线程。个... 阅读全文
posted @ 2013-02-18 10:54 lyyyuna 阅读(516) 评论(0) 推荐(0) 编辑
摘要: 创建两个动态线程,thread2 运行4s后删除thread1。这里两个都为动态线程,所谓动态线程即在堆中动态创建,删除之后也从RAM中消失。区别于静态线程。由于是动态,所以需开启#define RT_USING_HEAP以下是application.c 的代码#include rt_thread_... 阅读全文
posted @ 2013-02-18 10:42 lyyyuna 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 寒假闲来无事,把RTT官网上的初学者例程中的一部分实现了一遍。以下的这些实验有助于了解一般RTOS的用法。虽然现在RTT的版本比较多,但这些例程的效果都是和版本无关的。配置和编写有关RTT的程序也比较简单,只需改动 rtconifg.h 和 application.c 即可。还有一个好处,所有的实验... 阅读全文
posted @ 2013-02-18 10:33 lyyyuna 阅读(170) 评论(0) 推荐(0) 编辑