1

目前,我正在与一位同事进行小型架构争论。我希望你们中的一些人可以通过强烈建议一种方法而不是另一种方法来帮助解决它。

我们有一个 DSP 和 Cortex-M3 与共享内存耦合在一起。DSP 接收来自外部世界的请求,其中一些请求将执行某些只能在 CM3 上完成的无线测试功能。DSP 写入共享内存,然后通过中断向 CM3 发送信号。共享内存指示请求是什么以及执行请求所需的任何必要数据(调谐到的通道、要读取的 RF 芯片的寄存器等)。

我的偏好是为中断中可能发生的每个请求生成一个唯一的事件 ID 。然后在离开中断之前将事件传递到状态机的事件队列,该队列将在专用于 RF 活动的线程中处理。

相反,我的同事希望将单个事件 ID(通用 RF 命令)传递给状态机,并在状态机中接收到此事件 ID 后对共享内存区域进行解析。解析后,您将知道需要执行的特定命令。

我不喜欢这种方法,因为您将在您碰巧处于的任何状态下解析共享内存。您可以将其设为函数,但它仍然是应该与状态无关的处理。她不喜欢在中断中解析共享内存的想法。

对更好的方法有何评论?如果有帮助,我们将使用 Miro Samek 的 QP 框架来实现状态机。

编辑:将状态图移至ftp://hiddenoaks.asuscomm.com/Statechart.bmp

4

1 回答 1

3

这是一个折衷方案:

  • 将单个事件 ID(通用 RF 命令)从中断传递给状态机
  • 创建一个“解析”共享内存并返回特定命令的 action_function
  • [parser_action_func() == RF_CMD_1]使用等保护状态图中的 RF_EVENT 转换。

状态图代码生成器应该足够智能,parser_action_func()每个 RF_EVENT 只执行一次。(不知道 QP 框架是否那么聪明)。

这与“每个请求的唯一事件 ID”具有相同的状态图语义,并避免在中断处理程序中解析共享内存。

附录

状态图中的区别是标记了 N 个转换

----RF_EVT_CMD_1---->
----RF_EVT_CMD_2---->
       ...
----RF_EVT_CMD_N---->

真的

----RF_EVT[cmd()==CMD_1]---->
----RF_EVT[cmd()==CMD_2]---->
        ...
----RF_EVT[cmd()==CMD_N]---->

cmd()解析动作函数在哪里。

于 2013-04-04T19:56:21.810 回答