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/MSP-EXP430F5529:借助 TI-RTOS 降低功耗

Guru**** 2618835 points

Other Parts Discussed in Thread: MSP430F5529, MSP430FR6989

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/576222/rtos-msp-exp430f5529-reducing-power-consumption-with-ti-rtos

器件型号:MSP-EXP430F5529
主题中讨论的其他器件:MSP430FR6989

工具/软件:TI-RTOS

在这个问题之后、尝试降低 运行 TI-RTOS 的 MSP430F5529的电流消耗。

在尝试了几个步骤(见下面)后、我仍然无法获得低于~500uA 的电流。 问题:

  • 使用 TI-RTOS 是否会从本质上增加电流消耗?
  • 假设没有发出中断(我已禁用系统节拍)、并且 MCU 处于 LPM3模式、MCLK 频率是否仍会影响电流消耗?

测试程序:

  1. 我已经从一个简单示例项目(gpiointerrupt_MSP_EXP430F5529LP_TI)开始、并将其转换为 MSP-EXP4305529
  2. 禁用 SVM H/L、如 PMM_ex3_lowCurrentConsumption 中所述
  3. 在 gpiointerrupt.cfg 中、禁用时钟模块、并在空闲时配置 LPM3 (请参阅下面的 cfg 文件)

配置脚本:

/*
版权所有(c) 2015-2016、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//



/*========================= 引导配置=================== */
var Boot = xdc.useModule('ti.catalog.msp430.init.Boot');



/*=========== 默认值(模块)配置=================== //
var Defaults = xdc.useModule('xdc.runtime.Defaults');
//
*允许在目标上加载模块名称的标志。 模块名称
*字符串放置在.const 段中以用于调试。
*
*选择一个:
*- true (默认值)
*将此参数设置为 true 将在.const
*段中包含名称字符串,以便更容易调试错误和断言。
*- false
*将此参数设置为 false 将减小.const
*段中的占用空间。 因此、错误和断言消息将包含
*"未知模块"前缀、而不是实际的模块名称。
*/
/Defaults.common$.namedModule = true;
Defaults.common$.namedModule = false;



/*====== 错误配置=================== //
var Error = xdc.useModule('xdc.runtime.Error');
//
*调用此函数以处理所有引发的错误,但与
* Error.raiseHook 不同,此函数负责使用
适当初始化的 Error_Block 完全处理*错误。
*
*选择一个:
*- Error.policyDefault (默认值)
*使用已初始化的 Error_Block 结构调用 Error.raiseHook 并使用
模块的记录器记录*错误。
*- Error.policySpin
*在 while (1)循环中进行陷阱以最大程度地减小目标
*占用空间的简单替代方案。
*使用 Error.PolicySpin 时,将不会调用 Error.raiseHook。
//
//Error.PolicyFxn = Error.PolicyDefault;
Error.PolicyFxn = Error.PolicySpin;

//
*如果 Error.PolicyFxn 设置为 Error.PolicyDefault,则
每当错误模块引发错误时,都会调用此函数*。
*
*选择一个:
*- Error.print (默认值)
*错误通过 System_printf ()进行格式化和输出,以便
于*调试。
*-空
*未格式化或记录错误。 此选项减少了代码占用空间。
*-非空函数
*错误调用自定义用户函数。 有关
更多详细信息、请参阅错误模块文档*。
//
//Error.raiseHook = Error.print;
Error.raiseHook =空;
//Error.raiseHook ="&myErrorFxn";

//
*如果 Error.policyFxn 设置为 Error.PolicyDefault,此选项适用于
* Error.raiseHook 函数可被递归
调用的最大次数*。 此选项限制了无限递归的可能性
、*可能导致栈溢出。
*默认值为16。
*/
Error.maxDepth = 2;



/*========================= Hwi 配置=================== //
var halHwi = xdc.useModule('ti.sysbios.hal.Hwi');
var msp430Hwi = xdc.useModule('ti.sysbios.family.msp430.Hwi');
//
*在空闲循环中检查 Hwi (系统)堆栈溢出。
*
*选择一个:
*- true (默认值)
*检查空闲循环期间系统堆栈溢出的顶字,
*如果检测到错误,则生成错误。
*- false
*禁用运行时检查可提高运行时性能、
并使闪存占用量*减少。
*/
halHwi.checkStackFlag = true;
//halHwi.checkStackFlag = false;



