0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DE工具的Post-build往往在实际开发过程中容易被忽略

电子设计 来源:网友电子设计发布 作者:网友电子设计发布 2021-12-29 14:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

CC2640 R2是一款面向 Bluetooth Smart 应用的低功耗无线 MCU。该芯片运行TI的BLE协议栈,同时具有OAD(Over the Air Download)空中固件升级功能。

CCS是TI提供的强大的MCU/Processor免费软件开发IDE,支持TI全系列的MCU和Processor。IAR是IAR公司提供的商用软件开发IDE。CC2640R2可以选用CCS或者IAR任意一款进行开发。

为了提高OAD的效率,同时为了更合理的代码架构,TI的BLE例程都分为Application和Stack两个工程。但是两个工程和两个固件,往往会造成生产或者OAD的不便,在此我们提供一个小窍门来改善一下这个不便。

首先我们看一下IAR/CCS的编译结果:

IAR和CCS是开发TI的BLE方案的IDE工具。在代码编译完成后,都能生供下载调试用的.out文件,还有.hex文件和.bin文件。

其中.out文件带了调试信息,主要是下载调试用。.hex文件和.bin文件都可以用于生产下载,但是.hex文件又带了地址信息,crc校验等额外信息,所以.out和.hex都会比.bin文件大很多。因此最理想的生产下载文件其实还是.bin文件,同样,对于目前CC2640R2F的OAD功能来说,.bin文件也依然是最佳选择。

我们再来看一下CC2640R2带OAD特性的工程:

CC2640R2带OAD特性的工程由三个子工程构成,BIM,application和stack。

BIM其实就是bootloader,app就是application,stack就是协议栈。

这样的好处是升级的时候可以只单独更新application部分,并且能大大提高OAD的速度(因为对大多数客户来说实际只需要更新application部分)。

但是这样做的结果就有了三个独立image文件,这会对最终的生产造成困扰。好在IAR或CCS等IDE工具提供了一些方法,能使我们灵活在.hex文件和.bin文件之间互相转换,合并等等,这就是它们提供的post-build工具:post-build顾名思义就是build之后的动作。

先来看一下IAR/CCS的Post-build工具:

以Application工程为例。

IAR的Post-build工具:

把IAR和CCS的Post-build 内容拿出来,分别是:

IAR的Post-build内容:

cmd /C “$TOOLS_BLE_DIR$\output_converter\output_converter.exe

$EXE_DIR$\sp_oad_offchip_$PROJ_FNAME$_$CONFIG_NAME$.bin & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe

iar $PROJ_DIR$ 1 $EXE_DIR$\$TARGET_BNAME$.hex $PROJ_DIR$\。.\config\iar_boundary.xcl

$PROJ_DIR$\。.\stack\FlashROM\Exe\sp_oad_offchip_cc2640r2lp_stack_FlashROM.hex -o

$EXE_DIR$\$TARGET_BNAME$_oad”

CCS的Post-build内容:

${TOOLS_BLE_DIR}/oad/oad_image_tool ccs ${PROJECT_LOC} 1 FlashROM/${ProjName}_${ConfigName}.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/TOOLS/ccs_compiler_defines.bcfg ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/FlashROM/simple_peripheral_cc2640r2lp_oad_offchip_stack_FlashROM.hex -o ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad

上面标红的就是CC2640R2的SDK提供的一些脚本工具,可以在这个目录中找到:C:\TI\simplelink_cc2640r2_sdk_1_40_00_45\tools\blestack。分别是

output_converter.exe和

oad_image_tool.exe。

SDK提供的这几个.exe文件都是Python文件转换过来的,我们也可以把自己用Python转成的.exe文件放这里来执行。

上述脚本工具在Post-build中的应用

output_converter.exe的用法:

output_converter.exe的作用:把.bin文件转换成.hex文件。

用windows的command line可以看到它的参数配置:

oad_image_tool.exe的用法:

