Hi TI team,
開發環璄為:simplelink_cc2640r2_sdk_4_10_00_10
使用範例為:examples\rtos\CC2640R2_LAUNCHXL\blestack\simple_peripheral_oad_offchip
目前做的實驗為開機5秒後停止廣播, 以下是在simple_peripheral_oad_offchip.c 做的程式變動部份:
static Clock_Struct stopAdvClock;
static void stopAdv_clockHandler(UArg arg)
{
uint8_t adv_enable = 0;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &adv_enable);
}
static void SimplePeripheral_init(void)
{
…..
Util_constructClock(&stopAdvClock, stopAdv_clockHandler,
5000, 0, FALSE, FALSE);
Util_startClock(&stopAdvClock);
}
為什麼在5秒後, 執行GAPRole_SetParameter 來關閉ADV, 機子就當機不再廣播了..
開了終端機印出debug string, 5秒後會印出">>>STACK ASSERT" 字串,
請問該如何修正用法? 謝謝.
Kevin Qiu1:
关闭广播使用下面代码试试:uint8_t advertEnabled = FALSE;GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);你在主程序中关闭广播是在5秒延时之前还是之后,程序执行到GAPRole_SetParamete后肯定立即就停止了
Erin Chen:
回复 Kevin Qiu1:
SimplePeripheral_init () 裡預設的程式一開始即開始廣播,
我只設置了一個5秒後的clock, 去關閉廣播,
但始終回應STACKAssert.順帶一提, 程式是download在 CC2640R2F EVB上做驗證的.
Kevin Qiu1:
回复 Erin Chen:
初始化中本来就有个5秒的延时
// Create one-shot clock for internal periodic events.Util_constructClock(&clkPeriodic, SimplePeripheral_clockHandler,SP_PERIODIC_EVT_PERIOD, 0, false, (UArg)&argPeriodic); // How often to perform periodic event (in ms) #define SP_PERIODIC_EVT_PERIOD5000按照你的操作5秒后就将广播关闭了,不会再广播。
关于终端打印STACK Assert,请看这里:
// Open the display if the app has not already done soif ( !dispHandle ){dispHandle = Display_open(Display_Type_ANY, NULL);}Display_print0(dispHandle, 0, 0, ">>>STACK ASSERT");
Erin Chen:
回复 Kevin Qiu1:
Hi Keven,
謝謝您的回覆.但那個clkPeriodic 是在case GAPROLE_CONNECTED 被連線後才會被呼叫Util_startClock(&periodicClock)啟動5秒延遲clock, 此clock 裡的callback handler做的程序也不是關閉ADV.
simple_peripheral_oad_offchip 這範例在一上電話即會自動開始廣播, 我單純只是加個5秒延遲的clock想驗證GAPROLE_ADVERT_ENABLED 是可以用GAPRole_SetParameter來關閉它, 但始終不成功.
是否還有其他建議或程式有需要修正的地方? 謝謝.
Kevin Qiu1:
回复 Erin Chen:
如果你仅是想验证GAPRole_SetParameter是否可以关闭广播,进行以下修改就行了:uint8_t advertEnabled = FALSE;GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);
还是你想关闭广播之后过段时间再打开?
Erin Chen:
回复 Kevin Qiu1:
您好,
我是想做動態廣播的功能, 要切換廣播名稱的流程, 是要先關閉廣播, 然後再update Adv data, 之後再開啟廣播,本來想實驗這樣的流程是否可行.
所以先設了一個開機5秒後關閉adv的動作 , 沒想到就assert了.
Kevin Qiu1:
回复 Erin Chen:
使用uint8_t advertEnabled = FALSE;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);
可以关闭广播,也没有发生STACK ASSERT
Erin Chen:
回复 Kevin Qiu1:
請問您執行的方式, 也是設置一個5秒的clock後, 在clock callback handler裡呼叫關閉廣播嗎?
謝謝
Erin Chen:
回复 Kevin Qiu1:
你使用的範例是否為C:\ti\simplelink_cc2640r2_sdk_4_10_00_10\examples\rtos\CC2640R2_LAUNCHXL\blestack\simple_peripheral_oad_offchip ?
在此範例下的GAPRole_SetParameter ( ) API代入的參數數量只有3個, 不像你用的4個參數設定.
如下
能否幫忙在同個環境下, 試做看看GAPRole_SetParameter 的api是可以成功關閉ADV ? 謝謝.
Kevin Qiu1:
回复 Erin Chen:
我是在simple_broadcaster例程中测的,simple_peripheral_oad_offchip是OAD升级的例程,下载的时候还要烧录bim文件,建议你用simple_broadcaster或者simple_peripheral例程来改,将uint8_t initialAdvertEnable = TRUE;中的true改为FALSE就可以关闭广播了