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/CC2650MODA:Util.h 10ms 时钟不能#39;t 在基于外设的简单设计中间歇性失败

Guru**** 2581345 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/724551/rtos-cc2650moda-util-h-10ms-clock-doesn-t-fails-intermittently-in-simple-peripheral-based-design

器件型号:CC2650MODA

工具/软件:TI-RTOS

您好!

我有一个基于简单外设示例的 BLE 设计。 我的应用中需要一个10ms 计时器、我正在创建周期性时钟来实现这一点。 大部分时间工作正常、但我遇到的问题是、10ms 时钟在我的应用中将无法间歇性重启。 我一直在切换一个引脚并在示波器上监控它、对于我所做的一周测试、它至少会在24小时内失败一次。

是否有什么想法会导致时钟发生故障或无法重新启动?

我可以确认、当10ms 计时器停止时、MCU 似乎仍在工作、因为我看到广播重启计时器仍然工作、我仍然可以通过 BLE 进行连接。

我还可以确认、将时钟从10ms 时钟更改为1秒时钟不会产生任何影响、1秒时钟仍将失败。

我们非常感谢您的任何帮助。

谢谢、

Steve

这是我用于创建10ms 时钟的代码:

#define ten_MS_PERIOD_EVT_PERIOD 10.
#define ten_MS_period_EVT 0x0020

// 10ms 计时器的时钟实例
静态时钟结构消息定时器时钟;

静态空 simplePeripheral_clockHandler (UARg 参数)

//存储事件。
事件|= arg;

//唤醒应用程序。
Semaphore_post (SEM);

1) 1)简单外设初始化:

//为10ms 计时器周期性事件创建单次时钟。
Util_constructClock (&tenMsTimerClock、simplePeripheral_clockHandler、
ten_ms_period_evt_period、0、false、ten_ms_period_evt);


2) 2)在 main 中(simplePeripheral_taskFxn (UArg a0、UArg A1)

对于(;)

if (事件和 ten_MS_period_EVT)

事件&=~ten_MS_periode_EVT;

//执行10ms 事件处理
simplePeripheral_tenMsTimerEvent();

//重新启动时钟
Util_startClock (&tenMsTimerClock);

3)静态空 simplePeripheral_tenMsTimerEvent (空)

//设置标志
appTimer.tMsPassedFlag = true;

//在此处切换引脚以验证它是否在示波器上停止

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

    在 simplePeripheral_taskFxn()中,是否经常轮询事件变量? 您是否没有等待信号量?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Edvard:

    我在 simplePeripheral_taskFxn()的主循环中不断轮询事件位。

    让我感到困惑的是、简单外设示例在时钟处理程序中具有以下代码行(见下文)、

    对于信号量_post (sem)、这意味着我应该等待一个信号量来让计时器通过? 不是吗?

    此致、

    Steve

    静态空 SimpleBLEPeripheral_clockHandler (UARg 参数)

    //存储事件。
    事件|= arg;

    //唤醒应用程序。
    Semaphore_post (SEM);

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

    我对这种做法有几点看法。 首先、时钟处理程序中的信标被发布、但代码中没有任何内容在同一信标上挂起。 那么、为什么使用信标?

    此外、我认为使用 SYS/BIOS 中的事件结构正是您想要的。 如果您没有听说过此类事件、请查看以下文档:

    dev.ti.com/.../index.html

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

    是的、我完全同意您的意见。

    我刚刚使用了 TI 提供的示例代码。

    奇怪的是、如果我在时钟处理程序中删除发布信标的那一行代码、那么时钟根本不会触发。

    我还通过为每个时钟提供专用的时钟处理程序和标志来阻止时钟发生故障。 这将使我现在摆脱麻烦。

    感谢您发送 SYS/BIOS 链接、我们将进行通读。

    谢谢、

    Steve