
非对称多处理(AMP)系统是指在多核处理器的不同内核上运行多个独立的操作系统或实时操作系统实例的系统。SAFERTOS中的Stream buffer流缓冲区机制可以将在一个核上的数据发送到另一个核上执行的任务/中断中,实现多个独立运行SAFERTOS实例的内核之间进行通信。
在SAFERTOS中,stream buffer是单发送者、单接收者模式。
使用配置

使用Stream buffer机制,需在SafeRTOSConfig.h文件中,定义两个配置宏:
• configMAX_SB_LOCK_ATTEMPTS;
• configMESSAGE_BUFFER_LENGTH_TYPE。
configMAX_SB_LOCK_ATTEMPTS用于配置SAFERTOS锁定stream buffer的核间锁的尝试次数,值为0表示锁定尝试的次数是无限的。如果锁定stream buffer的尝试失败,且锁定尝试次数尚未达到最大值,则当前任务将延迟一个时钟周期。如果尝试次数达到最大值,正在执行的API函数将返回错误代码。值为errSB_CORRUPT或errSB_CORRUPT_MESSAGE时,stream buffer处于不连续状态,必须进行重置。
configMESSAGE_BUFFER_LENGTH_TYPE是写入消息缓冲区的消息长度类型。
要在多核环境中使用stream buffer,主机应用程序的链接脚本必须将stream buffer的句柄、StreamBuffer_t结构体以及存储区域缓冲区放置在希望使用stream buffer的内核可访问的共享内存中。
一个内核创建stream buffer,而其他内核在该stream buffer创建完成之前不能与之进行交互。
weak函数实现

针对stream buffer的使用,SAFERTOS提供了10个weak函数。针对不同的处理器体系结构,应用程序需重新实现特定于核的week函数,实现一些核间的交互行为。
即使在单核操作中,Stream buffer功能也会调用一些weak函数。下列weak函数在单核或多核应用中都会调用:
• xStreamBufferAttemptToLock();
• vStreamBufferReleaseLock();
• vStreamBufferRegisterMulticoreRxWaiting();
• vStreamBufferRegisterMulticoreRxTimeout();
• vStreamBufferRegisterMulticoreTxWaiting();
• vStreamBufferRegisterMulticoreTxTimeout().
下列weak函数仅用于多核场景:
• vStreamBufferSendCompletedMulticore();
• vStreamBufferSendCompletedFromISRMulticore();
• vStreamBufferReceiveCompletedMulticore();
• vStreamBufferReceiveCompletedFromISRMulticore().
为了在多核环境中,安全使用stream buffer,应用程序必须实现函数xStreamBufferAttemptToLock()和vStreamBufferReleaseLock(),以防止核间竞争。
除了xStreamBufferAttemptToLock()和vStreamBufferReleaseLock()这两个关键实现外,其它weak函数的默认实现为空的桩函数,这使StreamBuffer和MessageBuffer能够在多核环境中运行,但不会在有空间可用或接收操作超过触发级别时自动解除多核StreamBuffer和MessageBuffer上被阻塞的任务。

