【问题标题】:Is my code in C portable and endianness independent? [closed]我的 C 代码是否可移植且字节序独立? [关闭]
【发布时间】:2018-02-18 17:10:52
【问题描述】:

我想用 C 编写一个小模块,用它们我可以发送和接收 CAN 帧。我的目标是编写一个 100% 可移植、无字节序且独立于编译器的代码。

按照我的代码中的一个小例子。 如果我错了,请给我写信,如果您有更好的建议。

int CAN_FRAME[8] = {1,5,8,15,50,56,78,12};
/* RX Defines */
#define __CONVERT_TO_16BIT(HI_B,LOW_B) (( HI_B << 8  ) | (LOW_B & 0x00FF))
#define __SIG1_MASK 0b00110000
#define __SIG2_MASK 0b00000011
#define __SIG3_MASK 0b00011011
#define __GET_CAN_SIGNAL(POINTER,OFFSET,MASK) ((*(POINTER+OFFSET))&(MASK))
#define GET_LOW_BYTE(VALUE) (unsigned char)(VALUE & 0xFF)
#define GET_HIGH_BYTE(VALUE) (unsigned char)(VALUE >> 8)

/* TX Defines*/
#define PACK_SIGNAL_IN_BYTE(BYTE,VALUE,POS,BITMASK) *BYTE |= (unsigned char) ((VALUE << POS)&(BITMASK))

int main(void)
{

/* RX Simulation*/
int *p = (int*) &CAN_FRAME;
int signal1 = __GET_CAN_SIGNAL(p,4,__SIG1_MASK);
int signal2 =  __GET_CAN_SIGNAL(p,6,__SIG2_MASK);
int signal3 = __CONVERT_TO_16BIT(__GET_CAN_SIGNAL(p,7,__SIG3_MASK),__GET_CAN_SIGNAL(p,6,__SIG3_MASK));

/* Test hi/low defines */
short num =0b0101010100000001;
unsigned char low = GET_LOW_BYTE(num);
unsigned char high = GET_LOW_BYTE(num);

/* TX Simulation. Write only one byte*/
CAN_FRAME[2] = 0;
PACK_SIGNAL_IN_BYTE((CAN_FRAME+2),1,0,0x01);
PACK_SIGNAL_IN_BYTE((CAN_FRAME+2),1,1,0x02);
/* send frame*/
return 0;
}

【问题讨论】:

  • 那些宏定义可以使用更多的括号。
  • __ 开头的名称保留用于实现。
  • 0b 现在是 C 的一部分吗?这是 C11 吗?
  • 我投票结束这个问题,因为它要求进行代码审查:codereview.stackexchange.com
  • 这是什么int *p = (int*) &amp;CAN_FRAME;?为什么不直接做int *p = CAN_FRAME;

标签: c embedded portability


【解决方案1】:

在缺少的括号旁边:

#define GET_HIGH_BYTE(VALUE) (unsigned char)(VALUE >> 8)

不干净(--> 实现已定义),因为 VALUE 是您上下文中的(签名)short。在

#define __CONVERT_TO_16BIT(HI_B,LOW_B) (( HI_B << 8  ) | (LOW_B & 0x00FF))

HI_B &lt;&lt; 8 可能会溢出,这对于有符号类型也是未定义的。

int 似乎根本是不正确的数据类型;我希望 CAN 帧为 uint8_t

short num 也应该是无符号数据类型。

我不知道你为什么要使用宏。我会避免使用它们并使用inline static 函数来代替,这可以为您提供更多的类型安全性(尤其是在签名操作方面),并且会显着提高可读性。

【讨论】:

  • 是的,uint8_t 是 CAN 帧的正确类型,因为有效负载的长度通常在 1 到 8 个 8 位值之间。
猜你喜欢
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2023-04-02
  • 2017-03-11
  • 2015-08-05
  • 2010-11-08
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多