目前我正在和一位同事就架构问题进行讨论。我希望你们中的一些人能通过强烈建议一种方法来帮助解决这个问题。
我们将DSP和Cortex-M3与共享内存耦合在一起。DSP接收来自外部世界的请求,其中一些请求是执行某些无线测试功能,这些功能只能在CM3上完成。DSP写入共享内存,然后通过中断向CM3发送信号。共享内存指示请求是什么以及执行请求所需的任何必要数据(要调到的频道,要读取的射频芯片寄存器等)。
我的偏好是为每个可以在中断中发生的请求生成唯一的事件ID。然后,在离开中断之前,将事件传递到状态机的事件队列,该事件将在专用于RF活动的线程中处理。
我的同事反而想传递一个事件ID(通用RF命令)到状态机,并在状态机接收到这个事件ID后对共享内存区域进行解析。解析后,您将知道需要执行的具体命令。
我不喜欢这种方法,因为您将在任何状态下对共享内存进行解析。您可以将其作为一个函数,但它仍然是应该独立于状态的处理。她不喜欢在中断中解析共享内存的想法。
有什么更好的方法吗?如果有帮助的话,我们将使用Miro Samek的QP框架来实现状态机。编辑:移动statechart到ftp://hiddenoaks.asuscomm.com/Statechart.bmp
这是一个折衷方案:
- 从中断向状态机传递单个事件ID(通用RF命令)
- 创建一个action_function来"解析"共享内存并返回一个特定的命令
- 与
[parser_action_func() == RF_CMD_1]
等一起保护状态图中的RF_EVENT转换
statechart代码生成器应该足够聪明,每个RF_EVENT只执行一次parser_action_func()
。(不知道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()
为解析动作函数。