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.

[参考译文] CCS/TM4C1294NCPDT:无法使用 setenv()

Guru**** 3001220 points

Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/921324/ccs-tm4c1294ncpdt-cannot-use-setenv

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

大家好、我有一个使用 GNU GCC v7.2.1编译并正常运行的现有项目。

我最近升级到了 CCS 版本10.1.0.00010、现在尝试使用 GNU GCC v9.2.1。

更改 GNU GCC 版本后,在尝试调用 setenv()后,我的代码会将我转到 FaultISR。

setenv ("TZ"、"CST6CDT"、1); 

有人能不能告诉我这是为什么,以及如何恢复 setenv()的使用?

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

    在 Windows 或 Linux 等托管系统中、操作系统维护或保留环境变量。  在您的情况下、当事情发生时、系统的哪个部分会保留环境变量?

    谢谢、此致、

    乔治

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

    您好、George、

    我不确定环境变量存储在哪个存储器部分。 我使用的是 GNU GCC stdlib 中的 setenv()。 根据 https://www.gnu.org/software/libc/manual/html_node/Environment-Access.html 

    函数: int  setenv  (const char *名称、const char *值、int  replace")

    初稿:| MT-Unsafe const:env | AS 不安全堆锁定| AC 不安全损坏锁定内存|请参阅 POSIX 安全概念。

     setenv 该函数可用于向环境中添加新定义。 名称为  的条目被值‘替换 NAME=值 ”。 请注意 、如果值 为空字符串、这也是正确的。 为此,将创建一个新字符串,    并复制字符串名称和值。  值 参数的空指针是非法的。 如果环境中已包含一个键 名条目 , 则替换 参数将控制该操作。 如果 REPLACE 为零、则不会发生任何情况。 否则旧条目将替换为新条目。

    请注意、您无法使用此函数完全删除条目。

    如果该函数成功,则返回 0。 否则、环境不变、返回值 -1 为和 errno 。

    此函数最初是 BSD 库的一部分、但现在是 Unix 标准的一部分。

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

    我不明白 setenv 是怎么工作的。  如果它可以工作、这意味着有一些类似于操作系统的实体、其中除其他外、保留了所有环境变量。  setenv 函数是此实体接口的一部分。  要了解其工作原因、我需要了解该实体的详细信息。

    谢谢、此致、

    乔治

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

    我能找到的最好的就是这个...  https://code.woboq.org/userspace/glibc/stdlib/setenv.c.html

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

    这似乎是 setenv for Linux 或 Unix 的其他变体的实现。  Linux 是否在 TM4C1294NCPDT 系统上运行?

    谢谢、此致、

    乔治

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

    [引用 user ="George mock] 您的 TM4C1294NCPDT 系统上是否运行 Linux?[/引用]基于 Cortex-M4F 的 TM4C1294NCPDT 没有运行 Linux 的资源。

    [引用 user="George mock]如果它起作用,则意味着有一些类似于操作系统的实体,其中除其他外,保留了所有环境变量。  setenv 函数是此实体接口的一部分。  为了了解其工作原因、我需要了解该实体的详细信息。  TI 提供的 GCC ARM 编译器的 gcc-arm-none-eabi-7-2017-Q4-maor (v7.2.1)和 gcc-arm-none-eabi-9-2019-Q4-maor (v9.2.1)版本包含运行时库的 newlib 版本。

     可以在 GNU Arm Embedded Toolchain 下载的源代码中看到 setenv.c  和 setenv_R.C 源文件中 src/newlib.tar.bz2/newlib/newlib/lib/libc/stdlib 下的 setenv()的 newlib 实现。 newlib 实现使用 malloc 和 realloc 函数来管理堆中存储的环境变量。

    也就是说、如果堆配置不正确、这可能会解释 GCC v9.2.1中的 setenv 故障。

    我尚未尝试使用 GCC ARM 编译器测试 setenv。

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

    我不想承认这个问题超出了我的专业知识范围。  这一天可能会有所不同。  但现在还不是。

    TI 从 该 ARM Ltd 网站获取此 ARM GCC 编译器。  我搜索了它、查找了与 setenv 相关的问题、但未找到任何内容。  欢迎您访问并发布您的问题。

    您是否研究了 setenv 实现中的 malloc 调用无法分配内存的可能性?

    谢谢、此致、

    乔治