RT-Thread 杂项笔记

此篇是笔者个人学习过程中的笔记,有啥写啥,没怎么分类,不定期更新

1.开机首先运行的内容写在startup.c里

2.一般情况下不需要刻意确定线程的栈空间大小,但是在一些苛刻的条件下就需要修改栈大小。在RT-Thread中,可以先指定一个稍微大的栈空间,例如指定大小为1024或2048,然后在FinSH shell中通过list_thread()命令查看线程运行的过程中线程所使用的栈的大小,通过此命令,能够看到从线程启动运行时,到当前时刻点,线程使用的最大栈深度,从而可以确定栈空间的大小并加以修改)。

3.线程入口参数为void *型,可以传入各种数据类型对应的指针。

4.只有在声明了系统动态堆时(即RT_USING_HEAP宏定义已经定义了)才能使用rt_err_t rt_thread_delete(rt_thread_t thread);

5.用rt_thread_init初始化的静态线程则不能使用rt_err_t rt_thread_delete(rt_thread_t thread);删除

6.rt_thread_yield();函数和rt_schedule();函数比较相像,但在有相同优先级的其他就绪态线程存在时,系统的行为却完全不一样。执行rt_thread_yield()函数后,当前线程被换出,相同优先级的下一个就绪线程将被执行。而执行rt_schedule()函数后,当前线程并不一定被换出,即使被换出,也不会被放到就绪线程链表的尾部,而是在系统中选取就绪的优先级最高的线程执行(如果系统中没有比当前线程优先级更高的线程存在,那么执行完rt_schedule()函数后,系统将继续执行当前线程)。

7.通常不应该使用rt_thread_suspend();来挂起线程本身,如果确实需要采用rt_thread_suspend函数挂起当前任务,需要在调用rt_thread_suspend()函数后立刻调用rt_schedule()函数进行手动的线程上下文切换。

8.互斥量和二值信号量的区别:互斥量又叫相互排斥的信号量,是一种特殊的二值性信号量。它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性。当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它,持有该互斥量的线程也能够再次获得这个锁而不被挂起。这个特性与一般的二值信号量有很大的不同,在信号量中,因为已经不存在实例,线程递归持有会发生主动挂起(最终形成死锁)。所谓优先级翻转问题即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。例如:有优先级为A、B和C的三个线程,优先级A> B > C。线程A,B处于挂起状态,等待某一事件触发,线程C正在运行,此时线程C开始使用某一共享资源M。在使用过程中,线程A等待的事件到来,线程A转为就绪态,因为它比线程C优先级高,所以立即执行。但是当线程A要使用共享资源M时,由于其正在被线程C使用,因此线程A被挂起切换到线程C运行。如果此时线程B等待的事件到来,则线程B转为就绪态。由于线程B的优先级比线程C高,因此线程B开始运行,直到其运行完毕,线程C才开始运行。只有当线程C释放共享资源M后,线程A才得以执行。在这种情况下,优先级发生了翻转,线程B先于线程A运行。这样便不能保证高优先级线程的响应时间。

9.在RT-Thread操作系统中实现的是优先级继承算法。优先级继承是通过在线程A被阻塞的期间内,将线程C的优先级提升到线程A的优先级别,从而解决优先级翻转引起的问题。这样能够防止C(间接地防止A)被B抢占。优先级继承协议是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。

10.在获得互斥量后,请尽快释放互斥量,并且在持有互斥量的过程中,不得再行更改持有互斥量线程的优先级。

猜你喜欢

转载自blog.csdn.net/weixin_41995979/article/details/81511734