工具/软件:TI-RTOS
你(们)好。
我遇到了 TI-RTOS 方面的问题、尤其是 "OSI_SLEEP" 功能方面的问题。
这是我的情况:
- MCU:CC3200
- TI-RTOS
- AWS IoT SDK (C)
我使用 AWS IoT SDK 从 AWS 后端发送和接收数据、并实施了接口层、允许物联网 SDK 使用套接字和计时器。
关于计时器、我构建了一个计时器软件库、该库使用一个硬件计时器并创建多个独立的递减计数器。 当计数器到达“0”时,将调用回调函数。 每当 AWS IoT SDK 需要知道它使用时间模块所经过的时间时。 在软件定时器的初始化过程中、我用1毫秒的延迟调用 OIS_SLEEP。
在我执行此操作之前、一切都正常:
场景:定期轮询 AWS 后端以接收数据。
我创建一个循环、ping AWS 后端并将任务暂停1秒(OSI_SLEEP (1000))。
在以下情况下会跳过循环:
- 发生超时。 当循环中断时、我初始化另一个软件计时器。
- 收到新消息。 此事件会中断循环。
如果超时已过、我调用一个函数来关闭与 AWS 后端的连接、现在系统卡在该函数 Task_allBlockedFunction()中。
/*
=== task_enter ====
*此处是任务的首次调用。
*
*解锁任务调度程序以进入任务,就像我们
*通过 Task_restore()*/
void Task_enter()
{返回一样
if (Task_module->workFlag){
Task_schedule();
}
Task_module->locked = false;
Hwi_enable();
}
void Task_allblockedFunction()
{
易失性 UINT 延迟;
if (Task_allBlockedFunc =Idle_run){
Hwi_enable();
idle_run();
Hwi_disable();
}
否则、如果(Task_allBllockedFunc = NULL){
Hwi_enable();
/*保证短时间启用中断*/
对于(延迟= 0;延迟< 1;延迟++){
;
}
Hwi_disable();
}
否则{
Task_allBlockedFunc();
/*
*禁用 INT 以防万一
* allBlockedFunc 将其保持启用状态
*
Hwi_disable();
}
}
我认为该卡滞与 OSI_SLEEP 函数有关。
这是系统执行以下操作的概述:
- 带有 OSI_SLEEP 的环路功能(1000)
- 通过回调启动软件计时器。
- 超时回叫关闭连接。
- AWS SDK 使用计时器关闭连接。
- 定时器初始化使用 OSI_SLEEP (1)。
- 系统 STUCKS。
嵌套的 OSI_SLEEP 是否会造成问题?
我注意到、如果我在回调中调用 AWS SDK 函数(使用计时器)、则一切都正常。
我无法解决这个问题。
有什么建议吗?
谢谢!