RT_THREAD线程的同步和通讯

一 线程同步:信号量,互斥量,事件集

信号量:(任何线程都可释放,已经不存在实例,线程递归持有会发生主动挂起(最终形成死锁),优先级反转)

生成者(线程1)-共享数据(临界区)-消费者(线程2)模型中对共享数据的操作;对SPI总线的占有操作要互斥;对临界区的保护rt_hw_interrupt_disable/enable();rt_enter/exit_critical()。

  

                     信号量的等待方式:RT_IPC_FLAG_FIFO/PRIO;

                     信号量的值:还有多少个资源可用(资源计数停车场的空余可用车位数/生成消费模型中的信号量的初始化值=max;开始申请不能运行的初始化值一般为0(相当于工作完成标志flag);锁(二值信号量,初始可用则设为1(成功申请后减一;释放后加1);中断与线程同步(初始为0,中断中释放信号量加1),而中断与线程之间的互斥不能用锁)。获取信号量只要大于0即可以得到资源(等待方式:直接返回(rt_sem_trytake()),挂起,超时等待,死等)。

互斥量(信号量的一种,锁形式存在(互斥锁)。只有占有者释放,支持递归访问且能因采用优先级继承算法防止线程优先级翻转的场合):状态:申请获得后闭锁,释放后开锁(减一,为0可用)

   事件集(一对多,多对多):进行与(关联型事件)或(独立型事件,不可累计):

  32bit,操作方式分为RT_EVENT_FLAG_AND(逻辑与),RT_EVENT_FLAG_OR(逻辑或)以及 RT_EVENT_FLAG_CLEAR(清除标记,线程唤醒后将对应位清零

 发送事件集:让有等待该事件的任务进入就绪;接收事件集:达到条件则就绪否则加入等待列表。

#define EVENT_FLAG3 (1 << 3)
#define EVENT_FLAG5 (1 << 5)

/* 第一次接收事件,事件 3 或事件 5 任意一个可以触发线程 1,接收完后清除事件标志 */
    if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
                      RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
                      RT_WAITING_FOREVER, &e) == RT_EOK)

 /* 第二次接收事件,事件 3 和事件 5 均发生时才可以触发线程 1,接收完后清除事件标志 */
    if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
                      RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
                      RT_WAITING_FOREVER, &e) == RT_EOK)

猜你喜欢

转载自www.cnblogs.com/jieruishu/p/12813517.html