【问题标题】:Where is unsigned int defined for embedded systems?unsigned int 是在哪里为嵌入式系统定义的?
【发布时间】:2020-08-15 20:03:50
【问题描述】:

使用arm-none-eabi-gcc 工具链。

在使用链接器中的选项-nostdlib 进行 ARM 开发期间,我可以使用 unsigned int、int 等。 但是对于uint8_t,我必须使用--specs=nano.specs,因为它们在newlib 标准库中。

那么unsigned int是如何解决的呢?

我一直在使用 IDE 进行 ARM 开发。因此不知道底层的东西是如何工作的。 当我遇到这些疑问时,正在阅读一些裸机教程。

谢谢。

【问题讨论】:

  • However for uint8_t i have to use --specs=nano.specs, since they are in the newlib standard library. 这几乎不相关。 nano.specs 与小版本的 newlib 库链接(例如,printf 中的 %lld 不起作用)。你可以链接完整版,你可以只#include <stdint.h>文件,甚至在你的代码中做typedef __UINT8_TYPE__ uint8_t(见ex.arm-none-eabi-gcc -dM -E - </dev/null | grep -i uint8)。
  • 编译器作者选择 int、long、short、char 的大小,因为它们是基本的变量类型。然后他们必须制作 stdint.h 以匹配广告的大小,例如 uint32_t。不期望同一目标的两个不同编译器(或版本)具有相同的定义。所以要么检查编译器的大小,要么使用 stdint.h (并检查大小)
  • 我希望你不是说 uint8_t 是在 newlib 库中定义的,那将是一个错误。只有编译器作者知道,它是编译器提供的头文件而不是库提供的头文件......除非......库指向或复制或以其他方式使用编译器提供的头文件。

标签: c arm embedded bare-metal


【解决方案1】:

unsigned int 是 C 标准定义的基本类型(参见 C99 §6.2.5,第 33 页 here),它没有在其他任何地方定义,编译器已经知道如何处理它。

uint8_t 和其他类似类型是实现定义的,因此您可以在库头文件中找到那些定义。

【讨论】:

  • 谢谢。在一个项目中使用 stdlibs 或 newlib 是推荐的还是标准的做法。我不打算使用内存分配、printf 语句。图书馆有什么特别的开销吗?
  • @Hemant 不确定你在问什么,但你通常根本不能使用 stdlib,所以如果你需要任何库函数并且你不想自己实现该函数,你需要使用newlib 或类似的东西。当然使用复杂的函数可能会导致性能开销,但是这真的完全取决于具体情况,不可能事先说。
  • @Hemant <stdint.h> 只是一个没有关联目标代码的头文件,您很可能可以在不链接整个库的情况下使用头文件,因为它没有声明库中定义的任何内容。链接标准库只会链接您实际使用的那些部分。在您的 C 运行时启动(在 main 之前运行的代码)中可能有一个库初始化步骤,因此可能会产生很小的开销。没有这种初始化,大部分库都可以正常工作;它主要与 stdio 和堆管理有关,因此您可以修改或省略它。
  • @Hemant 标准库,包括 newlib 有很多系统调用,裸机意味着没有系统,所以如果你想使用它们,你必须在系统中打补丁,是的,有很多开销。 newlib 是为此设计的,因为您在系统解决方案中修补一个文件/位置,您只需要修补您正在使用的内容,没有分配然后只需返回相关功能的传递,我倾向于让它们都只是返回成功,然后填写我需要的内容。
  • 听起来很傻(但它确实发生了),如果你想使用 stdint.h 然后确保你有正确的,设置你的构建或系统错误,你可能试图定位说一个带有 stdint.h 定义的 ARM 微控制器,它基于您正在开发的 x86-64 主机……如果 sizeof 这不是这里和那里的检查,请种植一些。我会争论任何时候你使用 stdint.h...但是...YMMV
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多