【发布时间】:2013-09-27 08:09:43
【问题描述】:
我正在学习 uC/OS 并阅读了这篇文章:
由于不同的微处理器有不同的字长,端口 μC/OS-II 包括一系列类型定义,确保 可移植性 具体来说,μC/OS-II 的代码从不使用 C 的 short、int 和 long 数据类型,因为它们本质上是 不可移植。 相反,我定义了整数数据类型,它们都是 便携且直观,如清单 1.1 所示。另外,为了方便, 我已经包含了浮点数据类型,即使 μC/OS-II 没有 使用浮点数。以下为清单1.1
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef float FP32;
typedef double FP64;
#define BYTE INT8S
#define UBYTE INT8U
#define WORD INT16S
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U
我的问题是:
1- 作者所说的字长是什么意思(我的问题正文中的第一个粗体字)?!
2- 为什么 short int 和 long 数据类型本质上是不可移植的。
3-typedef是微处理器指令,如果是它的作用是什么?!
4- 我可以写typedef unsigned char (anything) 而不是typedef unsigned char INT8U;
5- 为什么作者编码typedef unsigned char INT8U; 然后#define UBYTE INT8U
我不能直接用这个吗typedef unsigned char UBYTE;
6- typedef unsigned char 有双重用途,其中一个是typedef unsigned char INT8U;,另一个是typedef unsigned char BOOLEAN; 他为什么要这样做?!
【问题讨论】:
-
请您也回答问题 5 和 6! @goldilocks
-
5- 我不会在这里过多地阅读作者的技术。这只是个人喜好问题。作者使用 typedef 定义固定宽度数据类型,然后使用宏将另一组术语(BYTE、WORD 等)与固定宽度数据类型相关联。是的,如果您愿意,可以使用 typedef 来定义 BYTE 和 WORD。
-
6- 作者想为 8 位宽的变量和布尔值(一位)定义数据类型,因为任何特定的软件抽象都可能需要这两种数据类型。他计划在比基本数据类型更高的抽象级别上编写代码。因此,当他的代码需要 TRUE/FALSE 变量时,他将使用布尔值。当他的代码需要一个 8 位变量时,他将使用 INT8U。这两种类型在下面碰巧是相同的,但是使用抽象类型为源代码增加了更多意义。当您查看他的代码并看到一个布尔值时,您就会知道它是一个 TRUE/FALSE 变量。
-
看起来我同时这样做了(在下面添加)——但 kkrambo 更简洁一些。
-
我强烈建议使用 C99 stdint.h typedefs;这些是为您的特定目标的编译器和架构定义的,而不是依赖于其他人的端口。我很想根据 stdint.h 类型重新定义所有 uC/OS-II 类型,所以你再也不需要这样做了。然后,您可以安全地互换使用这些类型,避免使用难看的大写类型名称。除此之外,您可能遇到的每个库都会认为定义具有非常相似(或相同)名称的整数类型是一个好主意,并且名称冲突的可能性很高 - 避免!