使用嵌入式系统,为了在增量序列中获得更多分辨率,我有两个变量,一个始终跟随另一个。
具体来说,我使用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 *)¤t32bits; // 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.
你认为这样做有什么问题吗?它会导致一个带有字母序列的问题吗?
谢谢!
答案 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 *)¤t32bits;
或
char *current8bits = (((char *)¤t32bits)+3);
如果您必须对其进行测试,并且您的系统无法向您提供此类信息,则可以在应用程序启动时获取该信息
uint32_t temp = 0x01020304;
uint8_t *temp2 = (uint8_t *)(&temp);
if (*temp2 == 0x01)
{
char *current8bits = (char *)¤t32bits;
}
else
{
char *current8bits = (((char *)¤t32bits)+3);
}
另一个好的解决方案是最高投票和经过检查的答案HERE。