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.

[参考译文] TMS570LS1224:IAR 编译器的闪存库 F021和 wchar_t 问题

Guru**** 2455360 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/633383/tms570ls1224-flash-library-f021-and-wchar_t-problem-with-iar-compiler

器件型号:TMS570LS1224

您好!

我们使用 F021闪存库进行 EEPROM 仿真、它可以与 IAR Workbench for ARM v8.11.1配合使用。 最新版本8.11.3存在一个大问题。 库不再工作。 在执行闪存擦除命令后、程序仍然停留在 BUSY 标志和擦除标志检查处。

IAR 工作平台的警告(错误)消息如下:

  用于 ARM 的 IAR ELF 链接器 V8.11.3.13950/W32
  版权所有2007-2017 IAR Systems AB。
警告[Lt009]:不一致的 wchar_t 大小
           FlashStateMachine.EnableEepromSecits.obj (F021_API_CortexR4_be.lib)和17个其他对象的 wchar_t 大小为16位
           adc.o 和256个其他对象具有 wchar_t 大小32位
警告[Li026]:模块"FlashStateMachine.EnableEepromSectors.obj (F021_API_CortexR4_be.lib)"(和17个其他模块)不包含支持虚拟的信息  
功能消除
++以下段本来是由 copy 初始化的、但已经初始化了
  排除、因为它们被标记为"初始化可能需要":
    .text:fapi_calculateFletcherChecksum (Utilities.CalculateFletcher.obj (F021_API_CortexR4_be.lib)#11)
    .text:fapi_initializeFlashBanks (FlashStateMachine.InitializeFlashBanks.obj (F021_API_CortexR4_be.lib)#12)
    .text:Fapi_issue1923命令(ASYNC.obj (F021_API_CortexR4_be.lib)#11)
    .text:_Fapi_divideUnsignedLong (FlashStateMachine.InitializeFlashBanks.obj (F021_API_CortexR4_be.lib)#11)
    .text:_Fapi_issueFsmCommand (FlashStateMachine.IssueFsmCommand.obj (F021_API_CortexR4_be.lib)#11)
    .text:_scaleEEFclk (FlashStateMachine.ScaleFclk.obj (F021_API_CortexR4_be.lib)#13)
    .text:_scaleMainFclk (FlashStateMachine.ScaleFclk.obj (F021_API_CortexR4_be.lib)#12)

这似乎是 wchar_t 定义的问题。 IAR wchar_t 为4个字节、该库为 wchar_t 使用2个字节

是否有具有4个字节 wchar_t 的库构建可用?

IAR 中有关 wchar_t 变化的唯一信息如下:

  • 更改了8.10和8.11版中 wchar_t 的大小

    ARM ABI 之后的目标文件具有一个运行时属性,指示的大小wchar_t

    在 EWARM 版本7.80及更早版本中、wchar_t的大小为2字节宽、并相应地设置了运行时属性。

    对于 EWARM 版本8.10、的大小wchar_t为4字节宽、但未更新运行时属性的值。 因此在8.10中、生成的代码为4字节宽wchar_t、但目标文件标记为2wchar_t字节宽。

    在 EWARM 版本8.11中wchar_t、宽度为4字节、并相应地设置运行时属性。

    只看wchar_t这方面有以下影响:
    • 组合使用7.80和8.10构建的目标文件不会触发任何链接器警告,但如果应用程序使用wchar_t,则行为将不可预测。

    • 组合使用8.10和8.11构建的目标文件将触发链接器警告,但即使应用程序使用wchar_t,也应正常工作。

    • 组合使用7.80和8.11构建的目标文件将触发链接器警告,如果应用程序使用wchar_t,则行为将不可预测。

请访问 :netstorage.iar.com/.../iccarm.ENU.html

有什么想法吗?

此致、

Christian

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

    感谢您将 E2E 和其他信息发布到公共网站。 由于我不是 F021闪存 API 软件这些方面的专家、因此我将此事转交给我们的软件主管、由他提供有关如何解决此问题的意见/支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    我想问题是使用的数据格式 wchar_t 这是编译器定义的、可以从8位到64位或更多位。 C 和 C++标准在2011版本中定义了两个新的数据类型 char16_t 和 char32_t 对于闪存库而言、这些类型是更好的决定因素。

    有关数据类型的小注释可在 Wikipedia 中找到:

    C/C++

    CC++ 标准库包括 许多处理 由其组成的宽字符和字符串的工具。 宽字符使用数据类型定义,在wchar_t原始 C90标准中,数据类型定义为

    "一种整型,其值范围可以代表在支持的语言环境中指定的最大扩展字符集的所有成员的不同代码"(ISO 9899:1990§4.1.5)

    C 和 C++ 均引入了固定大小字符类型char16_t、并char32_t在各自标准的2011年修订版中提供了16位和32位 Unicode 转换格式的清晰表示、从而保留wchar_t了实施定义。 ISO/IEC 10646:2003 Unicode 标准4.0规定:

    "的宽度wchar_t特定于编译器、可小至8位。 因此、需要在任何 C 或 C++编译器之间移植的程序不应用于wchar_t存储 Unicode 文本。 wchar_t该类型用于存储编译器定义的宽字符、在某些编译器中可能是 Unicode 字符。"

    链接: https://en.wikipedia.org/wiki/Wide_character#C.2FC.2B.2B

    这可能有助于解决问题。 谢谢。

    此致、

        Christian

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

    你好、Chuck、

    我想问题是使用的数据格式 wchar_t 这是编译器定义的、可以从8位到64位或更多位。 C 和 C++标准在2011版本中定义了两个新的数据类型 char16_t 和 char32_t 对于闪存库而言、这些类型是更好的决定因素。

    有关数据类型的小注释可在 Wikipedia 中找到:

    C/C++

    CC++ 标准库包括 许多处理 由其组成的宽字符和字符串的工具。 宽字符使用数据类型定义,在wchar_t原始 C90标准中,数据类型定义为

    "一种整型,其值范围可以代表在支持的语言环境中指定的最大扩展字符集的所有成员的不同代码"(ISO 9899:1990§4.1.5)

    C 和 C++ 均引入了固定大小字符类型char16_t、并char32_t在各自标准的2011年修订版中提供了16位和32位 Unicode 转换格式的清晰表示、从而保留wchar_t了实施定义。 ISO/IEC 10646:2003 Unicode 标准4.0规定:

    "的宽度wchar_t特定于编译器、可小至8位。 因此、需要在任何 C 或 C++编译器之间移植的程序不应用于wchar_t存储 Unicode 文本。 wchar_t该类型用于存储编译器定义的宽字符、在某些编译器中可能是 Unicode 字符。"

    链接:

    这可能有助于解决问题。 谢谢。

    此致、

      Christian

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

    您好!

    上述问题是否已解决? 我也有类似的问题。  一个选项是将 IAR EWB 降级、以便与库中使用的两个字节 whcar_t 兼容

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

    您好!

    没错。 我们可以降级 IAR Workbench、但我们不会降级。 因此问题仍然存在。

    我认为双方都参与了这个问题。 它不仅是编译器、而且是使用的错误数据类型。

    请解决该问题。 谢谢。

    此致、

        Christian

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

    由于 wchar_t 数据类型大小不匹配、F021闪存库版本02.01.01与最新的 IAR 编译器不兼容。
    wchart_t 为4字节时、没有可用的库。 此外,没有支持这种图书馆的短期计划。
    目前唯一的权变措施是降级 IAR Workbench。

    谢谢、此致、
    Siddharth