指针类型小于变量

时间:2015-05-20 12:05:14

标签: c pointers embedded

使用嵌入式系统,为了在增量序列中获得更多分辨率,我有两个变量,一个始终跟随另一个。

具体来说,我使用8位变量设置目标值,但是从一个点(当前值)到另一个点(我使用32位步长)。

例如(这是一个愚蠢的例子,但它只是为了说明我想如何使用它,在我的代码中有一些需要32位变量允许缓慢更改的模板化):

/* The variables */
char goal8bits;         // 8 bits
long int current32bits; // 32 bits    
char current8bits;      // 8 bits    
long int step32bits;    // 32 bits

/* The main function (in the real code that is done periodically with a specific period) */
current32bits = CONVERT_8BITS_TO_32BITS(current8bits);  // E.g: 0xAB -> 0xABABABAB
if (goal8bits < current8bits) {
   current32bits += step32bits;
}
current8bits = CONVERT_32BITS_TO_8BITS(current32bits);  // E.g: 0x01234567 -> 0x01

/* Other parts of the code */
I use current8bits to know the current value in the middle of a transition.

我的问题是,如果我可以使用char指针并使其指向32位变量,那么每次更改它时我都不需要更新它。 上一个示例如下所示:

/* The variables */
char goal8bits;         // 8 bits
long int current32bits; // 32 bits
char *current8bits = (char *)&current32bits;      // Pointer to 8 bits
long int step32bits;    // 32 bits

/* The main function (in the real code that is done periodically with a specific period) */
if (goal8bits < *current8bits) {
   current32bits += step32bits;
}

/* Other parts of the code */
I will use *current8bits to know the current value in the middle of a transition.

你认为这样做有什么问题吗?它会导致一个带有字母序列的问题吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,它是依赖于字节序的代码,为了使它可移植你可以使用一个掩码和左移位运算符:

uint8_t goal8bits = 0x01;               // 8 bits
uint32_t current32bits = 0x01234567;    // 32 bits
uint32_t step32bits = 1;                // 32 bits

if (goal8bits < ((current32bits & 0xFF000000) >> 24)) {
    current32bits += step32bits;
}

答案 1 :(得分:1)

如果您知道系统的无字符,并且它是静态的,则必须从

中进行选择
char *current8bits = (char *)&current32bits;

char *current8bits = (((char *)&current32bits)+3);

如果您必须对其进行测试,并且您的系统无法向您提供此类信息,则可以在应用程序启动时获取该信息

uint32_t temp = 0x01020304;
uint8_t *temp2 = (uint8_t *)(&temp);
if (*temp2 == 0x01)
{
   char *current8bits = (char *)&current32bits;
}
else
{
   char *current8bits = (((char *)&current32bits)+3);
}

另一个好的解决方案是最高投票和经过检查的答案HERE