小心内存对齐--GKOSON

https://mp.weixin.qq.com/s/rq3PEc1d57hCd8yjRoq1gw

最近我在做字节序问题 发现一个文章基本一样!

试试里面的神器BUG

void WEIXIN_TEST(void)
{
        uint8_t buf[16];
        uint8_t i;
        uint16_t data;
        for (i=0; i<16; i++)buf[i]=i;
        printf("ORIGIN BUFF::");G_printHEX(buf,16);

        for (i=0; i<16; i+=2)
        {
            data = *((uint16_t *)&buf[i]);
            printf("%04X::\t",data);
        }
        printf("\r\n::::::::::::::::::\r\n");
        for (i=0; i<16; i+=2)
        {
        //data = buf[i]<<8 | buf[i+1];
        data = buf[i+1]<<8 | buf[i];
        printf("%04X::\t",data);
        }
        printf("\r\n::::::::::::::::::\r\n");
        printf("buf addr::%d::\r\n",buf);
}

串口看结果【KEIL--STM32】

可以看到2个办法U8---U16结果一样【里面有字节序问题!】

同时系统默认分配的地址是偶数u!!!

 

继续测试

 

uint8_t buf[16]__attribute__ ((at(0X20001005)));
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void WEIXIN_TEST(void)
{
        //uint8_t buf[16];
        uint8_t i;
        uint16_t data;
        for (i=0; i<16; i++)buf[i]=i;
        printf("ORIGIN BUFF::");G_printHEX(buf,16);

        for (i=0; i<16; i+=2)
        {
            data = *((uint16_t *)&buf[i]);
            printf("%04X::\t",data);
        }
        printf("\r\n::::::::::::::::::\r\n");
        for (i=0; i<16; i+=2)
        {
        //data = buf[i]<<8 | buf[i+1];
        data = buf[i+1]<<8 | buf[i];
        printf("%04X::\t",data);
        }
        printf("\r\n::::::::::::::::::\r\n");
        printf("buf addr::%d::%08X\r\n",buf,buf);
}

测试发现 没有干扰 即使是奇数也OK

 

测试失败

 

继续:前面加入 __align 发现只能是1才能编译

小心内存对齐--GKOSON_第1张图片

你可能感兴趣的:(小心内存对齐--GKOSON)