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.

[参考译文] PM 框架 idle_profile 中的错误:lp3p0_plat_ops.c:使用 enum 作为位字段

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/566128/bug-in-pm-framework-idle_profile-lp3p0_plat_ops-c-using-enum-as-bitfields

器件型号:CC3200SDK
Thread 中讨论的其他器件:CC3200

您好!

我在针对 cc3200的 SDK 1.2.0中的 idle_profile 示例项目中发现了一个错误。  我不知道这是否会影响我、但我想您想知道这一点。

在文件 lp3p0_plat_ops.c 中,枚举 power_modes 类型(来自中间件/soc/cc_pm_ops.h)在 lp3p0_CAN_try_pm_state ()函数中被错误地测试为位掩码。  通过调用 main.c 中 TimerGPIOTask()中的 lp3p0_setup_power_policy()来设置变量 USER_SEL_power_mode,其中参数是 enum power_modes。

默认情况下、编译器会为枚举分配连续的整数值、因此枚举元素 power_policy_sleep、power_policy_standby、     power_policy_hibernate"的值为0、1和2、 两个示例。  当框架调用 lp3p0_CAN_try_pm_state 时、结果将是模式 e_pm_S1永远不会返回 true、因为 if (USER_SEL_POWER_MODE & POWER_POLICE_SLEEP)始终为零(因为 POWER_POLICE_SLEEP 为零)。

同样、未正确使用 e_pm_S3和 e_pm_S4的情况、尽管它们碰巧在编译器分别将1和2分配给枚举 power_policy_standby 和     power_policy_休眠 时正常工作。

如果目的是让应用为允许的功耗模式指定位掩码、那么解决方案可能是将位掩码值显式分配给 cc_pm_ops.h 中的 enum power_modes?

来自 cc3200-sdk\中间 件\soc \cc_pm_ops.h 的代码段:

enum power_modes{
power_policy_sleep、
power_policy_standby、
power_policy_hibernate"
};

lp3p0_plat_ops.c 中的代码段:

//
//
//! \brief 此函数设置系统的电源策略
//!
//! \param power_policy 是设备尝试获取
的最低功耗模式//! 进入
//!
//! 返回无
//
////*********
void lp3p0_setup_power_policy (int power_policy)
{
USER_SEL_POWER_MODE = POWER_POLICE_MODE;
返回;
}

(笑声)

//
//
//! \brief 此功能检查系统是否可以进入较低功耗模式
//!
//! \param 目标是低功耗模式、我们正在检查其特性
//!
//! 如果系统可以进入目标状态,则返回 true,否则返回 false。
////
*************
bool lp3p0_CAN_try_pm_state (enum soc _pm target)
{
bool retval = false;

switch (target){
案例 e_pm_s0:
中断;
案例 e_pm_S1:
if (USER_SEL_POWER_MODE 和 POWER_POLICE_SLEEP){
RetVal = true;
}
中断;
案例 e_pm_S2:
/*if (USER_SEL_POWER_MODE & POWER_POLICE_DEEPSLEEP){
RetVal = true;
}*/
中断;
案例 e_pm_S3:
if (USER_SEL_POWER_MODE 和 POWER_POLICE_STANDBY){
RetVal = true;
}
中断;
案例 e_pm_S4:
if (USER_SEL_POWER_MODE 和 POWER_POLICE_HIBERNATE){
RetVal = true;
}
中断;
默认值:
中断;
}

返回评估;
}

此致、

Kemeron

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

    谢谢发帖! 这看起来是个问题。 如果被接受为错误、则应在下一个 SDK 版本中修复。

    此致、
    Sarah