TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2340R5: 每30毫秒從FFF2進行Notify

Part Number:CC2340R5

我想要在FFF2 每30ms Notify一次
是使用SinpleGattProfile_callback(notifyApp) 通知FFF2 發生change嗎?

因為我這樣做會使程式死當進入while

Yolande Wang:

您好,

想要在 FFF2 每30ms Notify 一次的原由是什么?

一般来说 30 毫秒太频繁了,确实容易死机。

您先试试 200 毫秒是否正常。

,

Ryan:

因為產品需求,所以要讓FFF2每30ms Notify一次。

我更改成usleep(200000),確實可以Notify 但是結果不如預期例如: differents = 5 只要differents >=2 就Notify "2" ,differents == 1 就Notify "1" 並且 break ,differents == 0 就直接break 

每次判斷完 differents 就 -2正常來說Notify顯示的結果應該要是2 2 1,但結果會顯示2 1 1我設立了斷點查看,發現他第二次開始就會跳過SimpleGattProfile_callback

,

Ryan:

如下列程式一樣,第二次判斷開始他會先進入differents等於1的判斷,才會跑到notify那邊,導致我notify出來的結果不如預期

,

Yolande Wang:

Ryan 说:設立了斷點查看,發現他第二次開始就會跳過SimpleGattProfile_callback

可以在此处查看调试内存问题部分: 

https://dev.ti.com/tirex/content/simplelink_lowpower_f3_sdk_7_20_01_10/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index-cc23xx.html#debugging-memory-problems

它可能是在释放 GATT 数据。您可以在SimpleGattProfile_callback中看到这一点。这将调用BLEAppUtil_invokeFunction,它将获取数据、将消息排入队列,然后释放数据。

,

Yolande Wang:

第二次没有跑 SimpleGattProfile_callback ,说明这个时候的 notifyApp ==  0xFF ,可能是因为休眠 200ms 这个动作让 notifyApp 没有被赋予其他值。

,

Ryan:

differents似乎不管宣告成多少,他只會在第一次的時候進到>=2的Notify的read,不管5.7.9都是一樣的結果,並且Notify後續累積的次數都會Notify == 1的值。是我哪邊設定出錯嗎?  還是說是callback那邊阻塞住,導致她會累積到後面才Notify

,

Yolande Wang:

看起来可能是 differents 数目的变化管理有问题,导致无论初值如何,只在第一次满足 >= 2 的条件进行notify。

请确保在每次 Notify 之后正确处理 differents 的值。

下面是代码的修改建议:

if (differents >= 2) {check_dif = differents;for (ucI = 0; ucI < 20; ucI++) {g_tFFF2.pEncryptData[ucI] = 0x02;}notifyApp = SIMPLEGATTPROFILE_CHAR2;if (notifyApp != 0xFF) {SimpleGattProfile_callback(notifyApp);}differents = differents - 2;usleep(200000);
} else if (differents == 1) {// 使用 else if 避免重複判斷check_dif = differents;for (ucI = 0; ucI < 20; ucI++) {g_tFFF2.pEncryptData[ucI] = 0x01;}notifyApp = SIMPLEGATTPROFILE_CHAR2;if (notifyApp != 0xFF) {SimpleGattProfile_callback(notifyApp);}differents = differents - 1;usleep(200000);
}

这样每次 Notify 之后,differents 的值会被正确更新。

如果问题仍然存在,可能需要检查 SimpleGattProfile_callback 函数是否阻塞。

,

Ryan:

問題仍存在,似乎真的是callback有問題,不過我仍找不出哪裡出了狀況,因為BLEAppUtil_invokeFunction有順利的執行完成如果是從SimpleGattProfile_writeAttrCB寫入值,Notify是可以順利更新,但目前我是用自定義的Function 去呼叫SimpleGattProfile_callback或許是跟simpleGattProfile_appCBs有關?

,

Yolande Wang:

确保 simpleGattProfile -> pfnsimpleGattProfile_Change 是有效的函数指针。

可以在 SimpleGattProfile_callback 前后添加打印信息,看是否有执行到。

,

Ryan:

經過確認確實是有效函數,函數的記憶體位址也確實有指到SimpleGatt_changeCB但還是會除了第一次之後,都阻塞在後面才Notify

,

Yolande Wang:

您好,

Ryan 说:在FFF2 每30ms Notify一次

重新看了一下问题,建议如下:

1. 用 Util_constructClock 建一个定时器做定时,不要用 usleep(30000);2. 每30ms 调用一次AESCBC 很可能不够,AES 很耗时

,

Ryan:

但是上面我已經將程式碼簡化,只單純把differents宣告成5,然後每次判斷完-2,在依照判斷將0x01或0x02丟進去Buffer裡面讓他Notify,已經沒有使用AESCBC,並且usleep也從30000改成200000,似乎不像是AESCBC的問題,但我會嘗試使用LGPTimer試試看

,

Ryan:

SimpleGatt_changeCB這個函式用來更新FFF2的Notify,但是我找不到為何呼叫SimpleGattProfile_callback能夠進入SimpleGatt_changeCB,如果能知道原因或許就能夠釐清第二次開始他進不去SimpleGatt_changeCB我嘗試了把differents == 1 的判斷拿掉,發現他第一次Notify完,跳脫while判斷才又在Notify第二次,或許真的是usleep的問題

,

Yolande Wang:

Ryan 说:SimpleGatt_changeCB這個函式用來更新FFF2的Notify,但是我找不到為何呼叫SimpleGattProfile_callback能夠進入SimpleGatt_changeCB,如果能知道原因或許就能夠釐清第二次開始他進不去SimpleGatt_changeCB

检查一下日志,看看有没有更多线索。

是的,不要使用 usleep 函数,最好就是使用创建一个定时器做定时,每 30ms 就 Notify 一次。

,

Ryan:

日志要去哪邊進行查看

,

Ryan:

有Util_constructClock的範例Code可以參考嗎

,

Yolande Wang:

参考 host_test 例程:https://dev.ti.com/tirex/explore/node?node=A__ADDIjqoa9rgQjRE6zK5XCg__com.ti.SIMPLELINK_LOWPOWER_F3_SDK_BLE5STACK_MODULE__58mgN04__LATEST&search=Clock

C:\ti\simplelink_lowpower_f3_sdk_7_40_00_64\examples\rtos\LP_EM_CC2340R5\ble5stack\host_test

,

Ryan:

我使用了LGPTimer,成功Notify出理想值。看來真的是while跟usleep的問題感謝你給我建議!

,

Yolande Wang:

感谢反馈。

不客气!

赞(0)
未经允许不得转载:TI中文支持网 » CC2340R5: 每30毫秒從FFF2進行Notify
分享到: 更多 (0)