永发信息网

stm32怎样存取超大静态数组

答案:2  悬赏:60  手机版
解决时间 2021-03-18 10:55
stm32怎样存取超大静态数组
最佳答案
char *p;

p= (char *)常量地址;

C语言中只有同类型变量才能赋值,常量类型赋值给指针必须做强制类型转换。假设静态数组位于0x3000 0000,那么取数据时可以写成
char *p;
p= (char *)0x3000 0000; // 指向0x3000 0000
x=*p; // 取数据
全部回答
你是否是遇到这样问题:
比如定义一个数组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;
也是完全没有问题。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
农村超生第三胎送养与我,40岁无儿无女,要如
我是一名高二学生,我学文科差不多3个月了,
提前通过用英语怎么说?在线等答案 一个回答
真三国无双的天水之战怎么出来
临渭区仁和润滑油超市在什么地方啊,我要过去
炘是什么意思
求日本动漫电影怪物之子的百度云
小卧室如何加一张书桌
0,87除以12等于多少.竖式计算
模拟人生2大学生活怎么安装?(游民下载)
家居不清洁不做好的话会有什么后果
对于较大数据,软件设计要考虑什么?
谁有像神神奇宝贝那样的动画片(至少5个),
es la muchacha amable bonita是什么意思?谢
看了那么多关于本命佛的,我也刚请了本命佛,
推荐资讯
爱健洗衣(南台二街)我想知道这个在什么地方
城南小磨豆花活鱼庄我想知道这个在什么地方
作文夜莺的角度:要目光远大丨,突破自我
买新车时,需要把原带的钢轮毂换成铝合金的吗
前两天因为买三金跟女朋友闹了一个小矛盾今天
东方国际互助联盟是骗子?
你女朋友的第一次不是给你了会继续交往下去吗
柏林 慕尼黑 法兰克福哪里买东西最便宜i
我和女友交往5个月了,一开始有说不完话,可
编写一个C#程序,输出100以内的所有能被3和5
广州树丛里这是什么虫子?
我平时鼻子额头出油稍微有点严重但是一旦上妆
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?