之前用multi_role工程,现要加上OAD功能,按照文档BLE Enhanced OAD ,Task 2 – Add OAD to Multi Role操作总是失败
所以考虑在simple_peripheral_oad_offchip工程上修改。
环境:SDK 4.4.0.10 CCS 9.3.0.00012 UniFlash 6.2.0.3059 SimpleLink Starter 5.7.5
操作步骤
1,导入simple_peripheral_oad_offchip,用SimpleLink Starter测试OAD成功。
2,删除simple_peripheral_oad_offchip.c .h ;添加multi_role例程的multi_role.c .h
删除 PROFILES/peripheral.c .h 添加multi_role例程的multi.c .h
3,按照BLE Enhanced OAD ,Task 2 – Add OAD to Multi Role文档进行修改。
修改#define MR_TASK_STACK_SIZE 610 为820。测试OAD成功。
4,添加自己修改的定时器,原因:TI提供的定时器相当于事件EVT生效时去执行特定代码,我修改的目的是
事件EVT绑定的是回调函数,这样定时时间到的时候可以让该EVT执行回调函数而不是特定代码。
#define clock_num 20
uint32_t evt[clock_num]={0};
Clock_Struct clock[clock_num];
void init_advanceTimer()
{
uint8_t i;
for(i=0;i<clock_num;i++)
{
evt[i]=(1<<(i+9));
Util_constructClock(&(clock[i]), multi_role_clockHandler, 0, 0, false, evt[i]);
}
}
uint32_t wait_time_arry[clock_num];
Colck_func wait_func_arry[clock_num];
Colck_func callback_fun[clock_num];
void start_AdvanceTimer(uint32_t time,Colck_func func)
{
......
Util_restartClock(&clock[i],time);
......
}
修改multi_role_taskFxn()中的
events = Event_pend(syncEvent, Event_Id_NONE,0xC1FFFFFF, ICALL_TIMEOUT_FOREVER);
在
if(events & OAD_DL_COMPLETE_EVT)
{
L2CAP_RegisterFlowCtrlTask(selfEntity);
}
后面添加
uint8_t i;
for(i=0;i<clock_num;i++)
{
if(callback_fun[i]!=0 && events & evt[i])//事件对应的回调函数存在,且该事件有效
{
Colck_func callback_fun_temp;
callback_fun_temp=callback_fun[i];
callback_fun[i]=0;
callback_fun_temp(0);
}
}
问题由此产生,组合clock_num的大小和MAX_PDU_SIZE大小则有不同的问题
MAX_PDU_SIZE=251 时
当clock_num=8 则OAD成功。
当clock_num=12 选择完固件后,设备打印 OAD malloc fail, cancelling OAD
当clock_num=16 选择完固件后,设备打印>>>STACK ASSERT ***ERROR*** >> DEFAULT SPINLOCK!
当clock_num=20,SimpleLink Starter在 TI EOAD Client waiting for MTU Update 状态超时
MAX_PDU_SIZE=200 时
当clock_num=12 或 16 则OAD成功。
当clock_num=20,选择完固件后,设备打印 OAD malloc fail, cancelling OAD
MAX_PDU_SIZE=120 时 clock_num=20 OAD都成功。
到这里似乎可以得到结论:减小MTU可以获得更多的程序代码区。
因为之前没有OAD的MULTI_ROLE工程移植过来还需要15K的flash空间,恐怕移植过来MTU的值要更小了,目前MAX_PDU_SIZE=120 clock_num=20 FLASH 44953(64%) 69528
想请教一下TI的工程师,上述现象发生的原因是什么?是定时器原因还是flash空间有问题,该怎样才能尽可能提高MTU的同时又有更多的程序代码区?