AURIX多核项目在TASKING中不只是把TC0、TC1、TC2代码一起编译。工程还要选择正确的多核配置,加入各核启动文件,在Startup Configuration里允许TC0拉起其他核心,并通过LSL安排各核代码、数据和栈。工程可以正常生成ELF,却出现TC1不启动、TC2比预期提前执行、某个核心停在启动代码或多核初始化一直等待时,可以从工程模式、启动开关、入口地址和核间同步几个位置检查。
一、TASKING怎么配置多核AURIX工程
创建工程时先确定使用一个All cores工程,还是给每个核心建立独立工程。一个应用统一管理多个核心时,可以直接选择【All cores】;各核心需要独立代码、main函数和数据空间时,则可以建立Core 0、Core 1等独立工程并建立项目引用。
1、创建All cores多核工程
①进入【File】→【New】→【TASKING TriCore C/C++Project】。
②选择【TASKING TriCore Application】下需要使用的工程类型。
③进入【TriCore Project Settings】。
④在【Processor selection】中选择实际使用的AURIX型号,例如TC3xx系列对应器件。
⑤在【Multi-core configuration】中选择【All cores】。
⑥勾选【Add startup file(s)to the project】。
⑦勾选【Add linker script file to the project】。
⑧完成创建后检查工程中是否已经加入各核心对应的【cstart】启动文件。
⑨检查工程目录中的【.lsl】文件是否已经生成。
【All cores】会让链接器按照多核环境处理程序,但它并不会自动表示TC1、TC2一定会在运行时被拉起。其他核心是否启动,还要继续配置Startup Configuration。
2、在Startup Configuration中启动其他核心
①选中工程,进入【Project】→【Properties for】当前工程。
②展开【C/C++Build】。
③打开【Startup Configuration】。
④切换到【core tc0】页面。
⑤找到【Start TC1】。
⑥项目使用TC1时勾选【Start TC1】。
⑦继续勾选需要使用的【Start TC2】【Start TC3】等核心。
⑧检查各核心页面中的【Initialize user stack pointer】和【Initialize interrupt stack pointer】。
⑨检查【Initialize and clear C variables】等启动初始化项目是否符合当前工程。
⑩点击【Apply and Close】,再执行一次完整重建。
AURIX多核工程由TC0负责启动其他TriCore核心。即使创建项目时选择了All cores,TC1、TC2对应的Start选项仍可能没有打开,这也是多核工程只运行TC0时要先检查的位置。
3、检查LSL中的各核内存布局
①进入工程属性,打开【C/C++Build】→【Settings】。
②找到【Linker】→【Script File】。
③确认实际使用的是当前工程的【.lsl】文件。
④打开LSL,检查TC0、TC1、TC2对应的PSPR、DSPR和栈区域。
⑤确认各核心的【ustack_tc0】【ustack_tc1】【ustack_tc2】没有发生地址重叠。
⑥检查核私有代码是否放入对应核心可以执行的存储区域。
⑦共享变量需要被多个核心访问时,检查其是否按照共享数据处理。
⑧重新链接工程后打开【.map】或【.mapxml】文件,检查各Section的实际地址。
TASKING还支持【share】【private n】【clone】等Code Core Association和Data Core Association。分配核心私有代码或数据时,要同时确认编译阶段的Core Association和LSL最终定位结果。
二、TASKING多核工程启动顺序异常如何排查
多核启动异常时,可以先从TC0开始跟踪。TC0自己的初始化正常,但TC1、TC2始终没有进入对应启动入口,更偏向Start选项或入口配置;其他核心已经启动,却一直卡在等待位置,则继续检查各核初始化进度和同步条件。
1、TC1或TC2完全没有启动
①进入【C/C++Build】→【Startup Configuration】。
②切换到【core tc0】。
③重新检查【Start TC1】【Start TC2】是否勾选。
④检查工程中是否存在目标核心需要的【cstart_tc1】【cstart_tc2】启动代码。
⑤打开链接Map文件。
⑥查找TC1的启动入口【_start_tc1】。
⑦使用TC2时继续查找【_start_tc2】。
⑧确认这些入口已经被链接到有效代码地址。
⑨在【_start_tc1】和【_start_tc2】附近设置断点重新启动。
⑩如果TC0已经运行,而目标入口始终没有命中,再回到TC0启动代码检查核心启动动作。
TASKING默认启动代码会从TC0引用其他核心的启动入口,所以入口符号不存在、启动文件没有加入或Start开关没有启用,都可能让从核保持未启动状态。
2、从核启动后一直停在初始化阶段
①分别在【_start_tc1】【_start_tc2】设置断点。
②从复位状态重新运行程序。
③确认每个核心都能进入自己的启动代码。
④查看各核心【PC】和【SP】。
⑤检查SP是否落在本核心配置的User Stack范围。
⑥继续单步检查C变量初始化、CSA、Trap Vector和Interrupt Vector设置。
⑦某一核心停在等待循环时,查看它正在等待哪个共享标志。
⑧切换到其他核心,检查负责修改该标志的代码是否已经执行。
⑨核对共享标志所在内存是不是各核心都能访问的区域。
多核启动代码中加入同步后,如果某个核心没有启动或共享数据被错误放入Core Private区域,其他核心就可能一直停在等待条件里。
3、TC1、TC2执行顺序和设计不一致
①先确认程序是否真的要求TC1必须晚于TC2或TC2必须等待TC0完成某项初始化。
②不要只依赖各核心被启动指令调用的先后顺序控制业务执行。
③在TC0完成系统级初始化后设置明确的共享状态标志。
④让TC1、TC2在进入本核业务代码前检查对应同步状态。
⑤检查该同步对象是否使用共享内存。
⑥确认编译器不会把核间同步变量当成普通不变数据处理。
⑦检查Cache和内存访问方式是否与当前同步实现一致。
⑧重新运行后分别在各核业务入口设置断点,检查实际放行顺序。
多核CPU被释放运行以后,各核心执行进度会受到当前指令、内存访问和中断影响。涉及严格先后关系时,应通过明确的核间同步控制,而不能只根据“先启动哪个核心”推断后续执行顺序。
三、启动配置正常但多核仍异常怎么继续检查
Startup Configuration没有发现问题后,可以继续看代码和数据的Core Association、链接结果以及调试器状态。尤其是从单核工程改成多核工程时,旧LSL和本地RAM分配很容易留下不适合多核运行的设置。
1、检查代码和数据的Core Association
①进入【C/C++Compiler】→【Allocation】。
②查看当前【Code core association】。
③检查【Data core association】。
④多个核心共同执行的代码确认使用共享方式。
⑤只允许某一个核心执行的代码检查是否被配置为对应【private n】。
⑥各核需要独立实例的数据检查是否应该使用【clone】。
⑦检查共享控制变量有没有错误进入某一核心的Private数据区。
⑧重新Build后用Map文件确认实际Section位置。
代码被分给TC1,实际却由TC0执行,或者同步变量被放入只有某一个核心正常使用的本地数据区域,都可能表现成启动后Trap、数据不一致或同步失败。
2、检查自定义LSL和旧工程配置
①确认当前TASKING版本。
②检查项目是否沿用了旧版本工具链中的自定义LSL。
③和当前器件默认LSL对照TC0、TC1、TC2内存定义。
④检查各核心User Stack和Interrupt Stack定义。
⑤检查启动入口相关符号是否仍然存在。
⑥较新TriCore工具链使用栈估算时,再检查其他核心对应的Entry Points。
⑦重新生成一份当前版本默认LSL进行对照。
⑧只把项目真正需要的内存修改逐项迁回自定义LSL。
工具链升级后直接继续使用较早版本的LSL,有时会遗漏后来增加的栈入口或多核定义。遇到升级后才出现的多核异常,可以优先做一次默认脚本对照。
3、逐核断点确认最终启动路径
①在TC0启动入口设置断点。
②在【_start_tc1】和【_start_tc2】分别设置断点。
③再给每个核心的业务入口设置断点。
④执行目标板复位。
⑤确认TC0先进入自身启动代码。
⑥继续运行并观察TC1、TC2是否进入对应启动入口。
⑦记录每个核心停止时的【PC】【SP】和当前调用位置。
⑧找到第一个没有按照设计继续执行的核心,再检查这一核心对应的Startup Configuration、LSL和同步条件。
总结
TASKING配置AURIX多核工程时,选择All cores只是建立多核编译和链接环境,其他核心是否实际启动还取决于TC0的启动配置。出现启动顺序异常后,可以从各核启动入口开始逐级跟踪,再结合LSL内存布局、Core Association和核间同步判断问题来源。对执行顺序有明确要求的功能,应由同步机制控制各核心进入业务代码的时机。如需进一步了解TASKING AURIX多核工程配置、多核启动与核间同步异常排查方法,欢迎联系咨询。