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.

oad_offchip_app工程 增加代码量导致设备异常问题

Other Parts Discussed in Thread: UNIFLASH

之前用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的同时又有更多的程序代码区?