仿真调试发现,程序卡在osal_start_system 函数里面,
osal_run_system(); ICall_wait(ICALL_TIMEOUT_FOREVER);这两句话反复执行,
具体完整代码如下
void osal_start_system( void )
{
#ifdef USE_ICALL
/* Kick off timer service in order to allocate resources upfront.
* The first timeout is required to schedule next OSAL timer event
* as well. */
ICall_Errno errno = ICall_setTimer(1, osal_msec_timer_cback,
(void *) osal_msec_timer_seq,
&osal_timerid_msec_timer);
if (errno != ICALL_ERRNO_SUCCESS)
{
ICall_abort();
}
#endif /* USE_ICALL */
#if !defined ( ZBIT ) && !defined ( UBIT )
for(;;) // Forever Loop
#endif
{
osal_run_system();
#ifdef USE_ICALL
ICall_wait(ICALL_TIMEOUT_FOREVER);
#endif /* USE_ICALL */
}
}
请问什么原因导致的?
Viki Shi:
这段代码看不出问题。建议查一下是不是timer每正确启动,即osal_start_timerEx的返回值
user1388075:
回复 Viki Shi:
只要创建另外一个任务就会出现这个问题, 这个系统对多任务支持不友好么?
Viki Shi:
回复 user1388075:
TI rtos支持多任务,应该是使用有问题。建议观看一下相关的技术视频:training.ti.com/getting-started-ti-rtos-chapter-7-using-tasks
user1388075:
回复 Viki Shi:
另外一个任务有这样一段代码:
unsigned int ReadMCP3914_Ave(void* args, unsigned char ch, unsigned char cnt)
{unsigned int ret = 0;volatile unsigned intready, temp = 0, retry = 0;dsMCPControl *handle = (dsMCPControl *)args;
for (unsigned char i = 0; i < cnt; i++){do{ready = handle->ReadReg(MCP_STCOM);ready = ready & mcpReadReg[ch];
Task_sleep(5 * 100);//100ms
} while (ready != 0);
temp = handle->ReadReg(ch) & 0xffffff;ret += temp;}
return ret / cnt;
}程序里面有一个等待adc转换完成的操作while (ready != 0);, 这个对蓝牙通信影响很大?
蓝牙任务的优先级高一些啊,这个系统不是抢占是内核么?
user1388075:
回复 Viki Shi:
另外一个任务,只保留个while(1) TaskSleep(100*100);, 然后蓝牙只能连接上,一个服务也看不到,提示Gatt timeout
Viki Shi:
回复 user1388075:
有可能是内存问题,修改一下stack的大小
user1388075:
回复 Viki Shi:
蓝牙statck改成到1300.可以搜到,但是发不出数据, 改到1600, 蓝牙直接搜不到,但是编译器不提示有内存超过的错误
user1388075:
回复 Viki Shi:
设断点,软件周期性任务进不来if (events & HEARTRATE_MEAS_PERIODIC_EVT){HeartRate_measPerTask();}
Viki Shi:
回复 user1388075:
周期性事件进不来,那还是任务使用有问题,上面的视频看一下
user1388075:
回复 Viki Shi:
但是连接蓝牙适配器通信很稳定