/*====== 空闲配置========================= //
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
//
*空闲模块用于指定
在系统中没有*其他任务正在运行时要调用的函数列表。
*
*此处添加的函数将在空闲任务内连续运行。
*
*函数签名:
* void func (void);
*//idleFunc
("&myIdleFunc");



/*========================= 内核(SYS/BIOS)配置=================== */
var BIOS = xdc.useModule('ti.sysbios.BIOS');
/*
启用 BIOS 库中的断言。
*
*选择一个:
*- true (默认值)
*启用断言以进行调试。
*- false
*禁用断言以减小代码占用空间并提高性能。
//
//BIOS.assertsEnabled = true;
BIOS.assertsEnabled = false;

//
*指定 BIOS 的默认堆大小。
//
BIOS.heapSize = 0;

//
*一个标志,用于确定 xdc.runtime 源是否包含在自定义
*构建的 BIOS 库中。
*
*选择一个:
*- false (默认值)
*预编译的 xdc.runtime 库由用于
编译应用的相应目标提供*。
*- true
* xdc.runtime 库源代码将包含在自定义 BIOS
*库中。 此选项可在代码
*占用空间和运行时性能方面产生最高效的库。
*/
BIOS.includeXdcRuntime = false;
//BIOS.includeXdcRuntime = true;

//
* SYS/BIOS 运行时以库的形式提供
*与应用程序链接*。
SYS/BIOS 产品随附了该库的几种形式。
*
*选择一个:
*- BIOS.LibType_Custom
*针对代码占用空间和
*运行时性能进行了高度优化的自定义构建库。
*- BIOS.LibType_Debug
*自定义编译库、未经过优化
、可*通过调试器单步执行 API。
*
//
BIOS.libType = BIOS.LibType_Non检测 到;
//BIOS.libType = BIOS.LibType_Debug;

//
*运行时实例创建启用标志。
*
*选择一个:
*- true (默认值)
*允许在运行时调用 Mod_create()和 Mod_delete ()
,*需要一个默认堆用于动态内存分配。
*- false
*通过禁止在
运行时调用 Mod_create()和 Mod_delete ()来减少代码占用空间。 对象实例通过
* Mod_construct()构造,并通过 Mod_析 构()析构。
*/
BIOS.runtimeCreatesEnabled = true;
//BIOS.runtimeCreatesEnabled = false;

/*
启用 BIOS 库中的日志。
*
*选择一个:
*- true (默认值)
*启用日志以进行调试。
*- false
*禁用日志记录以减少代码占用空间并提高运行时
*性能。
//
//BIOS.logsEnabled = true;
BIOS.logsEnabled = false;



/*====== 内存配置=================== //
var 内存= xdc.useModule('xdc.runtime.Memory');
//
*内存模块本身只为 IHeap

模块(例如、 HeapMem、HeapBuf)。
//



/*========================= 电源配置======================== */
var Power = xdc.useModule('ti.sysbios.family.msp430.Power');
/*
动态更改空闲模式电源设置。
*
*选择一个:
*- true
*
允许在运行时从中断返回*时动态唤醒 CPU。
*- false (默认值)
*禁用此参数的运行时检查;生成
*小代码保存。
//
//Power.allowDynamicMode = true;
Power.allowDynamicMode = false;

//
*系统进入空闲循环时电源模块的行为。
*
*选择一个:
*- false (默认值)
*禁用省电并忽略电源策略函数。
*- true
*电源模块将电源策略函数插入空闲循环
*在该循环中、它将执行操作以节省功耗
、直到发生下一个 CPU 中断*。 此选项可能会导致调试器与
*目标断开连接。
*/
Power.IDLE = true;
//Power.IDLE = true;