oad_image_tool.exe的作用:把特定的1个,或者多个.hex文件合并,新生成一个.hex文件,并转换成加上CRC32校验信息的.bin文件,注意的是,新生成的.hex文件是没有加上CRC32校验信息的,只有新生成的.bin文件带。

它是特别指定了OAD要用的BIM,application,stack三个工程的某种组合,且合并的话,只能合并application和stack工程的image,所以这个工具并不是通用.hex转.bin工具,只能配合OAD用(文章后面会有通用.hex转.bin工具介绍)。

图 5. oad_image_tool.exe的参数配置

*注意:这里说的都是application工程,编译application工程之前,stack工程必须先编译完成。因为很显然,stack工程的.hex文件是其中的一个参数。

output_converter.exe & oad_image_tool.exe的配合:

IAR的工程配置里面,配置的是编译好默认输出.bin文件,所以需要先用output_converter.exe把.bin文件转换成.hex。

CCS则是直接生成.hex文件,CCS只要调用oad_image_tool.exe转换成带CRC32校验信息的.bin文件就可以了。

所以最后总结,不管是IAR还是CCS,都是通过post-build来转换application和stack工程的编译结果,并产生这两个工程单个合并的.hex和.bin文件(BIM工程并不在合并之列),产生的.bin文件是带OAD需要的CRC32的image校验信息的,而.hex文件是不带这个CRC32校验信息的。

在Post-build中活用脚本工具:

用hex的方法烧录

如果用.hex的方式去烧录,这中间就有两个问题:

第一就是还是得烧录两个.hex文件:BIM的.hex,和application+stack合并的.hex。

第二就是,默认的post-build产生的.hex文件不带CRC32信息,如果直接把最终产生的单个.hex文件和BIM工程的.hex文件烧录至芯片,由于application镜像的起始位置不带有效的CRC32信息,因此BIM会认为这是无效的镜像,最后造成无法跳转到application去执行。

要解决这两个问题,就得在application+stack的.hex起始位置加上有效CRC32校验信息,然后把BIM的.hex文件和application+stack的.hex文件合并,变成真正的单个.hex,这样直接下载就没问题了。

解决方法:

首先,给application+stack的.hex文件头部相应位置加入CRC32信息。

实际上经过oad_image_tool.exe合并的application+stack的.bin文件的头部已经有CRC32校验信息,而且output_converter.exe能把.bin文件转成.hex文件,所以最快的方法自然是用output_converter.exe把已经合并的application+stack的.bin文件再转换成.hex就行了:

$TOOLS_BLE_DIR$\output_converter\output_converter.exe -o

$EXE_DIR$\$TARGET_BNAME$_oad_merged_crc32.hex $EXE_DIR$\$TARGET_BNAME$_oad_merged.bin“

这个产生的.hex就是application+stack,并带CRC32信息。

接下来就是把BIM的.hex和application+stack带CRC32信息的.hex 合并。

由于SDK提供的oad_image_tool.exe是一个特殊的工具,并不能随意合并任意的.hex文件,所以不能用这个工具来合并BIM和application+stack的.hex文件。这里提供一个能合并任意.hex文件的工具:hexmerge.exe,这个也是通过python转换的.exe文件,后面会介绍怎么转换的。

把hexmerge.exe放到对应目录下,比如:C:\TI\simplelink_cc2640r2_sdk_1_40_00_45\tools\blestack\oad

用法:

$TOOLS_BLE_DIR$\oad\hexmerge.exe -o $EXE_DIR$\bim_app_stack_crc32.hex $PROJ_DIR$\。.\bim_offchip\

FlashOnly \Exe\sp_oad_offchip_cc2640r2lp_bim_offchip_FlashOnly.hex

$EXE_DIR$\$TARGET_BNAME$_oad_merged_crc32.hex

把上面两条命令加入到post-build中去,下面蓝色部分:

