This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC2640:适用于 TI-RTOS 的正确状态机架构

Guru**** 2589035 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/599698/rtos-cc2640-proper-state-machine-architecture-for-ti-rtos

器件型号:CC2640

工具/软件:TI-RTOS

您好!

我正在尝试在 TI-RTOS 中实现状态机。 问题是我只在学校任务中使用了状态机、或者在 Verilog 中使用了 FPGA。 我希望在为 RTOS 中的状态机选择合适的架构时能有所帮助。 如果 Resource Explorer 或 TI Academy 中有示例、请告诉我。 下面、我为我认为应该为状态机执行的操作添加了伪代码、但我之前没有 TI-RTOS 或任何其他 RTOS 方面的经验、因此我不知道是否有更好的解决方案/实施。 如果我不在正确的轨道上、请告诉我。 谢谢。

1.创建 FSM 任务
2.创建已更改的输入信标
3.创建按钮中断->分配给输入更改的回调
4.创建加速计中断->分配给输入更改的回调
5.如果错误变量发生更改,则创建中断->分配给输入更改的回调
6.如果所有良好的变量更改,则创建中断->分配给输入更改的回调
7.如果 battery_critical 变量发生更改,则创建中断->分配给输入更改的回调
8.创建 input_changed_callback
input_changed_callback:
semaphore_post (输入更改了信标)
9. FSM 任务
while (1):
Semaphore_pend (输入更改了信标)

//根据
输入和当前状态确定下一状态

//更新当前状态
= NEW_STATE

// seq.逻辑
每个状态都是其自己的任务,因此只需终止除
当前状态以外的所有任务, 并在
任务尚未启动时恢复或启动该任务 

谢谢、
罗马

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Roman、

    为什么要将每个状态都置于不同的任务中? 除非您的帖子中没有解释这一点的特殊原因、否则我将以与非 RTOS 应用程序相同的方式实现状态机。 有关使用在线函数指针的情况、有几个示例。

    此致、

    Klas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Roman Kuleshov:

    您可以看到 SimpleBLEPeripheral 项目、了解按钮中断、semphore、排队、BLE 服务。 然后、您可以看到 sensortag 项目以了解加速计中断、电池...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >为什么要将每个状态都置于不同的任务中?

    这是我第一次使用 RTOS、所以我不太了解它。 我的想法是、如果每个状态都有自己的任务、我可以为它们提供不同的优先级、这意味着某些关键状态在完成后才会中断。

    >我会在相同的任务中实现状态机、与在非 RTOS 应用程序中实现状态机的方式相同。

    恐怕我不太理解。 对于 FSM、我有一个任务、然后所有状态共享一个任务吗? 还是只为 FSM 和任务执行一项任务?

    >有关使用联机函数指针的示例有多个。

    使用函数指针或使用函数指针实现 FSM 的示例? 这些示例是否特定于 RTOS?

    谢谢。