首页 > 编程知识 正文

数字信号处理第四版,数字信号处理

时间:2023-05-04 20:10:33 阅读:246857 作者:2214

目录

一、SYS/BIOS mailbox

二、AWX1843 mailbox

前言:说到mailbox不得不提共享内存区域,它是不同核间数据传输通信的一种方式。

Mailbox作为多处理器系统中处理器间进程同步和数据交换的硬件机制,其优点是应用相对的广,速度快。采用Mailbox的方式,主要是通过传输控制信息的方式进行多处理器通信。根据系统要求,可以定义不同的Mail来实现系统行为。例如:可以定义固定流量的数据传输,也可以定义固定区块的数据传输。通信双方的数据传输,属于片内并行数据传输,因此实时性好,速度快。同时还可以兼容中断和查询模式,减小控制CP U的处理时间压力。如果单纯用于固定的数据传输则Mail设计简单。但如果Mail定义的类型较多,会增加一定的Mail识别难度及识别时间(百度百科https://baike.baidu.com/item/%E5%A4%84%E7%90%86%E5%99%A8%E9%97%B4%E9%80%9A%E4%BF%A1/21870328?fr=aladdin)

一、SYS/BIOS mailbox

邮箱SYS/BIOS系统用来在任务间进行buffer传输的,在邮箱创建的时候配置传输buffer的大小,Mailbox_post()函数执行完成代表,邮箱buffer已经传输到缓冲区,当执行Mailbox_pend()时,就从缓冲区中获得数据。

邮箱的创建:Mailbox_HandleMailbox_create(SizeT   bufsize,

UInt   numBufs,

Mailbox_Params   *params,

Error_Block   *eb)

Void Mailbox_delete(Mailbox_Handle*handle);

Mailbox_pend()是用来从邮箱中读取Bufferde,如果邮箱中没有Buffer就等待timeout 的时间;

Bool Mailbox_pend(Mailbox_Handle handle,

Ptr buf,

UInt timeout);

Mailbox_post()是用来存入Buffer到邮箱,如果邮箱已满,则等待timeout时间;

Bool Mailbox_post(Mailbox_Handle handle,

Ptr buf,

UInt timeout);

二、AWX1843 mailbox

2.1 Mailbox_config

chId邮箱通道ID

  该枚举定义了可能的邮箱通道ID。仅在MSS和DSS之间使用。仅在#Mailbox_ChType的类型为MAILBOX_CHTYPE_MULTI时才使用ID。

在XWR16xx / XWR18xx / XWR68xx 上,此字段仅用于MSS <-> DSS之间的通信,需要进行设置。因此,当打开MSS-DSS之间的通道时,由应用程序相应地进行。

  在XWR16xx / XWR18xx / XWR68xx 上,此字段不用于MSS <-> BSS之间或DSS <-> BSS之间的通信。因此,当MSS或DSS使用BSS打开通道时,应用程序无需设置此字段。

chType通道类型:

MAILBOX_CHTYPE_SINGLE

DSS和MSS之间仅允许一个邮箱通道(每个方向)。 在这种情况下,无需指定字段Mailbox_ChID。

MAILBOX_CHTYPE_MULTI

DSS和MSS之间允许有多个邮箱通道(每个方向)。 在这种情况下,需要指定字段Mailbox_ChID。

由于只有一个邮箱物理通道,因此即使打开了多个通道,应用程序一次也只能使用一个通道。

通过使用不同的Mailbox_ChID在MSS和DSS之间打开邮箱驱动程序的新实例来创建每个通道。

如果以MAILBOX_CHTYPE_SINGLE的形式打开通道,则仅允许一个MSS <-> DSS通道,并且不需要填充Mailbox_ChID。请注意,通道类型不能混合。 也就是说,MSS(或DSS)中类型为MAILBOX_CHTYPE_SINGLE的通道无法与DSS(或MSS)中类型为MAILBOX_CHTYPE_MULTI的通道通信。另请注意,如果打开的通道类型为MAILBOX_CHTYPE_MULTI,则所有通道必须为MAILBOX_CHTYPE_MULTI。

2.2 Mailbox_write()

邮箱一次只能将一条消息发送到远程端点。将数据复制到邮箱缓冲区后,驱动程序触发对远程端点的中断。这意味着对Mailbox_write()的调用始终是一个完整的邮箱事务。只有在远程端点确认了先前的消息之后,才能发送新消息。确认过程由驱动程序在内部处理。

写操作有关的所有中断都由驱动程序管理,并且不会暴露给应用程序。如果调用的数据将超过邮箱缓冲区的最大大小,则写入操作将失败并显示错误代码,什么也不会写入邮箱缓冲区。 返回写入的字节数或错误。邮箱缓冲区的最大大小由#MAILBOX_DATA_BUFFER_SIZE给出。 如果大小大于邮箱缓冲区,则应用程序代码负责消息的分段。

Blocking模式:Mailbox_write()将阻止任务执行,直到消息已从应用程序复制到邮箱缓冲区并从远程端点接收到确认为止。 如果在收到确认之前发出了新的Mailbox_write(),则写入将失败,并向应用程序返回错误代码。

Polling:

Mailbox_write()将阻止任务执行,直到消息已从应用程序复制到邮箱缓冲区,但它不等待来自远程端点的确认。 如果在收到确认之前发出了新的Mailbox_write(),则写入将失败,并向应用程序返回错误代码。 在这种模式下,应用程序不知道何时接收到确认,并且它可能尝试多次写入下一条消息,直到成功为止,就好像它在轮询确认状态一样。

2.3 Mailbox_read()

邮箱一次只能从远程端点读取一封邮件。 可以对邮箱中的同一封邮件进行多个Mailbox_read()调用。

例如。 应用程序可以读取消息的一部分以找出消息的完整长度,然后发出后续的Mailbox_read()。

邮箱驱动程序在内部跟踪读取消息的字节数。 消息的第一个Mailbox_read()始终从零字节开始。 如果对同一封邮件调用多个Mailbox_read(),则后续的读取将从上一个读取停止的位置开始的下一个字节开始。 一旦应用程序完成了对消息的读取,它必须发出Mailbox_readFlush()来释放邮箱缓冲区并通知远程端点。邮箱缓冲区的最大大小由#MAILBOX_DATA_BUFFER_SIZE给出。 如果大小大于邮箱缓冲区,则应用程序代码负责分段消息。与读取操作相关的所有中断均由驱动程序管理,并且不会暴露给应用程序。 返回读取或错误的字节数。

读模式:

在Mailbox_MODE_BLOCKING中:如果这是对新消息的第一次读取,则Mailbox_read()将阻止任务执行,直到新消息到达本地邮箱缓冲区并将其复制到应用程序缓冲区为止。如果这不是新消息,则Mailbox_read()将阻止任务执行,直到将“大小”字节复制到应用程序缓冲区为止。

在Mailbox_MODE_POLLING中:如果这是对新消息的第一次读取,而新消息尚未到达,则Mailbox_read()将返回零大小,以指示未读取任何字节。如果新消息已到达或不是新消息,则Mailbox_read()会将数据复制到应用程序缓冲区。在将“大小”字节复制到应用程序缓冲区之后,Mailbox_read()将返回。

在Mailbox_MODE_CALLBACK中:一旦在邮箱中收到新消息,驱动程序将调用应用程序回调函数。应用程序负责调用Mailbox_read()以读取新消息。 Mailbox_read()将数据复制到应用程序缓冲区中,然后退出。

重要: 在上述任何一种模式下,应用程序完全读取消息后,都需要发出Mailbox_readFlush()。

封装成可靠的通信模块:

参考:

下面这个mailbox block是某种芯片的工作流程,仅作参考使用:

 

 

 

 

 

vue脚手架vue-cli的卸载与安装方式HTML div三边怎么加边框win7中qq截图快捷键是什么

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。