对于操作访问同一个区域,称它为临界区。任务的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个任务运行。
关闭中断
中断锁,当中断关闭的时候,就意味着当前的任务不会被 其他事件打断,也就是当前线程不会被抢占,除非主动放弃了处理器控制权。关闭中断/恢复中断API接口由BSP实现。容易得出,关闭中断的时间必须非常短,如几个机器指令 适用于任何场合
调度器锁
可以响应外部中断,调度器不会立刻执行它,必须等到调用调度器解锁函数。适用场合:线程与线程间同步的场合,不能用于中断和线程之间的同步或通知
信号量 互斥量
轻型的用于解决线程间同步的问题。信号量就像一把钥匙,把一段临界区给锁住,只允许有钥匙的线程进行访问:线程拿到了钥匙,才允许它进入临界区;而离开后把钥匙传递给排队在后面的等待线程,让后续线程依次进入临界区。
在RT-Thread操作系统中实现的是优先级继承算法。优先级继承是通过在线程A被阻塞的期间内,将线程C的优先级提升到线程A的优先级别,从而解决优先级翻转引起的问题。这样能够防止C(间接地防止A)被B抢占。优先级继承协议是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。
事件
事件主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。一个线程可以等待多个事件的触发。
RT-Thread定义的事件有以下特点:
• 事件只与线程相关,事件间相互独立:每个线程拥有32个事件标志,采用一个32 bit
无符号整型数进行记录,每一个bit代表一个事件。若干个事件构成一个事件集;
• 事件仅用于同步,不提供数据传输功能;
• 事件无排队性,即多次向线程发送同一事件(如果线程还未来得及读走),其效果等同
于只发送一次。
使用场合,线程间同步 一个线程或中断服务例程序发送一个事件给事件兑现,而后的代的线程被唤醒并对相应的时间进行处理。但是它与信号量不同的是,事件的发送操作在时间未清除前,是不可累计的,而信号量的释放动作是累计的。
事件另外一个特性是,接收线程可等待多种事件,即多个事件对应一个线程或多个线程。同时按照线程等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量只能识别单一的释放动作,而不能同时等待多种类型的释放。
邮箱
邮箱服务是实时操作系统中常见的任务间通信方法。特点是开销比较低,效率较高。邮箱中每一封邮件只能容纳4个字节(针对32位系统,指针的大小为4个字节,所以一封邮件加好能够容纳 一个指针)。典型的邮箱也称作交换消息。
邮箱是一种简单的线程间消息传递方式,在RT-Thread操作系统的实现中能够一次传递4字节邮件,并且邮箱具备一定的存储功能,能够缓存一定数量的邮件数(邮件数由创建、初始化邮箱时指定的容量决定)。邮箱中一封邮件的最大长度是4字节,所以邮箱能够用于不超过4字节的消息传递,当传送的消息长度大于这个数目时就不能再采用邮箱的方式。最重要的是,在32位系统上4字节的内容恰好适合放置一个指针,所以邮箱也适合那种仅传递指针的情况。