尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IAR下Traveo II CYT4BB双核开发环境搭建与调试实战

IAR下Traveo II CYT4BB双核开发环境搭建与调试实战 前阵子帮项目组评估一颗Traveo II的CYT4BB干了件最基础但又最磨人的事在IAR下把双核开发环境从零搭起来。网上关于IAR安装的教材一搜一大把可一旦换成Cypress现在是英飞凌的Traveo II事情就变味了。尤其是CYT4BB这种双核芯片多数教程讲到Cortex-M7点亮LED就收工双核工程怎么组织、两个核怎么同时debug、烧录时为什么总报错信息散得到处都是却没有一条完整链路。写这篇的目的就是把这条链路按实际操作顺序梳理一遍给手里正好拿着CYT4BB评估板、或正在为量产项目选型Traveo II的同行一个可直接抄作业的参考。文章解决的核心问题有三个第一在IAR里正确安装Traveo II设备支持包让工具链认得芯片、烧得进程序第二把CM7CM4双核工程的启动流程讲透让你改链接脚本和启动代码时不心虚第三用一次真实的双核联调过程说清楚IAR多核调试怎么配、常见报错怎么排查。适用对象包括熟悉STM32或传统单核MCU、但第一次接触Traveo II双核开发的工程师也包括想从ModusToolbox生态切换回IAR团队的项目组。1. 先把目标芯片和整体方案捋清楚1.1 CYT4BB是一颗什么样的双核MCUTraveo II是Cypress被英飞凌收购后主推的汽车级MCU家族定位是车身控制、网关、HVAC、电机控制这类对实时性、功能安全和长期供货要求很高的场景。CYT4BB只是这个大系列中的一个子系列后缀数字或字母不同对应的封装、Flash容量、主频和温度等级会有差别。很多朋友第一次接触“双核”这个词容易先入为主地以为是两颗芯片贴在一块板子上其实CYT4BB是在一颗硅片里集成了两个Cortex核心整体架构可以粗略理解成“一个院子两间房共享水电但各有各的卧室”。具体到CYT4BB典型配置是Cortex-M7搭配Cortex-M4的双核组合。M7算力强适合跑控制算法、通信协议栈、HMI图形处理这类重负载M4则适合做低功耗监控、外设管理、安全校验这类相对轻量但讲究及时响应的任务。两颗核心有各自独立的SRAM和中断控制也能通过片内总线访问共享外设和共享内存。这种设计的价值用大白话说就是不用再为了“既要算得快又要响应及时”而在一颗单核芯片上反复抢时间片硬件层面就把任务拆开了。几个关键资源的参照我列了个表格具体数值下单前一定要以手册和你拿到的那颗具体型号为准资源项CYT4BB典型信息说明内核Cortex-M7 Cortex-M4CPU0通常为M7CPU1为M4主频从几十MHz到三百多MHz不等具体看型号后缀Flash数百KB到数MB级别双核共享Flash靠链接脚本分区SRAM数百KB级别分核私有区域共享区域功能安全面向ASIL-B级别场景具体等级以型号认证为准典型场景车身控制、网关、HVACTraveo II整体定位是汽车车身域1.2 为什么选择IAR而不是“官方默认”的ModusToolbox英飞凌现在主推的Traveo II开发方式其实是用ModusToolbox基于EclipseGCC优点是图形化配置外设生成代码很方便社区示例也丰富。那为什么还要用IAR这不是谁好谁坏的问题而是看你的团队现状和产品诉求。从我的实际感受看至少有三类团队会更愿意走IAR路线。第一类公司已经有了IAR的长期License而且存量工程都是IAR格式为了一个新项目全员迁移到Eclipse学习成本和迁移风险都不小。第二类做汽车电子供应链配套的团队客户对代码编译器和调试链路有明确要求IAR在汽车半导体生态里渗透率很高很多SDK和例程会优先保证IAR工程可用。第三类从STM32、NXP等平台转过来的团队IAR的操作习惯和调试手感跟Keil、EWARM一脉相承上手速度更快。工具链的差异我用一个表来说明对比项IAR EWARMModusToolbox编译器IAR专有编译器优化口碑好GCC代码生成外设配置仍需配合Device Configurator自带Device Configurator配置生成一体调试体验多核调试成熟支持多会话同步基于EclipseGDB也能多核企业License商业授权合规清晰开源免费对Traveo II支持Device Support Pack方式增加型号支持官方原生支持所以这篇文章的路线定调是“IAR Infineon官方外设库(PDL) 板载调试器”这也是很多量产项目实际在跑的配置。后面所有步骤我都按这套组合来讲但不排斥你在熟悉以后把PDL换成裸机寄存器操作或者把调试器换成J-Link、I-jet之类的第三方探针。2. 从零到能编译IAR安装与芯片支持包配置2.1 IAR版本选择这一步别贪快装错了后面全是坑很多人喜欢在官网看到最新版本就往下拉装完才发现工程打不开、设备列表里找不到想要的型号。IAR EWARM是一个更新频率比较高的工具链针对不同芯片厂商的支持包会跟随主版本迭代所以第一步要确认的不是“哪个版本新”而是“哪个版本能匹配到你手里的Traveo II设备支持包”。按我这边工程实践的习惯建议直接装EWARM 9.x系列8.50以上版本也能支持Traveo II但为了避免后面遇到一些旧版编译器对C99/C11特性支持不完整的问题新项目直接上9.x会更省心。安装时有几个细节值得留意第一安装路径不要选中文目录也不要放在带特殊权限控制的用户目录下否则后续插件安装和Flash Loader加载可能因为权限问题莫名失败第二安装前把杀毒软件对安装目录的实时监控暂时关掉IAR安装会写很多IDE插件和配置文件实时扫描会拖慢速度甚至误杀文件第三License按公司正版授权配置不要在关键开发电脑上折腾来路不明的注册工具产品做到量产阶段License合规是红线。装完以后打开IAR Embedded Workbench IDE在Help菜单的About里确认主版本号这一步花不了半分钟但能避免后面问题排查时连环境基线都没确定。2.2 设备支持包让IAR认识CYT4BB的关键一步裸装IAR之后新建工程时在Device下拉列表里大概率搜不到CYT4BB。这不是软件坏了而是IAR本身只内置了少数主流厂商的设备定义像Traveo II这种特定芯片需要额外安装厂商提供的Device Support Pack也就是我们常说的设备支持包。这个包的作用说白了就是把芯片的型号列表、寄存器描述、Flash烧录算法、链接脚本模板一次性塞到IAR的安装目录里。没有它IAR根本不认识CYT4BB自然也就没办法编译出带正确启动文件和烧录算法的程序。安装方式一般有两种一是从IAR官网的Download页面找到Traveo II对应的设备支持包安装包下载后双击运行安装过程中会提示选择IAR安装目录指到你的EWARM根目录就行二是在IAR IDE的Tools菜单里找Device Package Manager之类入口在线获取不同版本菜单名称略有差异。我个人的习惯是直接下载离线安装包因为在线获取有时候会被网络环境卡住下载到一半中断了还得重来。安装完成后可以打开IAR安装目录下的 arm/config/devices 看看有没有Infineon或Cypress相关的文件夹里面应该能看到Traveo II系列的设备定义文件。确认无误后最好把IDE完全关闭再重新打开让IAR重新扫描一遍设备列表。我记得第一次安装时偷懒没重启直接新建工程结果设备列表还是空的重启之后才正常。2.3 用最小空工程验证环境比看教程管用的快速检查环境装没装好不用翻各种检查清单直接建一个最小工程编译一下最直观。打开IARFile - New - Workspace新建一个空Workspace然后Project - Create New Project选择Empty project保存到你的工作目录。新建工程后先打开Project - Options这里有几个关键配置项需要认真设General Options - Target - Device在设备列表里找到Infineon或Cypress分类下的CYT4BB系列具体型号如果这一步找不到器件基本可以断定设备支持包没装好或者IAR没重新扫描。Debugger - Setup - Driver这里要选调试器类型。CYT4BB评估板通常板载KitProg3调试器IAR里对应选择CMSIS-DAP即可。如果驱动列表里看不到CMSIS-DAP检查一下调试器固件和USB驱动是否被系统正常识别。配置完写一个最简单的main函数验证编译链路#include cy_pdl.h #include cyhal.h int main(void) { cyhal_gpio_t led; /* 板上LED引脚以实际原理图为准这里假设P0_0接了一个LED */ cyhal_gpio_init(P0_0, CYHAL_GPIO_DIR_OUTPUT, CYHAL_GPIO_DRIVE_STRONG, CYHAL_GPIO_VALUE_HIGH); for (;;) { cyhal_gpio_toggle(P0_0); cyhal_system_delay_ms(500); } }这段代码是示意性的如果你的环境里还没有添加PDL库编译会报找不到头文件那就先把官方例程里的PDL路径引入到工程里。确认编译通过、能下载到板子运行起来说明IAR设备支持包调试器这条最基础的链路已经通了。很多人在这一步栽跟头其实都不是大问题要么设备包没装要么调试器类型选成了ST-Link之类的默认项。3. 双核工程的组织结构与启动过程3.1 双核链路首先要有两份工程而不是一份从单核思维切换到双核思维第一个要扭转的观念是“一个开发工程对应一个程序”。CYT4BB是CM7和CM4两个核正常情况下它们各自执行不同的代码、跑不同的业务逻辑所以必须拆成两个独立的IAR工程一个CPU0工程跑Cortex-M7一个CPU1工程跑Cortex-M4。这两个工程可以放在同一个Workspace下管理烧录时各烧各的Flash区域调试时也要分别对应到各自的调试会话。为什么必须拆核心原因是每个内核启动时要加载自己的中断向量表和堆栈指针。CM7上电后从自己的启动地址取SP和PCCM4的启动则是由CM7引导逐一初始化。两个核如果用同一个链接脚本、同一份启动文件、同一段SRAM结果就是代码互相踩踏变量互相覆盖最后跑出来的行为完全不可控。在IAR工程里这两份工程的差异主要体现在三个方面链接脚本.icf文件各自独立分别定义CPU0和CPU1的代码放哪段Flash、变量放哪段SRAM启动文件不同各自初始化对应内核的堆栈和异常向量外设驱动和中断配置也要按核划分清楚不能两个核同时操作同一个外设寄存器而不做互斥。实际操作中最稳妥的做法是先找到一个官方的双核例程比如SDK里的multi-core hello world示例然后在这个基础上修改而不是从空工程手搓两个核的链接脚本。自己写icf不是不行但Traveo II的内存映射细节比较多Flash和SRAM的起始地址在不同型号上不完全一样新手很容易写错。3.2 启动过程CPU0先跑CPU1由CPU0拉起来双核芯片的启动顺序和单核有本质区别。CYT4BB上电复位后并不是两个核同时从Flash开始取指令。芯片设计上通常是CPU0CM7作为主核复位后由芯片内部的Boot ROM引导跳转到用户Flash的启动向量而CPU1CM4此时处于被禁止或保持复位的状态只有CPU0运行到一定阶段主动通过系统寄存器或IPC机制释放CPU1的复位CPU1才会开始执行自己的代码。很多朋友在双核调试时遇到“CM7在跑CM4一动不动”排查到最后几乎都是因为CPU0的启动代码里根本没有执行释放CPU1这一步或者释放顺序错了。以官方的PDL库为例这类操作一般会被封装成板级BSP接口有的例程里叫board_start_cpu1有的直接用Cy_IPC_Drv相关函数发送一条核间消息触发CPU1跳转。不同SDK版本API命名有差别所以你导入例程后第一件事应该是在CPU0工程里找到这个启动调用确认它确实存在并且知道它背后大概做了什么。还有一个容易忽略的点CPU1要能正确运行它的代码必须已经在Flash的预定区域里了而且CPU1工程里链接脚本写明的向量表地址要和CPU0跳转过去时约定的地址保持一致。如果CPU1的向量表地址配置错了即使CPU0把CPU1释放了CPU1也只会跑到某个错误地址去执行表现就是程序飞了、调试器里看到PC指针停在很奇怪的位置。3.3 IAR多核调试配置一个Workspace两个调试会话双核环境搭好后调试环节是大家最陌生的。IAR对多核调试的支持方式是在同一个Workspace下挂两个工程然后在调试器配置里指明谁是主核Primary Core谁是从核Secondary Core从编译启动Debug的那个工程开始IAR会自动建立两个调试会话你可以同时看两个核的寄存器、内存和变量。具体操作步骤我的习惯是这样在同一个Workspace里导入或新建CPU0和CPU1两个工程两个工程都要能单独编译通过。打开CPU0工程的Project - Options - Debugger在Multi-core相关配置里把它设为Primary Core并关联到CPU1工程。在Debugger - Setup里把Driver选为CMSIS-DAP连接方式选SWD。KitProg3板载调试器一般用SWD协议就能访问两个内核。从CPU0工程启动调试正常配置下IAR会提示同时初始化第二个核的调试会话。这里要说一个实际的坑多核调试时复位操作特别容易让人困惑。选择“System reset”会让整个芯片回到上电状态两个核都停在起点而“Core reset”可能只是复位当前正在调试的内核不会同时复位另一个核。如果你发现点了一次复位之后一个核从头开始跑另一个核还停在老位置不要慌说明复位类型没有选到System reset级别。另外给CM4的main函数开头下一个断点然后让CPU0执行到释放CPU1的代码再全速运行你会看到断点在CM4会话里准确命中。这个操作是验证双核启动链路最简单的办法比对着日志猜有效得多。4. 从空工程到双核Hello World一次完整的实操记录4.1 别硬啃裸工程先借官方例程带跑如果前面几步你都是跟着新工程一步步配出来的到双核阶段有很大的概率会卡住因为双核工程的启动文件、链接脚本、BSP初始化代码牵扯到的细节实在太多从头手写很容易埋雷。更高效的做法是先把官方例程带跑起来再反过来理解里面每个文件的作用。英飞凌在ModusToolbox的Example Creator里提供了一批Traveo II的双核示例包含CYT4BB系列搜索关键词用CYT4BB或Traveo II multi-core一般能找到带CM7和CM4两个工程的Hello World、IPC通信、共享内存等例程。你也可以在GitHub上找Traveo II的sample driver library仓库里面有按芯片系列分类的例程目录。选一个多核例程导入IAR工程先把默认代码编译烧录跑一遍两个核能各自工作之后再逐步改成自己的业务代码这样风险会小很多。4.2 一次从导入到双核联调的真实流程我这里记录一个典型的操作流程按这个顺序走基本不会漏步骤。第一步准备两个工程目录一个叫app_cm7一个叫app_cm4分别对应CPU0和CPU1。把官方例程里对应的IAR工程文件复制进去注意不要直接覆盖修改原例程保留一份干净的原始工程做对照。第二步分别打开两个工程先把编译环境对齐。确认两个工程的设备型号都指向你的CYT4BB具体型号确认PDL依赖库路径都有效。这一步经常出的问题是从例程复制工程后头文件路径还是绝对路径换了一台电脑就找不到需要改成相对路径或用变量替换。第三步修改两个工程的链接脚本明确Flash和SRAM的分区。比如CPU0占Flash前半段和SRAM前半段CPU1占Flash后半段和SRAM后半段中间留出隔离带。分区原则是“宁多留别少留”两块区域之间最好有少量空白区域防止溢出后互相踩踏。第四步先单独编译两个工程确保都没有语法错误和链接错误。编译通过后不要急着直接Debug先把两个工程的Flash Loader确认好。如果其中任何一个工程在Debug时提示找不到Flash Loader说明设备支持包在你的IAR版本下没有完全生效。第五步配置多核调试。CPU0工程设为Primary Core关联CPU1工程然后从CPU0启动调试等待IAR连接第二个核。连接成功后在两个核的main函数开头各下一个断点全速运行观察断点命中情况。第六步加一点自己的验证逻辑。最简单的双核通信验证可以定义一个共享内存标志位CM7往一个全局变量写值CM4循环读取并翻转自己的LED。这样即使不用串口打印也能直观看到两个核同时在跑。代码示意如下/* CPU0工程 main.c 的一部分 */ #include cy_pdl.h #include cybsp.h volatile uint32_t g_cm7_flag 0; int main(void) { cybsp_init(); /* 此处为释放CPU1的板级封装实际API以SDK版本为准 */ board_start_cpu1(); for (;;) { g_cm7_flag 0xA5A5A5A5; cyhal_system_delay_ms(100); } }/* CPU1工程 main.c 的一部分 */ #include cy_pdl.h #include cybsp.h extern volatile uint32_t g_cm7_flag; int main(void) { for (;;) { if (g_cm7_flag 0xA5A5A5A5) { /* 说明CPU0已经运行且共享内存可见 */ } cyhal_system_delay_ms(100); } }注意上面这段代码只是用来演示双核之间共享变量的基本套路实际项目里要考虑内存一致性和Cache问题Cortex-M7如果不关闭Cache直接用共享变量通信可能会遇到“核A写了值核B读不到最新值”的诡异现象碰到这种问题先查Cache维护策略。4.3 给第一次接触多核开发的人几条建议第一一定要先单核跑通再上双核。把CPU0单独跑一个闪灯程序CPU1单独跑另一个闪灯程序确认每个核独立工作都正常再组合到一起。第二先跑官方多核例程再改自己的业务代码。例程里的启动顺序、链接脚本、中断分配都是验证过的你在这个基础上改东西遇到问题时至少能排除环境因素。第三双核之间通信先别轻易用太高级的机制共享内存加标志位足够排查大部分问题IPC、邮箱、中断这类高级通信方式等基本链路稳定后再引入否则出了问题很难定位是通信机制本身的问题还是核间配置的问题。第四开发阶段编译优化等级建议用Low调试优化等级也单独设成不可优化等联调稳定后再切到Release优化避免优化器把变量优化掉导致调试信息对不上。5. 从零配CYT4BB的常见问题速查与排查思路5.1 编译和工程配置阶段的报错先从版本和路径找原因现象可能原因处理思路Device列表里找不到CYT4BB设备支持包没装或IAR没重启重装Device Support Pack重启IAR编译报找不到cy_pdl.h等头文件例程头文件路径是绝对路径环境变了在工程Options里重新指定PDL头文件路径建议用相对路径编译报找不到cstartup_xxx文件启动文件路径丢失或工程导入不完整检查工程目录下启动文件是否存在必要时从原例程复制报The generation feature is not of version 18工程文件用更高版本IAR创建当前版本打不开用匹配版本的IAR打开或升级到对应新版本编译链接时Flash/SRAM溢出双核链接脚本分区不合理调整icf里两个核各自的Flash和SRAM范围留出余量我之前实际遇到过“The generation feature is not of version 18”这个报错第一反应是工程文件损坏后来查了信息发现是IAR不同主版本之间工程文件格式有差异低版本打开高版本创建的工程就会报这个提示。解决办法不复杂要么找到创建工程的IAR版本要么直接把工程文件用文本编辑器打开看头部版本标识然后按照报错提示升级到对应版本。这类问题跟芯片本身没关系纯粹是工具链版本错位。5.2 下载和调试连不上目标板芯片还可能锁死现象可能原因处理思路Cannot access target / SWD error供电、线序、调试器类型配置问题先检查电源和SWD接线再核对IAR Driver是否为CMSIS-DAP一直连接失败芯片疑似被锁Flash保护或调试端口被关闭降低SWD频率到几百kHz按住复位键连接后执行整片擦除能连接但烧录时报Flash Loader错误设备支持包没生效或Flash Loader选择错误重新安装匹配版本的设备支持包手动指定Flash Loader程序下载后板上现象和预期不符两个核的程序区烧反了或只烧了一个核确认两个工程的Flash分区和烧录顺序两个镜像都烧进去芯片锁死这个问题比较吓人但其实大部分情况能救回来。发生锁死通常是因为程序里配置了Flash保护位或者调试端口被复用成了GPIO。遇到这种情况我的经验是先断开调试器的其他连接把SWD频率降到最低然后在IAR的调试器设置里选择擦除整片芯片再连接。如果板子有复位按键可以在点击连接的同时按住复位键有时候就能在芯片执行用户程序之前把调试会话抢下来趁这个窗口执行擦除。只要不是硬件损坏绝大多数“锁死”都能擦回出厂状态。5.3 双核联调时的几个怪现象多半出在自己代码里现象可能原因处理思路只有CM7在跑CM4完全没反应CPU0没有执行释放CPU1的启动流程检查CPU0工程里是否调用了启动CPU1的BSP/PDL接口CM4的断点永远不命中向量表地址不对或CPU1代码没烧进Flash对比两个工程icf里的向量表地址和烧录地址是否一致两个核都在跑但共享变量互相看不到Cache一致性问题或变量被优化对共享变量用volatile修饰必要时候做Cache clean/invalidate调试器里只看到一个核的会话Multi-core配置没配对或主从关系反了回到工程Options检查Primary/Secondary Core关联关系双核调试里“共享变量互相看不到”是最容易被忽略的高级坑。Cortex-M7有CacheCPU0往共享内存写了一个值可能还留在Cache里没有写回物理SRAMCPU1直接读物理SRAM自然读不到。调试阶段最保险的办法是共享变量所在的SRAM区域配置成不可Cache属性或者通信时显式做Cache维护。这个坑用调试器看内存时特别迷惑你切到CM7的会话看到变量值是某个数切到CM4的会话读同一个地址却是另一个数。不用怀疑芯片坏了大概率就是Cache没处理。最后再补充一句搭这套环境的过程里我最大的体会是Traveo II本身的资料信息密度不低但IAR这条链路的坑并不多大多数问题最后都落在了“版本没对齐”和“启动顺序没搞对”两件事上。所以我养成了一个习惯每动一次IAR版本、设备支持包或者开发电脑都先花十分钟把“最小可编译、最小可烧录、双核可连接”这条路完整走一遍再继续写业务代码。很多看起来玄乎的报错本质上都是版本错位或者默认配置不对。CYT4BB这颗芯片能聊的远不止环境搭建双核只是一个起步但环境铺不平后面全是坑。希望这篇能帮你把路铺平少走一点我走过的弯路。
返回列表