cmd /C ”$TOOLS_BLE_DIR$\output_converter\output_converter.exe $EXE_DIR$\sp_oad_offchip_$PROJ_FNAME$_$CONFIG_NAME$.bin & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe iar $PROJ_DIR$ 1 $EXE_DIR$\$TARGET_BNAME$.hex $PROJ_DIR$\。.\config\iar_boundary.xcl $PROJ_DIR$\。.\stack\FlashROM\Exe\sp_oad_offchip_cc2640r2lp_stack_FlashROM.hex -o $EXE_DIR$\$TARGET_BNAME$_oad & $TOOLS_BLE_DIR$\output_converter\output_converter.exe -o $EXE_DIR$\$TARGET_BNAME$_oad_merged_crc32.hex $EXE_DIR$\$TARGET_BNAME$_oad_merged.bin & $TOOLS_BLE_DIR$\oad\hexmerge.exe -o $EXE_DIR$\bim_app_stack_crc32.hex $PROJ_DIR$\。.\bim_offchip\FlashOnly\Exe\sp_oad_offchip_cc2640r2lp_bim_offchip_FlashOnly.hex $EXE_DIR$\sp_oad_offchip_cc2640r2lp_app_FlashROM_oad_merged_crc32.hex“

这样,最终就能产生出一个bim+application+stack三个工程合并后的.hex文件,并且带CRC32校验,一次性下载到芯片后能直接运行。

用bin的方法烧录

如果用.bin的方式烧录,那么CRC32的问题是不存在的,存在的唯一问题就是:

BIM的.bin和application+stack的.bin是两个独立的文件,没法同时烧录,也没法分别烧录,因为.bin文件是不带地址信息的,比较麻烦。

最好的方法当然是把这几个.bin文件合成一个,再进行烧录。但SDK提供的oad_image_tool.exe又不能直接把BIM合并进去产生.bin文件,所以还是需要借助其他工具。

其实根据前面的启发,最快的方法,只要把前面的过程中产生的BIM+application+stack并带CRC32校验的.hex文件直接转换成.bin文件就行了。我们借用hex2bin.exe这个工具,同样,也是python转换过来的.exe。

解决方法:

首先,比如也把hex2bin.exe放到下面目录中:

C:\TI\simplelink_cc2640r2_sdk_1_40_00_45\tools\blestack\oad

用法:

$TOOLS_BLE_DIR$\oad\hex2bin.exe $EXE_DIR$\bim_app_stack_crc32.hex $EXE_DIR$\bim_app_stack_crc32.bin

那么把这条命令加到post-build中去:

cmd /C ”$TOOLS_BLE_DIR$\output_converter\output_converter.exe $EXE_DIR$\sp_oad_offchip_$PROJ_FNAME$_$CONFIG_NAME$.bin & $TOOLS_BLE_DIR$\oad\oad_image_tool.exe iar $PROJ_DIR$ 1 $EXE_DIR$\$TARGET_BNAME$.hex $PROJ_DIR$\。.\config\iar_boundary.xcl $PROJ_DIR$\。.\stack\FlashROM\Exe\sp_oad_offchip_cc2640r2lp_stack_FlashROM.hex -o $EXE_DIR$\$TARGET_BNAME$_oad & $TOOLS_BLE_DIR$\output_converter\output_converter.exe -o $EXE_DIR$\$TARGET_BNAME$_oad_merged_crc32.hex $EXE_DIR$\$TARGET_BNAME$_oad_merged.bin & $TOOLS_BLE_DIR$\oad\hexmerge.exe -o $EXE_DIR$\bim_app_stack_crc32.hex $PROJ_DIR$\。.\bim_offchip\FlashOnly\Exe\sp_oad_offchip_cc2640r2lp_bim_offchip_FlashOnly.hex $EXE_DIR$\sp_oad_offchip_cc2640r2lp_app_FlashROM_oad_merged_crc32.hex & $TOOLS_BLE_DIR$\oad\hex2bin.exe $EXE_DIR$\bim_app_stack_crc32.hex $EXE_DIR$\bim_app_stack_crc32.bin“

所以总结起来,只要把上面的这一整段命令复制,粘帖到IAR的post-build配置中去,我们就能通过IAR的一次编译,自动同时可以得到一个合并了BIM,application,stack的完整的.hex和.bin文件(bim_app_stack_crc32.hex和bim_app_stack_crc32.bin),可以用于烧录。

