读写不对,
1,利用交换区
1.1a只写,b只读
#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdint.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdint.h>
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,将数组设置为全局变量,不设置为局部变量。全局变量是在堆里申请,局部变量是在栈里申请。