OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6558|回复: 11

程序代码相关困惑

[复制链接]

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
发表于 2015-10-9 19:37:45 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]//跳转到应用程序段 //appxaddr:用户代码起始地址. void iap_load_app(u32 appxaddr) { if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法. { jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) jump2app(); //跳转到APP. } } [/mw_shl_code]

在原子IAP实验中为什么要检查栈顶地址是否合法,而且地址要与0X2FFE0000相与呢??????

最佳答案

查看完整内容[请看2#楼]

首先确定appxaddr里面存储的是栈顶地址,也就是程序使用内部SRAM的边界  0x10000转换为10进制计算就是64KB,也就是如果你应用代码使用内部SRAM没超过128KB,或者本身SRAM没超过128KB,那么 &0x2FFE0000就是没问题(在大部分的设备都没有问题),其实这个语句最早应该是官方IAP demo写的,而那时stm32内部RAM就很少有大于128KB的,所以就一直延续下来了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1761
金钱
1761
注册时间
2015-6-11
在线时间
311 小时
发表于 2015-10-9 19:37:46 | 显示全部楼层



首先确定appxaddr里面存储的是栈顶地址,也就是程序使用内部SRAM的边界 
0x10000转换为10进制计算就是64KB,也就是如果你应用代码使用内部SRAM没超过128KB,或者本身SRAM没超过128KB,那么
&0x2FFE0000就是没问题(在大部分的设备都没有问题),其实这个语句最早应该是官方IAP demo写的,而那时stm32内部RAM就很少有大于128KB的,所以就一直延续下来了。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-9 23:04:36 | 显示全部楼层
刚看了一下,貌似地址与上0X2FE00000比较合适,等高手解答吧~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-10-10 13:25:26 | 显示全部楼层
回复【3楼】zc123:
---------------------------------
学习了!
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
 楼主| 发表于 2015-10-10 17:28:56 | 显示全部楼层
回复【3楼】zc123:
---------------------------------
1.那*(vu32*)appxaddr我能理解为是将appxaddr先转换为地址指针,然后再取出地址与0x2ffe0000与???,如果是这样为什么不直接将appxaddr直接与0x2ffe0000相与呢????
2.我记得在原子程序中flash的MSP地址为0x08005000,然后进入这void iap_load_app(u32 appxaddr)这个程序,请问下我的地址是0x080050000如何与0x2ffe0000相与恒等与0x20000000?????
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1761
金钱
1761
注册时间
2015-6-11
在线时间
311 小时
发表于 2015-10-10 20:26:53 | 显示全部楼层
回复【5楼】wengxh642:
---------------------------------
你这的问题是
1.不理解嵌入式地址和地址内数据的区别
2.你没仔细看我上面说的内容
谁说*(vu32*)appxaddr 和appxaddr是一个值
我举得例子*(vu32*)appxaddr = 0x20013000, appxaddr = 0x08010000
*和&互反,但*(vu32*)是取appxaddr这得地址内的数据
回复

使用道具 举报

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
 楼主| 发表于 2015-10-11 10:09:03 | 显示全部楼层
回复【6楼】zc123:
---------------------------------
 那这段代码看不懂原因是不是因为我没明白程序运行的方式,也就是说我错误理解的是当我的sramapp设置的栈顶指针设置为0x20001000时,就是从0x20001000+4开始执行
                if(key==KEY_RIGHT)
{
printf("开始执行SRAM用户代码!!\r\n");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX.
{  
iap_load_app(0X20001000);//SRAM地址
}else 
{
printf("非SRAM应用程序,无法执行!\r\n");
LCD_ShowString(60,210,200,16,16,"Illegal SRAM APP!");    
}  
clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示  
}
而当flashapp中的flash_app1_addr=0x08005000时程序运行就是从栈顶地址0x08005000+4开始运行
                if(key==KEY_LEFT)
{
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{  
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
但按照你说的,iap_load_app就是如果是sram地址参数,就是从这个参数+4开始执行,如果flash_app1_addr这个参数还要从flash_app1_addr这地址指针所指里面数据+4开始执行程序,能不能这样理解???????
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1761
金钱
1761
注册时间
2015-6-11
在线时间
311 小时
发表于 2015-10-11 11:23:02 | 显示全部楼层
回复【7楼】wengxh642:
---------------------------------
肯定不是啊,M3的代码是可以放在SRAM和FLASH里的,也就是启动的时候可以从SRAM或者FLASH里启动
但无论是SRAM还是FLASH地址,都不是这个参数+4开始执行,而是取这个地址+4内部的数据在执行
(*(vu32*)(0X20001000+4))是取SRAM中0x20001004中的数据,这个就不是栈顶地址了,而是Reset_Handler的入口地址
这个可以用来判断中断向量表是在SRAM和FLASH中的。
(*(vu32*)分两步, 1.将地址转换为指针,2. 从指针里取得数据,这个弯要转过来,和它是什么地址无关
回复

使用道具 举报

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
 楼主| 发表于 2015-10-11 12:36:39 | 显示全部楼层


1、对照着个框图已经开始明白了,但有个疑问就是栈顶地址范围是不是就sram范围,比如stm32f103zet6 64KB,按照你所说(*(vu32*)appxaddr)就是指针里面的数据,对照框图就是栈顶地址,而跟0x2ffe0000相与判断有没有在sram内存地址范围内,sram地址范围与栈顶地址是什么关系?????2、 MSR_MSP(*(vu32*)appxaddr);     //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址),在初始化中app中是不是有开辟了一个栈顶地址,也就是说在只有一个IAP和APP情况下,有两个栈顶地址,APP栈顶地址进行偏移,但原子款图中并没有两个栈顶地址指示?????
回复

使用道具 举报

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
 楼主| 发表于 2015-10-13 15:30:17 | 显示全部楼层
回复【8楼】zc123:
---------------------------------
能不能回答下8楼的问题???
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1761
金钱
1761
注册时间
2015-6-11
在线时间
311 小时
发表于 2015-10-13 17:05:24 | 显示全部楼层
回复【10楼】wengxh642:
---------------------------------
堆栈是建立在内存里,也就是栈顶地址肯定小于SRAM范围
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2017-9-1 15:10:18 | 显示全部楼层
本帖最后由 qilima 于 2017-9-1 15:47 编辑
wengxh642 发表于 2015-10-11 12:36
1、对照着个框图已经开始明白了,但有个疑问就是栈顶地址范围是不是就sram范围,比如stm32f103zet6 64KB ...

IAP和APP的RAM是怎么分配的?我看用的是两个独立的栈,那堆也是独立的吗?如果IAP使用RAM过多,那APP能够使用的就少了,对吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 07:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表