stm32怎样存取超大静态数组
答案:2 悬赏:60 手机版
解决时间 2021-03-18 10:55
- 提问者网友:浮克旳回音
- 2021-03-18 06:52
stm32怎样存取超大静态数组
最佳答案
- 五星知识达人网友:从此江山别
- 2021-03-18 07:45
char *p;
p= (char *)常量地址;
C语言中只有同类型变量才能赋值,常量类型赋值给指针必须做强制类型转换。假设静态数组位于0x3000 0000,那么取数据时可以写成
char *p;
p= (char *)0x3000 0000; // 指向0x3000 0000
x=*p; // 取数据
p= (char *)常量地址;
C语言中只有同类型变量才能赋值,常量类型赋值给指针必须做强制类型转换。假设静态数组位于0x3000 0000,那么取数据时可以写成
char *p;
p= (char *)0x3000 0000; // 指向0x3000 0000
x=*p; // 取数据
全部回答
- 1楼网友:長槍戰八方
- 2021-03-18 08:24
你是否是遇到这样问题:
比如定义一个数组unsigned char arry[NUM];因为想要这个数组非常大,也就是说这个NUM非常大,超过了堆栈的大小,程序就会报错而编译不通过,然后你想换种方法解决是吗?
如果是的话有两种方法可解决:
1、扩大堆栈容量,如果是keil编写代码的话,那么更改堆栈大小在相应的启动文件xxx.s中修改;如果是IAR编写代码的话,那么更改堆栈大小在相应的xxx.cif文件中修改。更具体的过程你就自行度娘了。
2、对绝对地址空间的访问,并且要满足一个前提:访问的对决地址空间必须要在堆栈的范围之外,否则的话会破坏堆栈内容而导致程序跑飞(个人推荐使用该方法)。以STM32F103ZET6为例,该型号的SRAM空间为0x20000000--0x2000ffff,共64KB,我想定义一个数组unsigned char arry[4096],并且想让该数组放在起始地址为0x2000e000的SRAM空间(尽量放在SRAM空间后面,避免堆栈只用到这些空间),那么可以这么做:
unsigned char *arry; //定义一个指针变量
arry = (unsigned char *)0x2000e000; //令指针指向地址0x2000e000处
那么接下来你就可以随便这么用了:
arry[0] = 0;
arry[100] = 1;
arry[1000] = 100; //等等
甚至你可以这么用:arry[5000] = 10; //只要范围不超处SRAM空间都是可以的。
再说一次:前提是这部分空间不再堆栈的范围之内,否则程序跑飞后果自负。追问那你知道怎样将数组放到指定位置吗 是不是这样写:
const u8 ziku[] __attribute__((at(0x20002000)))={……追答网上有这么说的,但我实际没有使用过,在keil中这么写不知道,但在IAR中这么写会报错肯定是不行的,而且你定义的该数组是放在SRAM中,所以前缀应该是static u8...而不是const u8...,const u8 是放在Flash中。
其实你完全可以这样:
static u8 *ziku = (u8 *)0x20002000;
然后这样使用:
ziku[0] = a;
ziku[1] = b;
也是完全没有问题。
比如定义一个数组unsigned char arry[NUM];因为想要这个数组非常大,也就是说这个NUM非常大,超过了堆栈的大小,程序就会报错而编译不通过,然后你想换种方法解决是吗?
如果是的话有两种方法可解决:
1、扩大堆栈容量,如果是keil编写代码的话,那么更改堆栈大小在相应的启动文件xxx.s中修改;如果是IAR编写代码的话,那么更改堆栈大小在相应的xxx.cif文件中修改。更具体的过程你就自行度娘了。
2、对绝对地址空间的访问,并且要满足一个前提:访问的对决地址空间必须要在堆栈的范围之外,否则的话会破坏堆栈内容而导致程序跑飞(个人推荐使用该方法)。以STM32F103ZET6为例,该型号的SRAM空间为0x20000000--0x2000ffff,共64KB,我想定义一个数组unsigned char arry[4096],并且想让该数组放在起始地址为0x2000e000的SRAM空间(尽量放在SRAM空间后面,避免堆栈只用到这些空间),那么可以这么做:
unsigned char *arry; //定义一个指针变量
arry = (unsigned char *)0x2000e000; //令指针指向地址0x2000e000处
那么接下来你就可以随便这么用了:
arry[0] = 0;
arry[100] = 1;
arry[1000] = 100; //等等
甚至你可以这么用:arry[5000] = 10; //只要范围不超处SRAM空间都是可以的。
再说一次:前提是这部分空间不再堆栈的范围之内,否则程序跑飞后果自负。追问那你知道怎样将数组放到指定位置吗 是不是这样写:
const u8 ziku[] __attribute__((at(0x20002000)))={……追答网上有这么说的,但我实际没有使用过,在keil中这么写不知道,但在IAR中这么写会报错肯定是不行的,而且你定义的该数组是放在SRAM中,所以前缀应该是static u8...而不是const u8...,const u8 是放在Flash中。
其实你完全可以这样:
static u8 *ziku = (u8 *)0x20002000;
然后这样使用:
ziku[0] = a;
ziku[1] = b;
也是完全没有问题。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