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.

[参考译文] CC2564CSTBTBLESW:FreeRTOS 事件实施与文档不符

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/996249/cc2564cstbtblesw-freertos-event-implementation-contradicts-documentation

器件型号:CC2564CSTBTBLESW

大家好、

我想在此要求一些澄清,当我研究 Bluetopia BTPSKRNL 文档时,BTPS_WaitEvent()指定以下内容:

以下函数负责等待指定的事件发出信号。 应该注意的是,信号具有特殊属性,因为多个线程可以等待事件信号发出,并且每当事件状态信号发出时,对 BTPS_WaitEvent()的所有调用都将返回 true。

然而、CC2564CSTBTBLESW 4.2.1.1将事件作为二进制信号量来实现,并使用 FreeRTOS xSemaphoreTake()调用来实现此方法。 xSemaphoreTake ()始终保持二进制信号量的状态为非信号、信号状态仅保留在返回值中。 因此、此 API 的抽象要求与它的实现方式之间存在直接矛盾。 由于这个问题似乎还没有被发现、这是否意味着 Bluetopia 的内部行为已经被改变以适应二进制信标的不同行为? 或者,此 API 的使用方式使其在结束时不会产生任何影响(例如,BTPS_WaitEvent()始终后跟 BTPS_ResetEvent()调用)?

对于记录、FreeRTOS 有一个同步对象、其行为与文档所期望的对象、即事件组(例如 xEventGroupWaitBits (event、1、pdFALSE、pdfFALSE、DecrementWait))。

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

    尊敬的 Benedek:

    您提出了一个值得探索和理解的有趣观察结果。

    观察 BTPS_WaitEvent()函数的实现,它看起来好像只是尝试获取二进制信标。 此实现本身不会产生问题、但仅当与函数的文档相比时才会出现问题、该文档确实表明当事件发出信号时、所有调用都应返回 true。

    正如您指出的、Bluetopia 协议栈中的事件实施已存在多年、因此不太可能成为未发现的问题。 查看 Linux Bluetopia 实现、它似乎也使用二进制信标。 我随函附上、供您参考:

     /cfs-file/__key/communityserver-discussions-components-files/538/BTPSKRNL.c

    现在,大量使用了 Linux 实现,如果这种 BTPS_WaitEvent()实现是一个错误,那么它可能以前就已经被注意到了。 我还在研究如何在堆栈内部使用该函数、但这可能需要更长的时间、因为堆栈中有数千个调用分布。

    此时、我的假设是、对于任何给定的事件、每次只会有一个线程等待它。 因此、您可以说此 API 的使用方式在结尾没有任何影响 不过、我会继续检查以确保情况确实如此。

    我建议您查看随附的 Linux BTPSKRNL 实现、以检查它是否与 FreeRTOS Bluetopia 实现相匹配、从而仔细检查我们的理解。

    此致、

    Michael