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:
感谢反馈。
不客气!