RT_DEBUG_LOG(RT_DEBUG_IPC, ("mutex_take: suspend thread: %s\n", thread->name)); /* change the owner thread priority of mutex */ if(thread->current_priority < mutex->owner->current_priority) { /* change the owner thread priority */ rt_thread_control(mutex->owner, RT_THREAD_CTRL_...
在上例中,最低优先级线程 Thread3 在拥有互斥量过程中,会临时将优先级提高到与 Thread1 的优先级相同,即使线程 Thread2 达到就绪状态,也不能够立即执行,需要等待 Thread1 执行完毕,才具备运行条件。 注意,在获得互斥量后,应该尽快释放,并在持有互斥量的过程中,不得再更改持有互斥量线程的优先级。 互斥量控制块...
RT-Thread 管理互斥量的数据结构为互斥量控制块,由结构体struct rt_mutex表示,其具体定义如下: struct rt_mutex{struct rt_ipc_object parent; /* 继承自 ipc_object 类 */rt_uint16_t value; /* 互斥量的值 */rt_uint8_t original_priority; /* 持有线程的原始优先级 */rt_uint8_t hold; /* 持有...
{structrt_ipc_object parent;/**< inherit from ipc_object*/ //派生自IPC对象rt_uint16_t value;/**< value of mutex*/ //此互斥锁的值rt_uint8_t original_priority;/**< priority of last thread hold the mutex*///原始优先级,即此互斥锁拥有者线程的优先级rt_uint8_t hold;/**< numbers ...
RT-Thread 中动态创建互斥量的函数接口如下: rt_mutex_t rt_mutex_create (const char* name, rt_uint8_t flag) 1. 调用此函数创建一个互斥量时,内核会自动创建一个互斥量控制块,并从内核对象管理器中分配一个mutex对象,然后对其初始化。 参数name为互斥量的名字;flag用来设置等待互斥量的线程队列排序方式。
前面学习了RT-Thread的信号量,但信号量在一些场合使用会存在优先级翻转问题,接下来我们学习互斥量,在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承算法。互斥量和信号量不同的是:拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止线程优先级翻转;并且互斥量只能由持有线程释...
在我的FreeRTOS专栏中,对于FreeRTOS 的信号量,互斥量,事件集做过说明和测试。在这个部分,实际上 RT-Thread 与 FreeRTOS 是类似的,都是一样的思想。所以如果属熟悉FreeRTOS的话,这部分是简单的,我们要做的就是记录一下 对象的控制块,和操作函数,加以简单的示例测试。
2. 互斥量控制块 /* include/rtdef.h */#ifdef RT_USING_MUTEX/*** Mutual exclusion (mutex) structure*/structrt_mutex{structrt_ipc_objectparent;/**< inherit from ipc_object */rt_uint16_tvalue;/**< value of mutex */rt_uint8_toriginal_priority;/**< priority of last thread hold the...
在RT-Thread 中,互斥量控制块是操作系统用于管理互斥量的一个数据结构,由结构体 struct rt_mutex 表示。另外一种 C 表达方式 rt_mutex_t,表示的是互斥量的句柄,在 C 语言中的实现是指互斥量控制块的指针。互斥量控制块结构的详细定义请见以下代码: ...
RT_Thread ENV学习笔记 Env使用环境安装 RT-Thread Env工具包括配置器和包管理器,用来对内核和组件的功能进行配置,对组件进行自由裁剪,对线上软件包进行管理,使得系统以搭积木的方式进行构建,简单方便 首先登录RT_Thread官网,网址是https://www.rt-thread.org/ 图1 RT_Thread官网 如上图所示为RT_Thre... ...