社论
RTOS 101:信号量和队列
发布12/13/2016
作者:Terri Hawker,产品管理副总裁
实时操作系统(RTOS)的使用在嵌入式软件设计中越来越普遍。RTOS可以很容易地将代码分成更小的块和任务,这些任务看起来是并行执行的,并且彼此独立,正如RTOS 101系列的第一篇文章中所描述的那样。
IntervalZero的RTOS(实时操作系统)平台是一个标准的预集成应用程序开发平台,允许公司专注于交付增值应用程序。IntervalZero的RTX和RTX64软件取代了fpga和dsp来满足硬实时需求,从根本上降低了开发成本,并显著提高了嵌入式系统的质量。
在实践中很少有完全独立的任务。在许多情况下,需要在特定事件中激活任务,例如,从中断服务例程或从请求服务的另一个任务中激活。在这种情况下,任务通常需要接收相关输入,即参数。此外,任务通常需要共享硬件资源,例如通信接口,该通信接口一次只能由一个任务使用,即相互排除,一种同步。缺乏经验的开发人员可能会尝试以用于此目的的全局变量,但是实现线程安全通信是棘手的,如果在关键点处的任务交换机击打任务切换攻击,则会失败的家庭烹饪解决方案。例如,考虑这种情况:
1:虽然(com1_busy);//如果忙,请等到自由
2: COM1_busy = 1;
3: SendBytes (COM1、数据);
4:com1_busy = 0;
初始循环(第1行)似乎提供了对COM1接口的独占访问(第3行),但如果使用RTOS,这通常不是一个安全的解决方案。它可能工作次数最多,也许经常通过所有的测试,但是如果一个中断罢工在最初的循环在第2行第1行但是在作业之前,这导致的事,第二个任务可以进入临界区之前第一个任务完成为止。实现线程安全临界区需要禁用中断或使用原子“test-and-set”的特殊指令。考虑到这一点,通常使用用于此目的的RTOS服务更容易(也更安全!)。
IntervalZero的RTOS提供了两种常见的机制,用于在任务之间以及中断例程和任务之间进行安全通信和同步:
- 信号量:RTSS信号量对象是一个同步对象,可在零和指定的最大值之间维护计数。每次线程完成等待代谢物对象时,计数减少;通过信号量释放的可变量增加计数。当计数达到零时,信号量对象的状态不再发出信号,并且在某些线程增加计数之前,不再发出信号可以在信号量对象上完成等待。
- 互斥锁:RTSS互斥锁对象是一个同步对象,当它不属于任何线程时,它的状态是有信号的;当互斥锁属于某个线程时,它的状态也是没有信号的。互斥对象仲裁对共享资源的独占访问。
优先级反转是导致火星探路机关的NASA问题。这意味着通过较低的优先级任务意外地延迟了更高的优先级任务,该任务通常在使用固定优先级调度时通常在rtoss中不可能。然而,这可能发生这种情况,例如,如果高优先级任务(“任务H”)需要采取当前由较低优先级任务(“任务L”)保持的互斥锁。这块块任务H在互斥锁可用之前,由于通常仅在关键部分期间仅为简要的持续时间保持短暂的持续时间,通常不是问题。
然而,如上所示,如果一个不相关的中等优先级任务(“任务M”)进入并抢占任务L,阻塞可能会变得更长,从而延迟任务H正在等待的互斥锁的释放。这种现象被称为优先级倒置。大多数RTOS为互斥对象提供了“优先级继承”(priority Inheritance)(或其他类似的协议),当其他高优先级的任务被互斥对象阻塞时,会提高所有者任务的调度优先级,从而避免中等优先级任务的干扰。优先级倒置也可能发生在队列和其他类似的原语中,如客户案例:神秘的watchdog重置中所述。
Percepio TraceAlyzer允许您查看应用程序所做的大多数RTOS调用,包括在主跟踪视图的垂直时间线上的信号量和互斥锁的操作,与任务调度,中断和记录的应用程序事件并行。
通过在主跟踪视图中单击任何信号量、队列或互斥锁事件,您将打开选中对象的内核对象历史视图,如下所示,显示带有该特定对象的所有操作和状态的单独时间轴。您可以双击该视图以在主跟踪视图中找到相应的事件。
对于队列对象,您还可以获得缓冲区中任意点的消息数量的可视化显示,甚至可以跟踪从发送到接收的消息,反之亦然。对于互斥对象,您可以看到当前所属任务的名称。
TraceAlyzer还通过诸如队列,信号量和互斥锁的内核对象提供任务与中断之间的交互概述。这为基于跟踪提供了运行时架构的高级插图,并且您甚至可以在跟踪中为指定的间隔生成此项。一个例子如下所示。矩形表示任务和中断,而省略号表示队列或信号量。互斥蛋白显示为六边形。由于有时二进制信号量被用作互斥锁,因此基于它们的使用模式进行互斥锁的分类,因此如果使用像互斥锁,即拍摄和给出相同的任务,则信号量对象也可以用六边形显示。
Tracealyzer为基于rtos的嵌入式软件的调试、验证和性能分析提供了极好的解决方案。您可以了解RTOS是如何执行应用程序的,包括任务之间通过信号量、互斥和队列的交互,以及阻塞和超时。这为了解运行时世界提供了宝贵的见解,并促进了基于rtos的嵌入式软件的开发、验证和调试。Tracealyzer也可用来分析Linux系统。
Tracealyzer可用于IntervalZero的RTX64 3.0产品。RTX64是IntervalZero RTOS平台的关键组件,该平台由x86和x64多核多处理器、Windows和实时以太网(如EtherCAT或PROFINET)组成,其性能优于实时硬件(如dsp),并从根本上降低了需要确定性或硬实时的系统的开发成本。