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/CC1310:assert_isTrue ()

Guru**** 2606905 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/578635/rtos-cc1310-assert_istrue

器件型号:CC1310

工具/软件:TI-RTOS

您好!

我正在实施引导加载程序、并制作了一个简单的项目来验证所有内容。

在这个简单的项目中、我在写入闪存之前使用了以下验证:

/*检查总体边界*/
assert_isTrue (((uint32_t) destAddr >= flash_application_ADDR、0);
assert_isTrue ((((uint32_t) destAddr + nbytes)<(flash_application_ADDR + flash_application_size)、1);

/*检查当 FLASH_DATA_SIZE 超过一页时是否不跨越页边界*/
assert_isTrue ((((uint32_t) destAddr - pageStartAddr + nbytes)<= flash_page_size、2);

/*
确保 driverlib 中的闪存函数位于 ROM 或 SRAM 中、
但不在闪存中。 这是 TI-RTOS 中的正常情况。
*
assert_isTrue (((uint32_t)&FlashProgram >(flash_base_ADDR + flash_size)、3); 

现在、我希望使该引导加载程序尽可能小。 其中一项修改是删除 assert 模块。

我将这些验证替换如下:

/*检查总体边界*/
if (((uint32_t) destAddr < flash_application_ADDR)
{
while (1);
}

if ((((uint32_t) destAddr + nbytes)>(flash_application_ADDR + flash_application_size))
{
while (1);
}

/*检查当 FLASH_DATA_SIZE 超过一页时是否不跨越页边界*/
if ((((uint32_t) destAddr - pageStartAddr + nbytes)> flash_page_size)
{
while (1);
}

/*
确保 driverlib 中的闪存函数位于 ROM 或 SRAM 中、
但不在闪存中。 这是 TI-RTOS 中的正常情况。
*
if (((uint32_t)&FlashProgram <(flash_base_ADDR + flash_size))
{
while (1);<=程序在此处停止!
} 

验证在上面标记的点失败。

"assert_isTrue ((uint32_t)&FlashProgram >(flash_base_ADDR + flash_size)、3)"和"if ((uint32_t)&FlashProgram <(flash_base_ADDR + flash_size)"之间有何区别?

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    assert_isTrue ()要求将模块 assert 配置为启用特定模块的断言,或者通常情况下。 请参阅 rtsc.eclipse.org/.../Assert.html
    用于断言的 ID 通常是来自 XDC 文件的常量、在编写源代码时、该文件的值未知、因此0、1、2和3可能不是正确的值。 请检查链接的文档并验证您的配置脚本是否设置了正确的位以使断言有效。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sasha、

    我认为您不理解问题。

    使用 assert_isTrue ()时一切工作正常。

    更换时出现问题:

    assert_isTrue (((uint32_t)&FlashProgram >(flash_base_ADDR + flash_size)、3); 

    对于:

    if (((uint32_t)&FlashProgram <(flash_base_ADDR + flash_size))
    {
    while (1);<=程序在此处停止!
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果断言未正确配置、则它们只是 NOP。 您的 FlashProgram 地址可能小于 FLASH_BASE_ADDR + FLASH_SIZE、但不会提出断言。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您说可能会发生该问题、但 Assert 函数无法获得该问题。 对吧?

    在这种情况下、我认为该计划不应该起作用。 但它在工作。 这是 wierd。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在检查 FlashProgram 时完全注释、会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    程序正常工作。

    验证(我从示例中获得)是:

    /*
    
    确保 driverlib 中的闪存函数位于 ROM 或 SRAM 中、
    
    但不在闪存中。 这是 TI-RTOS 中的正常情况。
    
    * 

    在.cfg 文件中、TI-RTOS 存储在 ROM 中。 因此、"if ((uint32_t)&FlashProgram <(flash_base_ADDR + flash_size)"不应出现任何问题。 但这不是发生的情况。

    /*========================= ROM 配置======================== //
    *
    *要在闪存中使用 BIOS,请注释掉下面的代码块。
    */
    var ROM = xdc.useModule('ti.sysbios.rom.ROM');
    if (Program.cpu.deviceName.match(/CC26/)){
    rom.romName = rom.CC2650;
    }
    否则(Program.cpu.deviceName.match(/CC13/)){
    rom.romName = ROM.CC1350;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一个单独的问题。 我只是想确定 assert_isTrue 是一个 NOP、并且您的程序的行为与 assert_isTrue 和注释掉'if'检查相同。 我明白了吗?

    至于新问题、我不熟悉 ROM 和闪存地址、但您不应该检查
    if (((uint32_t)&FlashProgram > flash_base_ADDR &&(uint32_t)&FlashProgram <(flash_base_ADDR + flash_size))
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于最近没有活动、我将关闭此主题。

    Todd