图1
当stream buffer需要由当前核独占使用时,stream buffer发送和接收函数内部将调用xStreamBufferAttemptToLock()和vStreamBufferReleaseLock(),以避免核间竞争。
应用程序创建的每个stream buffer都有单独的句柄,通过该句柄实现流缓冲区发送、接收等操作。这个句柄是一个指向该流缓冲区的StreamBuffer_t结构的指针。不能再在xStreamBufferAttemptToLock()和vStreamBufferReleaseLock()函数的实现之修改该结构。
“StreamBuffer_t”结构有一个名为xSpinlock的成员。这个成员由应用定义的xStreamBufferAttemptToLock()和vStreamBufferReleaseLock()函数使用。该成员的初始值为0,对应于锁定状态。锁定状态的值是应用程序定义的。
xStreamBufferAttemptToLock()
vStreamBufferReleaseLock()
用于在流缓冲区和消息缓冲区中阻止任务执行的内部机制是任务通知机制。
实现xStreamBufferAttemptToLock()和vStreamBufferReleaseLock()之外的week函数能够让在另一个核上被阻塞的任务在相关stream buffer的操作完成时立即收到通知。如果没有该实现,被阻塞的任务只有在超时后才会退出阻塞状态。
简单来说,这要求应用维护一个包含核间stream buffer状态以及阻塞的任务的数据结构,并能在其他核上生成中断,以便在适当的时候解除这些任务的阻塞状态。
• vStreamBufferSendCompletedMulticore();
• vStreamBufferSendCompletedFromISRMulticore();
• vStreamBufferReceiveCompletedMulticore();
• vStreamBufferReceiveCompletedFromISRMulticore();
• vStreamBufferRegisterMulticoreRxWaiting();
• vStreamBufferRegisterMulticoreRxTimeout();
• vStreamBufferRegisterMulticoreTxWaiting();
• vStreamBufferRegisterMulticoreTxTimeout()
在图2中可以看到该行为的扩展情况。在xStreamBufferReceive()操作完成之前,此行为与图1中的相同,vStreamBufferReceiveCompletedMulticore()的实现会在核0上触发中断。
这个中断处理程序需要检测哪个任务因等待任务通知而被阻塞以及使用的是哪个流缓冲区。这是通过共享数据来完成的,该数据由vStreamBufferReceiveCompletedMulticore()的应用程序实现所写入。

图2
多核应用

当有一个任务因试图向已满的stream buffer发送数据而被阻塞,在同一内核上的其它任务或中断从该stream buffer接收数据后,被阻塞的任务将重新就绪。一旦它成为系统中的最高优先级任务,就可以运行,将数据发送到stream buffer。请注意,发送任务只有在以下情况下才会启动实际的发送操作:
1. 目标stream buffer中有存放发送至其流缓冲区的数据的空间;
2. 等待向stream buffer发送数据的任务超时,尽可能多的数据将写入流缓冲区。
例如,如果接收方从满的stream buffer中接收到10个字节,而阻塞的发送方将向该stream buffer写入12个字节,那么发送方在发送操作超时之前不会发送这12个字节中的10个。请注意,message buffer不会执行部分发送操作。
为了通知读核有新的数据产生,可以使用从一个核到另一个核的中断。
要通知读内核一个缓冲区写入完成,可以使用API函数vStreamBufferSendCompletedMulticore和vStreamBufferSendCompletedFromISRMulticore。如果另一个核上的任务试图从空的流/消息缓冲区中读取数据并等待数据发送,则调用这些函数。使用这些函数来代替单核场景中的任务通知,并且可以触发等待内核的中断,从而解除等待读取任务的阻塞。
使用vStreamBufferReceiveCompletedMulticore和StreamBufferReceiveCompletedFromISRMulticore函数通知写核可用的缓冲区空间。如果另一个核上的任务试图写满的缓冲区并等待发送数据,则调用这些函数。使用这些函数来代替单核场景中的任务通知,并且可以触发等待核的中断,从而解除等待写入任务的阻塞。
多核应用的一个重要方面是对流/消息缓冲区数据访问的协调。在单核设备上,一次只能有一个任务或中断处于活动状态,如果一个任务需要访问数据结构而不被中断,它可以在临界区内操作。当多个核同时处于活动状态时,必须防止对共享数据结构的并行访问。因此,必须使用锁定机制来确保核对缓冲区数据结构的独占访问。SAFERTOS提供xStreamBufferAttemptToLock和vStreamBufferReleaseLock函数实现此功能。这些函数也是弱定义的桩,应用程序必须基于特定于处理器的实现来协调访问。

图3 多核示例系统
基于流缓冲区机制可以实现任务间实时数据处理,有效地管理任务之间的数据流,确保RTOS应用程序中的高效通信和同步。
麦克泰技术是SAFERTOS在中国的合作伙伴和代理商,具有超过30年嵌入式实时操作系统的市场、服务和培训经验,积极推进预认证的功能安全RTOS在汽车和工业领域的应用,联系info@bmrtech.com。

产品购买(淘宝)

线上课程(网校)
欢迎关注微信公众号【麦克泰技术】,回复 “加群” 按提示可加入技术交流群
产品咨询:
北京:010-62975900
上海:021-62127690
深圳:0755-82977971
分享、在看与点赞,至少我要拥有一个吧
