Closed. This question needs details or clarity. It is not currently accepting answers. Learn more
想改进这个问题吗?添加细节并通过editing this post澄清问题。
5年前关闭。
我面临以下问题。

#define uswap_32(x) \
((((x) & 0xff000000) >> 24) | \
(((x) & 0x00ff0000) >>  8) | \
(((x) & 0x0000ff00) <<  8) | \
(((x) & 0x000000ff) << 24))

get的以下数字作为参数x=0x49074808
为什么我的程序在这里中断/重置??
谢谢
编辑:
我的真实申请说明:
我有一个引导加载程序位于flash起始地址0x0800000u,一直到0x08004000U。
引导加载程序之后,flash中有一个uImage头(取自uboot),大小为0x40。
在我的应用程序中,我只想检查是否有一个正确的uImage头,因为我有两个bootloader版本。一个可以处理uImage类型的图像,另一个不能处理。在最后一种情况下,引导加载程序应用程序之后根本就没有uImage头,而是有应用程序代码!
在应用程序中,我只想检查头crc:
#define UIMAGE_FLASH_ADDRESS     (0x08004000U)
image_header_t *header;
header = (image_header_t *) UIMAGE_FLASH_ADDRESS;
if (image_check_hcrc(header))
    /* do something...*/




static int image_check_hcrc(const image_header_t *hdr)
{
    uint32_t hcrc;
    uint32_t len = image_get_header_size();
    image_header_t header;

    /* Copy header so we can blank CRC field for re-calculation */
    memcpy(&header, (char *)hdr, image_get_header_size());
    header.ih_hcrc = 0;         // byte order independent
    hcrc = crc32(0, (unsigned char *)&header, len);

    return hcrc == image_get_hcrc(hdr);
}

对uswap_32()的调用发生在上述函数的最后一行:
#define uswap_32(x) \
((((x) & 0xff000000) >> 24) | \
(((x) & 0x00ff0000) >>  8) | \
(((x) & 0x0000ff00) <<  8) | \
(((x) & 0x000000ff) << 24))

# define cpu_to_be32(x)     uswap_32(x)
# define be32_to_cpu(x)     uswap_32(x)
#define uimage_to_cpu(x)        be32_to_cpu(x)
#define cpu_to_uimage(x)        cpu_to_be32(x)



#define image_get_hdr_l(f) \
    static inline uint32_t image_get_##f(const image_header_t *hdr) \
{ \
    return uimage_to_cpu(hdr->ih_##f); \
}
image_get_hdr_l(magic)      /* image_get_magic */
image_get_hdr_l(hcrc)       /* image_get_hcrc */
image_get_hdr_l(time)       /* image_get_time */
image_get_hdr_l(size)       /* image_get_size */
image_get_hdr_l(load)       /* image_get_load */
image_get_hdr_l(ep)     /* image_get_ep */
image_get_hdr_l(dcrc)       /* image_get_dcrc */

#define image_get_hdr_b(f) \
static inline uint8_t image_get_##f(const image_header_t *hdr) \
{ \
    return hdr->ih_##f; \
}
image_get_hdr_b(os)     /* image_get_os */
image_get_hdr_b(arch)       /* image_get_arch */
image_get_hdr_b(type)       /* image_get_type */
image_get_hdr_b(comp)       /* image_get_comp */

最佳答案

最好将x赋给宏中的局部变量。否则,如果表达式作为参数传递给宏,则将对其求值4次。例如,uswap(2+3),或者更糟的是,uswap(some_func(x))。
第二个问题-需要为常量添加显式UL类型修饰符。下面是一个更安全的宏版本:

#define uswap_32(x) ({\
    uint32_t _x = (x);\
    (uint32_t)(\
        ((_x & 0xff000000UL) >> 24) | \
        ((_x & 0x00ff0000UL) >>  8) | \
        ((_x & 0x0000ff00UL) <<  8) | \
        ((_x & 0x000000ffUL) << 24)); \
})

关于c - 大字节序交换宏“uswap”导致意外错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21904203/

10-11 22:13