在CCS中的灵活用法

前面是基于IAR的配置方式,基于CCS的本质上也是一样,在post-build中,加入:

${TOOLS_BLE_DIR}/oad/oad_image_tool ccs ${PROJECT_LOC} 1 FlashROM/${ProjName}_${ConfigName}.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/TOOLS/ccs_compiler_defines.bcfg ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_stack/FlashROM/simple_peripheral_cc2640r2lp_oad_offchip_stack_FlashROM.hex -o ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad

${TOOLS_BLE_DIR}/output_converter/output_converter -o

${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad_merged_crc32.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad_merged.bin

${TOOLS_BLE_DIR}/oad/hexmerge -o ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/bim_app_stack_crc32.hex ${WORKSPACE_LOC}/bim_oad_offchip_cc2640r2lp_app/FlashOnly/bim_oad_offchip_cc2640r2lp_app.hex ${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/${ProjName}_${ConfigName}_oad_merged_crc32.hex

${TOOLS_BLE_DIR}/oad/hex2bin

${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/bim_app_stack_crc32.hex

${WORKSPACE_LOC}/simple_peripheral_cc2640r2lp_oad_offchip_app/FlashROM/bim_app_stack_crc32.bin

这样,编译完application工程后,就能自动得到合并了BIM+application+stack的.hex和.bin文件(bim_app_stack_crc32.hex和bim_app_stack_crc32.bin)。

结论:

IDE工具的Post-build往往在实际开发过程中容易被忽略,其实只要灵活应用,还是能帮助我们做很多事情的,比如本文所说针对CC2640R2F的固件的生成,灵活应用Post-build功能就能方便产生我们自己需要的固件,提高工作效率。

另附

Python的独立可执行.exe脚本文件

如何通过Python得到可直接独立执行,不需要python环境的.exe文件?可以用Pyinstaller这个工具,Pyinstaller是一个可以把Python脚本文件打包成.exe的工具。

Python环境下载:https://www.python.org/

Pyinstaller下载:http://www.pyinstaller.org/

这里用到的hexmerge和hex2bin,用的是python的intelhex库:https://pypi.python.org/pypi/IntelHex

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式处理
    +关注

    关注

    0

    文章

    341

    浏览量

    10450
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何调试和编程CW32F030C8T7?支持哪些调试工具和编程语言?

    了解如何调试和编程CW32F030C8T7是开发过程中的重要环节。它支持哪些调试工具(如JTAG、串口调试等)和编程语言(如C、C++等)?如何设置和使用这些工具来加速开发过程
    发表于 12-05 06:48

    开发过程中,有哪些常见的调试问题及解决方法

    无法连接 JLink 调试器: 确认 JLink 驱动已经正确安装。 检查 USB 连接是否稳定,确保没有连接问题。 EIDE 或 VSCode ,确认正确选择了连接模式(SWD 或
    发表于 11-26 06:40

    程序加载过程中遇到的问题及其解决方法

    :这个问题大多出现在最初使用NucleiStudio工具进行项目开发的时候,这是因为从官网下载的Nuclei Studio存在Bug。Nuclei Studio界面,菜单栏中进入H
    发表于 10-30 07:59

    京微齐力新版福晞软件工具全面优化FPGA设计环境

    FPGA 设计开发过程中,软件是工程师必不可少的工具,好的软件开发环境可以简化设计者的设计流程,缩短开发时间,提升整体设计效率。
    的头像 发表于 10-23 17:48 4651次阅读
    京微齐力新版福晞软件<b class='flag-5'>工具</b>全面优化FPGA设计环境

    开发指南】全志系列核心板开发过程中的常见问题及排查策略

    长期提供技术支持服务的过程中,飞凌嵌入式总结了用户开发全志系列产品时常见的问题及排查方法。本文中,小编将为大家梳理这些经验,助力开发者快速定位问题,提升
    的头像 发表于 10-15 08:04 6482次阅读
    【<b class='flag-5'>开发</b>指南】全志系列核心板<b class='flag-5'>开发过程中</b>的常见问题及排查策略

    芯片研发过程中的两种流片方式

    芯片在研发过程中一般包含4个阶段:芯片设计、生产样片、测试验证和大规模量产。完成芯片设计后,工程师们需要先拿到一些芯片样片,用它们进行测试和验证,来判断新研发的芯片在功能和性能上是否符合设计要求
    的头像 发表于 09-09 15:04 1113次阅读
    芯片研<b class='flag-5'>发过程中</b>的两种流片方式

    为什么 ESD 测试能过,但实际应用还是击坏?

    电子产品的开发过程中,静电放电(ESD)测试往往是EMC测试的重要环节之一。很多客户反馈:样机实验室
    的头像 发表于 09-03 10:53 526次阅读
    为什么 ESD 测试能过,但<b class='flag-5'>实际</b>应用还是<b class='flag-5'>被</b>击坏?

    功能安全开发的“降本利器”:高效平台化工具链实战

    随着智能驾驶技术的快速发展,汽车电子电气(E/E)系统的复杂度显著提升,功能安全已成为其开发过程中不可或缺的关键要素。依据ISO26262标准要求,功能安全开发活动通常数量众多且关联性强。基于以往
    的头像 发表于 07-10 14:27 734次阅读
    功能安全<b class='flag-5'>开发</b>的“降本利器”:高效平台化<b class='flag-5'>工具</b>链实战

    使用CY7C65213开发过程中,应该用哪个interface进行uart通信?

    使用CY7C65213开发过程中,我想用CyUartRead读数据,但是好像没有接口的deviceType是CY_TYPE_UART,想请问我应该用哪个interface进行uart通信? 是否有相关指导文件,或描述符指导?
    发表于 06-03 07:04

    MES系统开发的质量模块设计,90%企业都忽略了这点

    制造业数字化转型的浪潮,MES(制造执行系统)作为提升企业生产效率和质量管理能力的核心工具,正受到越来越多企业的青睐。然而,MES系统的开发过
    的头像 发表于 04-08 14:27 585次阅读
    MES系统<b class='flag-5'>开发</b><b class='flag-5'>中</b>的质量模块设计,90%企业都<b class='flag-5'>忽略</b>了这点

    芯科科技Web-BasedFlash工具助力优化Matter开发流程

    很高兴向大家介绍新发布的Web-BasedFlash工具以优化Matter开发流程,该工具旨在简化展示Matter硬件功能和性能的过程,使开发
    的头像 发表于 02-20 09:52 907次阅读

    linux下开发过程中, DLP4500 GUI无法连接光机怎么解决?

    linux下开发过程中, DLP4500 GUI 无法连接光机,出现错误提示如下: open device_handle error: Is a directory opening path
    发表于 02-20 08:41

    DevEco Studio构建分析工具Build Analyzer 为原生鸿蒙应用开发提速

    原生鸿蒙应用开发过程中,随着项目复杂度的增加,开发者花费构建上的时间越来越长,导致开发效率降低。为了帮助
    发表于 02-17 18:06

    如何在日常开发过程中提高代码质量

    。 提高代码质量是一个系统工程,本文主要介绍开发人员如何在日常开发过程中提高代码质量。 01 什么是代码质量? 代码质量一般用于衡量代码的“好”和“烂”:“好”代码表示代码质量高,“烂”代码表示代码质量低。虽然目前
    的头像 发表于 01-23 09:09 1027次阅读
    如何在日常<b class='flag-5'>开发过程中</b>提高代码质量

    嵌入式笔记 | 非常容易忽略的电流倒灌

    导读在嵌入式开发工程,电流倒灌是一个容易被忽视但可能导致严重后果的问题。本章节将深入探讨电流倒灌的成因、影响以及如何在实际工程识别和预防
    的头像 发表于 12-09 16:57 2290次阅读
    嵌入式笔记 | 非常<b class='flag-5'>容易</b><b class='flag-5'>被</b><b class='flag-5'>忽略</b>的电流倒灌