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.

[参考译文] RTOS/CC3200:&quot 上的系统桩模块;Task_allblockedFunction()"

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3200

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/588193/rtos-cc3200-system-stucks-on-task_allblockedfunction

器件型号:CC3200

工具/软件: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 函数有关。

这是系统执行以下操作的概述:

  1. 带有 OSI_SLEEP 的环路功能(1000)
  2. 通过回调启动软件计时器。
  3. 超时回叫关闭连接。
  4. AWS SDK 使用计时器关闭连接。
  5. 定时器初始化使用 OSI_SLEEP (1)。
  6. 系统 STUCKS。

嵌套的 OSI_SLEEP 是否会造成问题?

 

我注意到、如果我在回调中调用 AWS SDK 函数(使用计时器)、则一切都正常。

 

我无法解决这个问题。

有什么建议吗?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Fede、

    我假设正在中断上下文中调用计时器回调。

    1.您是否在计时器回调中调用 OSI_SLEEP? 这不是很好。 只能在任务中调用 OSI_SLEEP。
    2.您使用什么函数来关闭计时器回调中的连接(列表中的步骤3)?
    3.您有空闲任务吗? 简单的确认方法是查看 CCS 中的 Tools->ROV->Tasks (它也在 IAR 中提供)。
    4.您是否启用了电源管理? 我假设没有、因为您正在使用调试器(当您进入某些低功耗模式时、仿真会丢失)。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    感谢您的回复。

    我的项目使用 TI_RTOS。 但我从现有项目开始、我没有足够的操作系统配置信息。

    1) 1)是将 OSI_SLEEP 放入回调中。 我需要升级我的计时器回调、以避免使用 OSI_SLEEP。

    2) 2)为了关闭连接、我使用 AWS SDK 提供的函数、该函数用于计时、使用具有不同计时器的软件计时器模块。

    3) 3)我的项目仅基于一项任务。

    4) 4)未启用低功耗模式。 是的、我使用调试器。

    谢谢!