bin文件生成bin文件夹的原因

想必各位大佬也是将一个程序分为两个程序,BOOT+APP,想生成bin文件却生成bin文件夹,

以STM32F103RET6为例:

这是boot程序:

进入目标选项找到target:

     在STM32F103RET6芯片中0x8000000作为起始地址 size作为整个芯片的大小,(在下面链接脚本有讲解)

···········································································································································································

select Fielder for Objects 是一个编程集成开发环境(IDE)或编译工具中的选项,通常用于指定编译生成的对象文件(通常是中间编译结果,如 .o 文件)的输出目录或文件夹。 

Name of Executable  :生成可执行文件名,bin文件和hex文件名等。

···········································································································································································

这是选择列表的文件夹:编译器构建工具将在其中生成各种列表文件中。

····································································································································································

这命令使用了fromelf.exe 工具,用于处理 ARM 架构的二进制文件。以下操作:

1:$K\ARM\ARMCC\bin\fromelf.exe:这部分指定了 fromelf.exe工具的路径,告诉系统在哪里找到这个工具。

2:--bin:这个选项告诉 fromelf.exe 将输入文件转换为二进制格式。

3:--output=.\BIN\@L.bin:这个选项指定了输出文件的名称和路径。它告诉 fromelf.exe 将生成的二进制文件保存为当前目录下的 BIN 文件夹中,并使用 @L.bin 作为文件名。

4:!L:这部分 !L实际上是一个通配符,它告诉 fromelf.exe处理当前目录下的所有文件,文件名以 L 开头的文件。

5:这个命令的作用是将当前目录下以 L开头的文件(可能是某种 ARM 架构的二进制文件)转换为二进制格式,并将结果保存为 BIN 文件夹中的 @L.bin 文件。

以下是命令:很重要!!!

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=.\BIN\@L.bin !

自己可以查看fromelf.exe程序的路径。

···········································································································································································

这是连接脚本中配置的起始位和地址大小

会发现连接脚本这里的地址和我们IROM所起始位和大小是一样,修改IROM中编译之后会更新连接脚本:

用于指导编译器和链接器如何将源代码编译成可执行程序。这个特定的链接脚本部分定义了一个内存加载区域(Load Region)称为 IROM1,并指定了一些重要的地址和大小信息。

逐步解释这个链接脚本部分的各个部分:

1. LR_IROM1 0x08002000 0x00080000:这部分定义了 IROM1 内存加载区域的属性。它告诉编译器和链接器,在地址 0x08002000 处有一个内存加载区域,大小为 0x00080000 字节(也就是 512KB)。这个加载区域通常用于存储程序的只读代码(RO)。

2. ER_IROM1 0x08002000 0x00080000:这个部分进一步定义了 IROM1 的属性,包括加载地址等。它告诉编译器和链接器,代码应该从地址 0x08002000处开始加载执行。这个地址通常是程序的入口点。

3. *.o (RESET, +First):这个部分定义了哪些目标文件(.o文件)应该放置在 IROM1内存加载区域中。RESET 和 +First 是一些特殊的指令,可能用于确保某些文件在其他文件之前加载。

4. *(InRoot$ $Sections):这是一个通配符,表示将加载所有具有 InRoot$ $Sections 属性的段。这些段通常包含程序的代码和只读数据。

5. .ANY (+RO):这个部分告诉编译器和链接器,加载的段应该被标记为只读(RO),这意味着这些段中的数据不能被修改。

6. .ANY (+XO):这部分告诉编译器和链接器,加载的段中的代码应该是可执行的(XO),这表示这些段包含程序的可执行代码。

7. RW_IRAM1 0x20000000 0x00010000:这个部分定义了另一个内存加载区域 RW_IRAM1,用于存储可读写(RW)的数据。它告诉编译器和链接器,在地址 0x20000000处有一个内存加载区域,大小为 0x00010000 字节(也就是 64KB)。

总结:这个链接脚本部分定义了程序在内存中的加载方式和地址布局,包括代码和只读数据的位置以及可读写数据的位置。确保编译后的程序正确加载和执行。

···········································································································································································

点击设置:进入Flash Download

这步骤很重要,请看下面解释:

1:这些选项用于在嵌入式开发环境或烧录工具中与设备的闪存存储器进行交互。以下是这些选项的主要作用:

1.1. Erase Full Chip(整片擦除):
    这个选项用于完全擦除目标嵌入式设备的闪存存储器中的所有数据。这将清除所有程序和数据,使设备回到出厂状态。通常在烧录新的固件或进行设备清理时使用。

1.2. Erase Sectors(擦除扇区):
    这个选项允许选择性擦除设备闪存存储器的特定扇区。不像整片擦除会清除整个闪存,擦除扇区只清除指定的扇区。这对于更新设备的部分固件或数据非常有用。

1.3. Do not Erase(不擦除):
    这个选项表示不执行擦除操作。通常在只需更新或修改特定部分的固件时使用,而不希望删除其他数据。

1.4. Program(编程):
   编程选项用于将新的程序或数据加载到设备的闪存存储器中。用户可以选择程序的起始地址和要编程的数据。这是将新固件加载到设备的步骤之一。

1.5. Verify(验证):
   验证选项用于检查已编程的数据是否正确写入了目标设备的闪存存储器。它与编程步骤一起使用,以确保编程的准确性。

1.6. Reset and Run(重置并运行):
    这个选项通常在将新的固件加载到设备后执行,它会重置目标设备并启动运行新的程序。这是固件更新的最后一步。

如果有boot程序,可以根据我以上图片进行选择。

2:RAMr Alg foorithm是与烧录工具或开发环境中的烧录算法(Programming Algorithm)相关的内存区域设置。这个部分通常用于定义存储编程算法所需数据和代码的内存区域。烧录算法是用来将新的固件或程序加载到目标嵌入式设备的闪存存储器中的工具。

3:将新的固件、程序或数据加载到目标设备的存储器中的一组特定指令和操作。这个部分的作用是定义如何执行编程操作,确保将数据正确地写入目标设备的闪存、EEPROM或其他存储器中。

起始位置和flash的内存大小需要配置和链接脚本中一致。下面还有文件中所需要修改偏移量的地址!

···········································································································································································

如果你的APP地址修改了起始地址位置为0x8002000.需要修改偏移量地址:

这个VECT_TAB_SRAM 是用于指定向量表(Vector Table)的偏移量地址。

不仅如此还需要找到__attribute__函数所需要修改的地址:

如果不会修改__attribute__函数地址值,你可以暂时注释,也能正常运行,(我个人建议)请根据个人情况选择。

还有另外一种情况是烧录boot程序之后,APP烧录是跳转不过来或出现卡顿现象,这个跟__attribute__函数有很大关系,你需要根据你个人的地址进行修改!!!(如果不会,请教大佬)

···········································································································································································

如果完成我以上的步骤此时能生成bin文件:

如果你不修改__attribute__函数的地址值:
会出现以下提示:

No Algorithm found for: 08001000H - 08001003H Partial Erase Done (areas with no algorithms skipped!) No Algorithm found for: 08001000H - 08001003H Partial Programming Done (areas with no algorithms skipped!) * JLink Info: Reset: Halt core after reset via DEMCR.VC_CORERESET. * JLink Info: Reset: Reset device via AIRCR.SYSRESETREQ. Application running ... Flash Load finished at 

以上是我个人的经验,仅供大家参考。谢谢。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值