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.

[参考译文] CC2541:使用 IAR 编译器的 CC2541中的宏失败

Guru**** 2800955 points

Other Parts Discussed in Thread: CC2541

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/796096/cc2541-macro-failure-in-cc2541-with-iar-compiler

器件型号:CC2541

大家好、

CC2541面临着一些不同的问题。

控制器–CC2541

编译器- IAR 8051编译器

我们正在为客户开发定制的引导加载程序。 为了验证存储器、我们定义了最大地址范围以验证存储器范围(无论下载请求是否包含范围)。

#define MAXRANGE          0x3F800

调试时、发现它始终从闪存位置0x18000 (逻辑代码区域)读取。 即组1起始位置。

这样做的原因可能是什么? 您可以建议简短地介绍此问题吗?

提前感谢。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Maharaj,
    您是否编写了自己的引导加载程序以执行 OTA 固件升级操作? 为什么不使用现有的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。
    ECU 中有主节点和从节点。 主器件基于通过 SPI 与主器件连接的 CAN 引导加载程序和从节点(BLE)工作。 我们制作了该 SPI 引导加载程序来重新刷写 BLE 节点。

    基于工具 CAN =>主节点=>SPI comm=>Slave Node
    为了方便使用、我们针对 UDS 投诉了 SPI 引导加载程序。
    此外、我们还使用了闪存驱动程序、某些部分使用了 TI 的代码。
    在存储器检查验证期间、它失败。
    我们再次发现、如果宏被分配给变量、并且该变量被用于验证、则效果良好。
    根据我的假设、如果 MAXRANGE 被用作 RAM 数据、它就可以正常工作。 否则、它将失败。

    我很担心,内存配置中可能缺少一些东西。但我找不到同样的东西。您能有什么建议吗?


    此致、
    马哈拉伊·桑卡兰
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我认为我不理解。 我复制了图片中的代码、并添加了一条 print 语句;

    #define MAXRANGE 0x3F800
    
    UINT32 startAddr;
    uint32 length;
    uint32 endAddr;
    uint8 validateFlag;
    
    uint8 check()
    {
    startAddr = 0x4000;
    length = 0x24000;
    endAddr =(unsigned long) Addr +(unsigned long) length);
    
    if (length!= 0)
    {
    if (startAddr <= MAXRANGE)
    {
    if (endAddr <= MAXRANGE)
    {
    validateFlag = 1;
    }
    其他
    {
    validateFlag = 0;
    }
    }
    其他
    {
    validateFlag = 0;
    }
    }
    返回 validateFlag;
    }
    
    void SimpleBLECentral_Init( uint8 task_id )
    {
    simpleBLETaskId = task_id;
    if (check()){
    
    lcd_write_string ("goood"、HAL_lcd_line_3);
    } 

    这似乎对我有效。 也许您可以为我提供一个代码片段、我可以将其粘贴到 SimpleBLEPeripheral 中以重现您的问题。 否则、IAR 支持可能是最佳选择。

    在变量中使用它实际上并不有意义、只是如果您在全局变量中具有值、它会在与您的代码使用宏运行时不同的时间(可能是引导)从闪存复制到 XData、 它当然也存储在闪存中。 如果这是引导加载程序、您可能已经在活动组周围更改了、或其他更改了。 我不知道。

    此外、也许可以将 UL 添加到 define 中、因此#define MAXRANGE 0x3F800UL 使其成为无符号长整型。 在这种情况下、编译器可能会以某种方式对其进行不同的处理。

    此致、
    Aslak

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

    您好!

    感谢您的回答。

    我在这里附加了我在调试会话中观察到的内容。 获取有关我的问题的更多信息可能会有所帮助。

    我对 XDATA 内存概念感到困惑。

    XDATA–包含常量和字符串、以及我们映射到 XDATA 位置(0x8000-0xFFFF)的组代码。

    如果、MEMTR =(MEMTR & 0x08)| 0x01、则表示 XDATA (0x8000-0xFFFF)具有 BANK0副本的副本。 这是我的理解是否正确?

     

    从附加的文档中、它从组1获取数据的原因可能是什么?

    (引导加载程序区域不使用 BANK1)。

    感谢您的宝贵支持。

    此致、

    马哈拉伊·桑卡兰

    e2e.ti.com/.../Memory-mapping.pdf

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

    您好,Maharaj,

    这有点奇怪。 我可以看到您的 DPTR 为0x8000,这意味着?L_MOV_X 将从将 ROM 映射到 RAM 的 XDATA 段的开头获取 uint32 (项目选项->常规选项->常量和字符串的位置-> ROM 映射为数据)。

    在常规 BLE 项目中、这通常是组1 (寄存器 MEMTR::XBANK = 1)、请参阅 hal_startup.c、其中对此进行了配置。 请注意、对于不同的引导加载项目、这是不同的。

    相同的链接器文件配置:

    //首先是具有程序使用的地址的段(闪存映射为 XDATA)
    -P (CONST) XDATA_ROM_C=0x8000-0xFFFF
    //
    然后是具有十六进制文件中地址的段(闪存组1)
    -P (代码) XDATA_ROM_C_FLASH=0x18000-0x1FFFF
    //最后是 XDATA_ROM_C
    段(最后是 XDATA_ROM_FLASH)/ XDATA_FLASH 初始化程序段/ XDATA_ROM_C
    //我们将闪存映射到 XDATA 地址范围内,而不是将数据复制到 RAM)
    -QXDATA_ROM_C=XDATA_ROM_C_FLASH 

    例如、对于 OAD 项目中的 ImgA、BANK5用作映射到 XData 的"const"组:

    -P (代码) XDATA_ROM_C_FLASH=_BANK5_beg-_BANK5_END

    您的屏幕截图显示了内存浏览器和逻辑代码0x18000 (组1)、但您应该使用 XData 0x8000和以上的代码来查看 DPTR 指向的内容、因为它可能是被映射的另一个组。

    我发现链接器将这个精确的常量放置在"const"组的开头而不放置其他内容、这有点过于偶然。 我真的不知道这是怎么发生的。

    我建议您仔细检查链接器文件的 XDATA_ROM_C_FLASH 设置以及 hal_startup::low_level_init ()/XBANK 方案、并验证它们是否匹配、如果仍有问题、请联系 IAR。 除了我们的项目正在使用的内容外、我们实际上并不了解有关 IAR 的链接器和编译器配置的所有信息。

    此致、
    Aslak