flash读写总是不对,因为没有字节对齐,对齐方法

读写不对,

1,利用交换区

1.1a只写,b只读

#include 
#include 

int main() {
    uint8_t *a=(uint8_t *)0xe0320000;//有效地址
    uint8_t *b=(uint8_t *)0xe0330000;//有效地址
    int i;
    for(i=0;i<4096;i++)
    {
        *(uint8_t *)(a+i)=126;
    }
    ssi_qsip_init();
    page_earse(0x0f4000);
    qspiflash_write(0x0f4000,a,4096);
    qspiflash_read(0x0f4000,b,4096);
    for(i=0;i<4096;i++)
    {
        printf("b[i]=%d",i,*(uint8_t *)(b+i));
        if((i+1)%8==0)
            printf("\n");
    }
    return 0;
}

1.2交换区,写读就用一个,写入flash,先写入交换区的地址,在通过交换区的地址写入flash;读先读到交换区,在memcpy到自己想传到的变量。

2,手动计算地址偏移

#include 
#include 
#include 

int main() {
    uint8_t *a = (uint8_t *)malloc(10 + 31);
    uint8_t *aligned_a = (uint8_t *)(((uintptr_t)a + 31) & ~31);

    printf("a's address: %p\n", a);
    printf("aligned_a's address: %p\n", aligned_a);

    free(a);

    return 0;
}

3,使用编译器特性

#include 
#include 

struct alignas(32) aligned_struct {
    uint8_t data[32];
};

int main() {
    uint8_t a[10] __attribute__((aligned(32)));

    printf("a's address: %p\n", a);

    struct aligned_struct s;
    printf("s's address: %p\n", &s);

    return 0;
}

4,将数组设置为全局变量,不设置为局部变量。全局变量是在堆里申请,局部变量是在栈里申请。

你可能感兴趣的:(算法,c++,数据结构)