找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2218|回复: 9
收起左侧

关于stm32的0x0800 0000这个地址开始存储的数据的疑问

[复制链接]
ID:585428 发表于 2022-2-15 10:50 | 显示全部楼层 |阅读模式
不知道应该怎么准确描述我遇到的问题。
先讲一下我的使用场景,我使用stm32的bootloader进行程序跳转到0x0802 0000这个位置,0x0802 0000是主程序的起始地址。
我使用ucos-II系统编译生成bin文件烧录,正常运行,但是通过memory查看0x0802 0000这个地址存储的数据第七个字节是0x04,而标准库和ucos-III生成的是0x02,也就是说我UCOS-II一开始存储的是0x0804xxxx这个,之后是0x0802xxxx,和我设置的主程序起始地址一致了。
标准库和ucos-III一开始存储的就是0x0802xxxx。
大家看截图辅助理解

  1. //#define FLASH_APP1_ADDR  0x08020000
  2. if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFFFF0000)==(FLASH_APP1_ADDR & 0xFFFF0000))//判断是否为0X08XXXXXX.
  3.         {               
  4.                 __disable_irq();
  5.                 Iap_Load_App(FLASH_APP1_ADDR);//执行FLASH APP代码
  6.         }
复制代码
2.JPG
回复

使用道具 举报

ID:585428 发表于 2022-2-15 11:08 | 显示全部楼层
在map文件中查了一下,这个地址对应的是Reset_Handler,为什么不同系统生成Reset_Handler地址会不一样

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:879809 发表于 2022-2-15 18:37 | 显示全部楼层
0x20000对应128k,如果你的代码有这么大不太正常了吗?
回复

使用道具 举报

ID:313048 发表于 2022-2-16 09:44 | 显示全部楼层
一个bootloader能有128K的大小?当然你可以跳转到这儿运行也没我问题,如果你的flash足够大的话。  还有你说的Reset_Handler地址不一样,这是不可能的,启动文件里面可以看到你的复位地址在哪儿,跳转过去之后只是加上偏移就可以了。还有你看的是0x08020000的数据,是你主程序开始的内容,跟你用什么库生成是没关系的吧,你改下代码然后哦重新编译一下,估计也会有所不一样。同时你可以直接查看BIN文件的数据,并不需要去仿真烧录到单片机里面查看。
回复

使用道具 举报

ID:879809 发表于 2022-2-16 11:53 | 显示全部楼层
AUG 发表于 2022-2-16 09:44
一个bootloader能有128K的大小?当然你可以跳转到这儿运行也没我问题,如果你的flash足够大的话。  还有你 ...

bootloader设定128k那是家里有矿随便浪。其实楼主的问题是app起始地址0x08020000,而Reset_Handler地址0x0804xxxx,这之间的128k是怎么冒出来的?
回复

使用道具 举报

ID:585428 发表于 2022-2-20 07:56 | 显示全部楼层
AUG 发表于 2022-2-16 09:44
一个bootloader能有128K的大小?当然你可以跳转到这儿运行也没我问题,如果你的flash足够大的话。  还有你 ...

你好,现在才看到。主要的疑问是我APP程序时从0x08020000开始的,但是BIN文件的第二个地址竟然时0x0804xxxx,这个程序用的时ucos-II。我在用IAP从bootloader跳转到主程序时,发现跳转失败才发现的,因为之前用标准库写的并没有这个问题,又特意去看来下,才发现标准库和UCOS-II生成的有些不同。标准库是0x0802xxxx.
我在网上查询以后,查到说BIN文件第二个地址是Reset_Handle()的地址。
回复

使用道具 举报

ID:585428 发表于 2022-2-20 08:01 | 显示全部楼层
rundstedt 发表于 2022-2-16 11:53
bootloader设定128k那是家里有矿随便浪。其实楼主的问题是app起始地址0x08020000,而Reset_Handler地址0x ...

是的。我之前用bootloader跳转到标准库写的app,跳转前最后的判断是
  1.         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFFFF0000)==(FLASH_APP1_ADDR & 0xFFFF0000))//判断是否为0X08XXXXXX.
  2.         {               
  3.                 __disable_irq();  //关闭中断
  4.                 Iap_Load_App(FLASH_APP1_ADDR);//执行FLASH APP代码
  5.         }
复制代码

,这样就正常跳转了,但是到用到UCOS-II的程序,系统编译发现这个LASH_APP1_ADDR+4这个位置的地址不对了
回复

使用道具 举报

ID:585428 发表于 2022-2-20 08:05 | 显示全部楼层
rundstedt 发表于 2022-2-15 18:37
0x20000对应128k,如果你的代码有这么大不太正常了吗?

你好,我这个是芯片的flash有1M,0x0800 0000---0x0801 FFFF 这个区域分配给了bootloader,0x0802 0000这个区域开始是主程序的起始地址
回复

使用道具 举报

ID:585428 发表于 2022-2-20 08:26 | 显示全部楼层
rundstedt 发表于 2022-2-16 11:53
bootloader设定128k那是家里有矿随便浪。其实楼主的问题是app起始地址0x08020000,而Reset_Handler地址0x ...

我的问题是app起始地址是一样的情况下,带UCOS-II系统的程序和使用标准库的程序,两者生成的Reset_Handler地址为什么一个是0x080 4xxx,一个是0x0802 xxxx
回复

使用道具 举报

ID:434018 发表于 2022-2-21 15:10 | 显示全部楼层
0x8000000 => flash memory.
0x20000000 => SRAM memory.
Please see LD file in you project folder .
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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