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.

[参考译文] CC1314R10:CC1314 + FreeRTOS 神秘暂停

Guru**** 2812305 points

Other Parts Discussed in Thread: CC1314R10

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1622803/cc1314r10-cc1314-freertos-mysterious-pause

器件型号: CC1314R10

晚上好、

我正在调试 CC1314R10 上 FreeRTOS 的代码端口。 代码会运行、但性能欠佳。 它由两个任务组成、一个任务为以太网提供服务、另一个任务为对讲机提供服务。

我已经设置了几个 DIO、以便使用逻辑分析仪实时跟踪发生的情况。

从切换中可以看出、协议正在运行、但代码中存在 SoM 暂停。

我已经跟踪了这一点,我发现在不规则的间隔,所有活动在任何一个 DIO 的停止 40 ms,表明没有任何任务正在执行。 现在、我在代码中使用一个“延迟计时器“、用于检测加入网络的情况。 该计时器不会在 3ms 内发送、等待加入消息、而不会阻止任务执行。 奇怪的是,这发生在不规则的间隔,但“暂停“持续 40 mS +/- 50 us 左右。

我最初的假设是,我在某处创建了一个(几乎)无止境的循环,但逻辑分析仪显示,所有活动都停止了所述的 40mS。 我没有参考这个大小的计时器。

最糟糕的“时序问题“是以太网数据包的传输、该数据包被分为 6 个段、

并且可以验证为约 1.7ms。  

FreeRTOS 配置显示 tickrate 为 1000ul、即每周期一毫秒(默认)

 

你能给我一个关于发生了什么,或者我应该研究什么来解决这个问题的想法吗?

Gullik

 

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

    尊敬的 Gulik:

    您能分享一下您的逻辑分析仪的屏幕截图吗? 纠正我的错误、您已经为每项任务设置了一个 GPIO、它们在任务开始时变为高电平、完成后变为低电平? 两个任务之间有大约 40ms 的间隙? 或者、GPIO 活动究竟意味着什么?

    40 ms 间隔与任务的特定执行之间是否存在任何关联?

    您是否正在执行任何非易失性存储操作?  

    也许在任何任务未准备好执行时、器件进入睡眠模式? 在这 40 毫秒内、您预计会发生什么? 也许没有安排任务、如何安排任务?  

    此致、

    Daniel

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

    谢谢你丹尼尔

    我将尝试添加屏幕截图。

    GPIO 表示程序中的各种事件、Ch1 到 Ch3 定义的引脚(Sigpinx、其中 x 为 0-3 用于调试目的)

    使用红色和绿色 LED 作为基本 rfUARTBridge 代码示例。

    ch1:时隙时间、即允许节点传输的时间

    CH2:TDMA 控制数据包传输(从呼叫开始到通过无线电完成的 TX)

    CH3:任务到任务通信、由以太网任务设置、在对讲机任务接收时切换、在重新接收时清除

    Ch4:红色 LED、在接收到射频数据包时切换。

    Ch5 绿色 LED、在传输数据包时切换。

    所有这些都在程序执行期间进行切换、并且显示了合理的模式/值。

    突然所有引脚停止切换。 这意味着无线电任务没有执行、以太网任务也没有执行。 以不同的模式显示、

    这些引脚证明了任务切换、输入、输出。  

    这不是特定于任务的。 并且此状态下没有 NVRAM 代码。

    以太网任务的优先级最高、为 5、然后是 4 的无线电任务、因为以太网完全由主处理器处理、无线电部分由处理

    嵌入式 M0 无线电 CPU。 计时器 SVC 由 FreeRTOS 设置为 5、IDLE 设置为 0。

    任务通过 xQueSend 和 xQueReceive 进行通信、只需等待事件(接收或对讲机事件或以太网事件)。

    根据无线电或以太网负载、我期望他们在大约 0.5mS 间隔内交替。 使用了足够数量的缓冲器。

    有一个计时器在 1ms 的周期内运行。 其回调会切换一些计时器、更新 Runtime ++变量。

    该程序中当前使用了两个计时器。 timer_tdm、如果没有回复流量、则重新触发主器件、

    (这已被提前取消(激活)以排除其影响)和 Timer_inv 在 TDMA 传输周期 (3 ms) 中短暂暂停,以允许新节点加入网络。 它的工作原理是在所有插槽都安静时激活虚拟插槽。 除了 Timer_INV 之外、所有事件都是通过发送或接收 TDMA 数据包或以太网流量创建的。

    现在假设这实际上与 FreeRTOS 有关、FreeRTOS 计时器默认情况下以 1000/秒 (= 1ms) 启动、我已将其更改为

    每秒 10000 次、无需明显更改。 我不明白为什么所有停顿都是 40 mS +/- 1%、当我没有可以解释这一点的计时器时。

    休息时间差异很大。

    令人困惑…

    Gullik

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

    尊敬的 Gullik:

    对于调试、您是否可以将 GPIO 添加到空闲任务挂钩、可能以太网和无线电任务都在阻止等待事件、并且系统进入待机状态。

    // 1. Enable the hook in FreeRTOSConfig.h:
    #define configUSE_IDLE_HOOK 1
    
    // 2. Implement the hook function:
    void vApplicationIdleHook(void)
    {
      // Toggle a GPIO every time the idle task runs
      GPIO_toggle(CONFIG_GPIO_DEBUG);
    }

    此致、

    Daniel

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

    您好 Daniel、

    感谢您提供了一个非常有用的提示、我不知道 FreeRTOS 有这个钩子。 我将执行此 操作、还会处理以太网任务的另一个引脚、因为它的作用很小、如果我可以跟踪正在运行的内容、则很容易调试。 我会这样做并报告我找到的内容...

    Gullik