我想要在FFF2 每30ms Notify一次
是使用SinpleGattProfile_callback(notifyApp) 通知FFF2 發生change嗎?
因為我這樣做會使程式死當進入while
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.
我想要在FFF2 每30ms Notify一次
是使用SinpleGattProfile_callback(notifyApp) 通知FFF2 發生change嗎?
因為我這樣做會使程式死當進入while
您好,
想要在 FFF2 每30ms Notify 一次的原由是什么?
一般来说 30 毫秒太频繁了,确实容易死机。
您先试试 200 毫秒是否正常。
因為產品需求,所以要讓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
設立了斷點查看,發現他第二次開始就會跳過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,它将获取数据、将消息排入队列,然后释放数据。
第二次没有跑 SimpleGattProfile_callback ,说明这个时候的 notifyApp == 0xFF ,可能是因为休眠 200ms 这个动作让 notifyApp 没有被赋予其他值。
differents似乎不管宣告成多少,他只會在第一次的時候進到>=2的Notify的read,不管5.7.9都是一樣的結果,並且Notify後續累積的次數都會Notify == 1的值。是我哪邊設定出錯嗎? 還是說是callback那邊阻塞住,導致她會累積到後面才Notify
看起来可能是 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 函数是否阻塞。
問題仍存在,似乎真的是callback有問題,不過我仍找不出哪裡出了狀況,因為BLEAppUtil_invokeFunction有順利的執行完成
如果是從SimpleGattProfile_writeAttrCB寫入值,Notify是可以順利更新,但目前我是用自定義的Function 去呼叫SimpleGattProfile_callback
或許是跟simpleGattProfile_appCBs有關?
确保 simpleGattProfile -> pfnsimpleGattProfile_Change 是有效的函数指针。
可以在 SimpleGattProfile_callback 前后添加打印信息,看是否有执行到。
您好,
在FFF2 每30ms Notify一次
重新看了一下问题,建议如下:
1. 用 Util_constructClock 建一个定时器做定时,不要用 usleep(30000);
2. 每30ms 调用一次AESCBC 很可能不够,AES 很耗时
但是上面我已經將程式碼簡化,只單純把differents宣告成5,然後每次判斷完-2,在依照判斷將0x01或0x02丟進去Buffer裡面讓他Notify,已經沒有使用AESCBC,並且usleep也從30000改成200000,似乎不像是AESCBC的問題,但我會嘗試使用LGPTimer試試看
SimpleGatt_changeCB這個函式用來更新FFF2的Notify,但是我找不到為何呼叫SimpleGattProfile_callback能夠進入SimpleGatt_changeCB,如果能知道原因或許就能夠釐清第二次開始他進不去SimpleGatt_changeCB
我嘗試了把differents == 1 的判斷拿掉,發現他第一次Notify完,跳脫while判斷才又在Notify第二次,或許真的是usleep的問題
SimpleGatt_changeCB這個函式用來更新FFF2的Notify,但是我找不到為何呼叫SimpleGattProfile_callback能夠進入SimpleGatt_changeCB,如果能知道原因或許就能夠釐清第二次開始他進不去SimpleGatt_changeCB
检查一下日志,看看有没有更多线索。
是的,不要使用 usleep 函数,最好就是使用创建一个定时器做定时,每 30ms 就 Notify 一次。
C:\ti\simplelink_lowpower_f3_sdk_7_40_00_64\examples\rtos\LP_EM_CC2340R5\ble5stack\host_test