[应用相关] tm32 入门RT-Thread内核 线程间的通讯—互斥量

[复制链接]
775|13
 楼主| 一路向北lm 发表于 2021-1-12 10:40 | 显示全部楼层 |阅读模式
互斥量用户线程间互斥访问的IPC对象,它是一种特殊的二值信号量。当某一个线程访问系统中的共享资源时,通过引入互斥量机制,可以保证其他线程无法取得对此共享资源的访问权。

 楼主| 一路向北lm 发表于 2021-1-12 10:41 | 显示全部楼层
互斥量只有两种状态:LOCKED和UNLOCKED,分别代表加锁和开锁的两种情况。当线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将互斥量进行开锁操作,失去对它的所有权。当一个线程持有互斥量时,其它线程不能对它开锁或者持有它,只有这个持有互斥量的线程才能释放它进行开锁操作,其它线程才能被持有。
 楼主| 一路向北lm 发表于 2021-1-12 10:41 | 显示全部楼层
在RT-Thread中,互斥量控制块是操作系统用于管理互斥量的一个数据结构。
  1. struct rt_mutex
  2. {
  3.     struct rt_ipc_object parent;               /**< inherit from ipc_object */
  4.     rt_uint16_t   value;                    /**< value of mutex */
  5.     rt_uint8_t   original_priority;             /**< priority of last thread hold the mutex */
  6.     rt_uint8_t   hold;                      /**< numbers of thread hold the mutex */
  7.     struct rt_thread  *owner;                /**< current owner of mutex */
  8. };
  9. typedef struct rt_mutex *rt_mutex_t;


 楼主| 一路向北lm 发表于 2021-1-12 10:41 | 显示全部楼层
定义静态互斥量: rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag);
定义动态互斥量:rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);
 楼主| 一路向北lm 发表于 2021-1-12 10:41 | 显示全部楼层
互斥量的操作函数:
创建静态互斥量
rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag);
rt_err_t rt_mutex_detach(rt_mutex_t mutex);
创建和删除动态互斥量
rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);
rt_err_t rt_mutex_delete(rt_mutex_t mutex);
获取互斥量
rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time);
释放互斥量
rt_err_t rt_mutex_release(rt_mutex_t mutex);
 楼主| 一路向北lm 发表于 2021-1-12 10:42 | 显示全部楼层
基于STM32互斥量具体实例:
  1. // 定义共享资源变量
  2. rt_uint16_t  mutex_num1 = 0;
  3. rt_uint16_t  mutex_num2 = 0;
  4. // 定义互斥量控制块
  5. static  rt_mutex_t  mutex_num = RT_NULL;
  6. //创建互斥量
  7. mutex_num = rt_mutex_create("mutex_test",RT_IPC_FLAG_FIFO);
  8. if(mutex_num != RT_NULL)
  9. {
  10.         rt_kprintf("mutex create sucessful\n");
  11. }
  12. else
  13. {
  14. rt_kprintf("mutex create fial\n");
  15.                  return -1;
  16. }
  17. //创建线程
  18.   led1_thread = rt_thread_create("led1",task1,RT_NULL,1024,2,10);
  19.         if(led1_thread != RT_NULL)
  20.                   rt_thread_startup(led1_thread);
  21.   else
  22.                  return -1;
  23.        
  24.         led2_thread = rt_thread_create("led2",task2,RT_NULL,1024,3,5);
  25.         if(led2_thread != RT_NULL)
  26.                   rt_thread_startup(led2_thread);
  27.   else       
  28.            return -1;

  29. // 入口函数
  30. oid task1(void *parameter)
  31. {
  32.     while(1)
  33.                 {
  34.      
  35.                          rt_mutex_take(mutex_num,RT_WAITING_FOREVER);
  36.                    mutex_num1 ++;
  37.                          rt_thread_mdelay(100);       
  38.                          mutex_num2 ++;
  39.                          rt_mutex_release(mutex_num);
  40.                 }        
  41. }


  42. void task2(void *parameter)
  43. {
  44.     while(1)
  45.                 {
  46.                        
  47.                         rt_mutex_take(mutex_num,RT_WAITING_FOREVER);
  48.                         if(mutex_num1 != mutex_num2)
  49.                         {
  50.                           rt_kprintf("mutex is Fial\n");
  51.                         }
  52.                         else
  53.                         {
  54.                            rt_kprintf("mutex is sucessful\n");
  55.                         }
  56.                         rt_mutex_release(mutex_num);
  57.             rt_thread_mdelay(1000);       

  58.                 }       
  59. }


 楼主| 一路向北lm 发表于 2021-1-12 10:42 | 显示全部楼层
效果如下,task1使用互斥量对mutex_num1和 mutex_num2操作的过程中,task2是不能访问的。
767705ffd0c9897f6b.png
磨砂 发表于 2021-2-3 23:43 | 显示全部楼层
会不会有竞争现象
晓伍 发表于 2021-2-3 23:46 | 显示全部楼层
互斥是必不可少的
八层楼 发表于 2021-2-3 23:49 | 显示全部楼层
呵呵呵  这个显示的界面很花心思啊
观海 发表于 2021-2-3 23:52 | 显示全部楼层
小北哥的介绍还是那么详细
guanjiaer 发表于 2021-2-3 23:54 | 显示全部楼层
互斥的话 需要有缓冲时间吗
 楼主| 一路向北lm 发表于 2021-2-4 17:09 | 显示全部楼层
guanjiaer 发表于 2021-2-3 23:54
互斥的话 需要有缓冲时间吗

需要的
 楼主| 一路向北lm 发表于 2021-2-4 17:09 | 显示全部楼层
晓伍 发表于 2021-2-3 23:46
互斥是必不可少的

是啊很重要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部