/*
这些选项仅在 Power.IDLE 设置为 true 时适用。 Power.idleMode
*参数决定系统进入空闲循环时的行为。
*
*选择一个:
*- Power.LPM0 (默认值)
*- Power.LPM1
*- Power.LPM2
*- Power.LPM3
*- Power.LPM4
*请参阅相应
* MSP430用户指南的操作模式部分以了解这些模式的详细说明。
//
//Power.idleMode = Power.LPM0;
//Power.idleMode = Power.LPM1;
//Power.idleMode = Power.LPM2;
//Power.idleMode = Power.LPM3;
//Power.idleMode = Power.LPM4;



/*========================= 程序配置=================== IAR

忽略*//* Program.stack。 使用
* IAR Embedded Workbench 中的项目选项来改变系统堆栈大小。
//
if (!Program.build.target.$name.match (/IAR/)){
/*
减小系统堆栈大小(由 ISR 和 Swi 使用)以减少
* RAM 的使用。
//
Program.stack = 768;
}



//
*取消注释以启用将 GNU 目标打印到 CCS 控制台的半主机功能。
*请阅读以下 TIRTOS Wiki 页面以了解有关半主机的更多信息:
* processors.wiki.ti.com/.../TI-RTOS_Examples_SemiHosting
*/

if (Program.build.target.$name.match (/GNU/){//var
SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
}/*



========== 信标配置=================== //
var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
//
*启用对任务优先级挂起队列的全局支持。
*
*选择一个:
*- true (默认值)
*这允许根据待处理任务的优先级为其提供服务。
*- false
*暂挂任务是基于先入先出的服务。
*
*在 ROM 中使用 BIOS 时:
*必须将此选项设置为 false。
//
//semaphore.supportsPriority = true;
semaphore.supportsPriority = false;

//
*允许通过信号量隐式布置事件,
*禁用以保存其他代码。
*
*选择一个:
*- true
*这允许信标模块
同时发布信标和事件*。
*- false (默认值)
*必须显式布置事件以解除阻止任务。
*
///semaphore.supportsEvents
= true;
semaphore.supportsEvents = false;



/*=================== Swi 配置=================== //
var Swi = xdc.useModule('ti.sysbios.knl.Swi');
//
*软件中断是一个包含
要*执行的函数和优先级的对象。 软件中断被优先化、优先任务
*并被硬件中断服务例程抢先。
*
*包括此模块是为了允许在用户的应用程序中使用 Swi。
//



/*========================= 系统配置=================== //
var System = xdc.useModule('xdc.runtime.System');
//
*当系统异常退出时调用中止处理程序。
*
*选择一个:
*- System.AbortStd (默认)
*调用 ANSI C 标准'abort()'以终止应用程序。
*- System.AbortSpin
*一种轻量级中止函数、在 while (1) trap
*函数中无限循环。
*-自定义中止处理程序
*用户定义的函数。 有关
*详细信息、请参阅系统模块文档。
//
//System.ABortFxn = System.ABortStd;
System.ABortFxn = System.ABortSpin;
//System.ABortFxn =“&myAbortSystem”;

//
*系统正常退出时调用 Exit 处理程序。
*
*选择一个:
*- System.exitStd (默认)
*调用 ANSI C 标准'exit()'以终止应用程序。
*- System.exitSpin
*一种轻量退出函数、在 while (1) trap
*函数中无限循环。
*-自定义退出函数
*用户定义的函数。 有关
*详细信息、请参阅系统模块文档。
//
//System.exitFxn = System.exitStd;
System.exitFxn = System.exitSpin;
//System.exitFxn ="&myExitSystem";

//
*最小化系统模块中的退出处理程序数组。 System 模块包括
*一个在 System_atexit()中注册的函数数数组,System_exit()
调用该函数组。 默认值为8。
//
System.maxAtexitHandlers = 2;

//
* System.SupportProxy 定义了 System
*函数的低级实现,例如 System_printf ()、System_flush ()等
*
*选择一对:
*- SysMin
*此模块维护一个内部可配置循环缓冲器,
*存储输出,直到调用 System_flush()。
*循环缓冲区的大小通过 SysMin .bufSize 设置。
*- SysCallback
* SysCallback 允许用户定义的系统 API 实现。
* SysCallback 支持代理的代码占用空间较小
,*可用于提供自定义 System_printf 服务。
*默认的 SysCallback 函数指向存根函数。 请参阅
* SysCallback 模块的文档。
*/
var SysMin = xdc.useModule('xdc.runtime.SysMin');
SysMin。bufSize = 128;
System.SupportProxy = SysMin;



/*=================== 文本配置=================== //
var text = xdc.useModule('xdc.runtime.Text');
//
*这些字符串放置在.const 段中。 将此参数设置为
* false 将节省.const 段中的空间。 错误、断言和日志消息
*将打印原始 ID 和 args、而不是格式化的消息。
*
*选择一个:
*- true (默认值)
*此选项将测试字符串加载到.const 中以方便调试。
*- false
*此选项可减小.const 占用空间。
//
//text.isLoaded = true;
text.isLoaded = false;



/*====== 类型配置=================== */
var types = xdc.useModule('xdc.runtime.Types');
/*
此模块定义了在
* xdc.runtime 软件包中使用的基本常量和类型。
//



/*========================= TI-RTOS 中间件配置================= */
var mwConfig = xdc.useModule('ti.mw.Config');
/*
包括 TI-RTOS 中间件库
*/



/*================== TI-RTOS 驱动程序的配置==== //
var driversConfig = xdc.useModule('ti.drivers.Config');
//
*包含 TI-RTOS 驱动程序
*
选择一个:
*- driversConfig.LibType_Non检测(默认)
*使用针对占用空间和性能进行优化的 TI-RTOS 驱动程序库
*不使用断言或日志。
*- driversConfig.LibType_Instrumented
*使用 TI-RTOS 驱动程序库进行调试、并启用断言和日志。
*/
driversConfig.libType = driversConfig.LibType_noniced;
//driversConfig.libType = driversConfig.LibType_instrumented;



/*=========== 应用程序特定实例========================= //

//*仅将 UARTMon 与 TI 工具链一起使用*/
if (!Program.build.target.$name.match (/IAR/)){
var UARTM= xdc.useModule('ti.tirtos.utils.UARTMon');
}

//
* MSP430需要创建静态 Hwi isnance。
*
*在发生硬件中断的情况下,将运行此处添加的函数。
*
*函数签名
:* void func (UArg);
*/

var hwiParams = new halHwi.Params ();

//将 GPIO 端口号添加为 Hwi 参数*/
hwiParams.arg = 2;
halHwi.create (42、"&GPIO_hwiIntFxn"、hwiParams.47);

/ hwiParwi_hwiParams.47;* hwi_hwiparwiams.cream
1、halwi_hwi_hwiParn"


/*
添加 UART 索引号作为 Hwi 参数。
*此参数用于索引到
board.c 文件中声明的 UART 外设数组*。
*/
hwiParams.arg = 0;
halHwi.create (46、"&UARTUSCIA_hwiIntFxn"、hwiParams);
Power.idleMode = Power.LPM3; 

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

    您使用的是哪个版本的 TI-RTOS?

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

    如何测量功耗?

    请勿在调试模式下测量它、因为它不会进入低功耗模式。

    我在 MSP430FR6989上使用 TI-RTOS、而我的整个电路板可以进入15uA 的低功耗模式。

    还应检查计时器和 ADC 配置、因为它们可以在需要时使主时钟保持活动状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    tirtos_msp43x_2_20_00_06
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Claudio、这是我的设置:
    -万用表与电池串联(器件由电池供电)
    -使用 FET 去抖器对器件进行编程,然后将其断开
    -循环设备电源
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Boaz、

    您提到了“我已禁用系统计时”和“禁用时钟模块”,但这些并未显示在已发布的.cfg 中。

    您能否尝试将下面的行添加到.cfg 中、看看它是否有用?

    BIOS.clockEnabled = false;

    此致、
    文森特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个建议的答案、由于此主题在一周内未激活、建议的答案被标记为验证。 请随意选择"拒绝回答"按钮、并回复更多详细信息。