This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:在 SYS/BIOS 上运行双核

Guru**** 2124380 points
Other Parts Discussed in Thread: TMS320F28388D, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/973351/tms320f28388d-operating-dual-core-on-sys-bios

器件型号:TMS320F28388D
主题中讨论的其他器件: C2000WARE

你好。 我是 TMS320F28388D 的初学者,尝试使用 SYS/BIOS 运行两个内核。

这是我正在使用的程序版本

- CCS 10.1.1

- C2000Ware 3.03.00

-符合 V20.2.1.LTS

- XDC 工具3.61.02.27

-BIOS 6.83.00.18

----------------------------------------------------------------

起初、我尝试使用具有 SYS/BIOS 的单个内核、但它确实起了作用。

然后、我使用两个 CPU 内核尝试了相同的情况、但它不起作用。

因此我几乎删除了每个 Hwi、Swi 等。 在 app.cfg 文件上,除了简单的计时器和空闲故障排除功能。 下面是我的代码

----------------------------------------------------------------

CPU1

void main (void){

device_init();

#ifdef _flash
DEVICE_BOOTCPU2 (BOOTMODE_BOOT_TO_FLASH_SECTOR0);
其他
DEVICE_BOOTCPU2 (BOOTMODE_BOOT_TO_M0RAM);//激活
#endif

EINT;

ERTM;

BIOS_start();

在 app.cfg 上添加"Timer1"(1秒计时器,每秒计数"tickcount1")

CPU2

void main (void){

EINT;

ERTM;

BIOS_start();

在 app.cfg 上添加"timer2"(2秒计时器,每2秒计数"tickcount2")
------------------------------------------------------------------

虽然编译成功、但我的期望与实际绩效之间存在一些差异

我的预期:根据不同的定时器周期(我认为这意味着 SYS/BIOS 在两个 CPU 内核上运行)分别增加变量"tickcount1"和"tickcount2"

实际性能:当我首先启动 CPU1时,没有任何变化(甚至 Timer1)。 然后我启动 CPU2,两个变量(tickcount1 & 2)开始根据 timer2周期(2sec)同时增加

CPU1上的 SYS/BIOS 似乎无法运行。 您能给我一些关于这种情况的建议吗?或者多核情况下的初始 SYS/BIOS 设置提示 吗?

因为我找不到有关具有双核的 SYS/BIOS 的示例。 我不能再去了。

此致、

Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、您可以让它们同时运行、但 CPU1上的计时器频率似乎不正确? 您是否介意共享.cfg 文件?

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我有.cfg 文件。 但是、由于我公司的安全问题、一旦我的计算机中安装了 cfg 文件(即使是来自 TI 示例...)、我就无法将其直接上载到该论坛中。

    很抱歉这么说。  

    但这里是我定义的 cfg 文件和函数中的简短代码

    ----------------------------------------------------------------

    var logerBufParams = new LoggerBuf.Params();
    LoggerBufParams.numEntry = 32;
    var logger0 = LoggerBuf.create (logerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.always_on;

    System.SupportProxy = SysMin;
    idleFxns[0]="&myIdleFxnCPU1";
    boot.configureClocks = true;
    BOOT.OSCCLKSRCSEL = BOOT.OSCCLK_XTAL;
    boot.OSCCLK = 20;
    boot.SPLLIMULT = 20;
    bios.cpufreq.lo = 200000000;
    var timer0Params =新 Timer.Params();
    timer0Params.instance.name ="timer0";
    timer0Params.period = 1000000;
    program.global.timer0 = Timer.create (空、"&myTickFxnCPU1"、timer0Params);

    void myTickFxnCPU1 (UARg 参数)

    tickCount1 += 1;
    isrFlagCPU1 = true;


    void myIdleFxnCPU1 (void)

    if (isrFlagCPU1== true){
    isrFlagCPU1 = false;

    System_printf ("CPU1 BIOS 正在运行\n");
    system_flush();
    GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;


    ------------------------------------------------------------------

    < CPU2 .cfg >

    var logerBufParams = new LoggerBuf.Params();
    LoggerBufParams.numEntry = 32;
    var logger0 = LoggerBuf.create (logerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.always_on;

    System.SupportProxy = SysMin;
    boot.configureClocks = true;
    BOOT.OSCCLKSRCSEL = BOOT.OSCCLK_XTAL;
    boot.OSCCLK = 20;
    boot.SPLLIMULT = 20;
    bios.cpufreq.lo = 200000000;
    idleFxns[0]="&myIdleFxnCPU2";
    idleFxns[1]=空;
    var timer0Params =新 Timer.Params();
    timer0Params.instance.name ="timer0";
    timer0Params.period = 2000000;
    program.global.timer0 = Timer.create (空、"&myTickFxnCPU2"、timer0Params);

    void myTickFxnCPU2 (UARg 参数)

    tickCount2 += 1;
    isrFlagCPU2 = true;


    void myIdleFxnCPU2 (void)

    if (isrFlagCPU2 = true){
    isrFlagCPU2 = false;
    /*
    *将 tickCount 的当前值打印到日志缓冲区。
    *
    //Log_Info1 ("节拍数=%d\n"、tickCount);
    System_printf ("CPU2 BIOS 运行中\n");
    system_flush();



    **我是否必须在两个 CPU main.c 文件上分别写入“BIOS_start()”? 还是仅在主 CPU1上?

    注意事项

    Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,在两个项目中,你都需要在 main()中调用 BIOS_start()。

    关于 BIOS 引导模块--在 CPU1上,让引导模块配置系统时钟,然后调用 Device_init()(尝试再次配置它)是多余的。 注释掉 Device_init()中的冗余代码或禁用.cfg 文件中的时钟配置。 您也不需要从两个 CPU 配置时钟、因此请考虑在 CPU2 .cfg 文件中禁用时钟配置。

    不过、您仍然需要保留"BIOS.cpufreq.lo = 200000000;"行、因为它可以告诉 SYS/BIOS 系统时钟的运行速度有多快。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢、Whitney。

    我按照您的说明更改了设置。 这样做、CPU1计时器和 CPU2计时 器似乎不能同时运行。

    但我认为 CPU1运行不当、正如我预期的那样。

    这里是我的 CPU1的主要来源。  

    ------------------------------------------------------

    void main (void){

    system_printf ("enter CPU1\n");
    system_flush();

    InitGpio();


    #ifdef _flash
    DEVICE_BOOTCPU2 (BOOTMODE_BOOT_TO_FLASH_SECTOR0);
    其他
    DEVICE_BOOTCPU2 (BOOTMODE_BOOT_TO_M0RAM);
    #endif


    System_printf ("CPU2正在引导\n");
    system_flush();

    Dint;

    init_led();
    init_ePWM();

    system_printf ("led、ePWM init\n");
    system_flush();

    EINT;
    ERTM;
    System_printf ("启用中断和实时\n");
    system_flush();

    BIOS_start();

    我在 CPU1计时器 ISR 上添加了"CPU1 BIOS 运行"注释打印、在 CPU2计时器 ISR 上添加了"CPU2 BIOS 运行"注释  

    --------------------------------------------------

    执行顺序(在我的意图中)是:  

     首先运行 CPU1.Out ->引导 CPU2并在控制台上写入注释(来自 CPU1主源)->运行 CPU2.Out ->在控制台上写入注释

    因此,控制台上有如下注释:

    "enter CPU1"->"CPU2 booting"->"led、ePWM init"->"enable interrupt & Real Time"->继续打印"CPU1 BIOS Running"

    -->(运行 CPU2.out 后)"enter CPU2"->继续打印"CPU2 BIOS Running "和"CPU1 BIOS Running"(因为两个 CPU 的 BIOS 都在运行)  

    但实际性能如下:

    (运行 CPU1.out 后)->控制台上无显示->运行 CPU2.out ->"enter CPU2"->单独打印" CPU2 BIOS 运行"

    我似乎错过了有关引导顺序或执行序列的内容。

    您能就此情况提供一些建议吗? 我已经在这种情况下(运行两个 CPU 的 SYS/BIOS)停留了几周....

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当您停止 CPU1时、它卡在哪里? 它甚至是将它添加到 main()吗? ROV 是否显示任何错误?

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已将命令文件(CPU2项目)"TMS320F2838X1.cmd"更改为"TMS320F2838X2.cmd" 、以便使用 CPU1以不同的方式定义存储器映射。

    现在,CPU2在我调试 .ccxml 时开始运行(同时存在两个 CPU 项目),即使我不单击“恢复”按钮,也没有任何变化,因为我运行 CPU1 (它应该增加计时器计数)

    这是 CPU1.OUT ROV 上的错误消息

    1.[timer]错误:java.lang.exception:target memory read failed at address:0x7460656、length:24根据  应用程序的段映射、此读取位于无效地址。 应用程序可能未初始化或已损坏。

    和来自 CPU1.Out 调试会话的消息

    xdc_runtime_Error_PolicyDefault_E (struct xdc_runtime_Error_Block *、unsigned int、char *、int、unsigned long、 long、long)() at Error.c:168 0x08189E  

    xdc_runtime_Error_raiseX__E (struct xdc_runtime_Error_Block *、unsigned int、char *、int、unsigned long、 long、long)() at Error.c:126 0x082919  

    **在哪里可以找到有关双核 SYS/BIOS 的基本代码结构或示例?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我能够获得与您的工作类似的应用。 我将共享 main.c、链接器命令文件和.cfg 文件。

    e2e.ti.com/.../2838x_5F00_FLASH_5F00_lnk_5F00_cpu1.cmd
    e2e.ti.com/.../app_5F00_cpu1.cfg
    e2e.ti.com/.../2364.main_5F00_cpu1.c

    e2e.ti.com/.../2838x_5F00_FLASH_5F00_lnk_5F00_cpu2.cmd
    e2e.ti.com/.../app_5F00_cpu2.cfg
    e2e.ti.com/.../2063.main_5F00_cpu2.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢分享文件、Whitney。  

    我删除了.c &.cmd &.cfg 文件并将您的文件放在我的项目中,但问题仍然存在。

    编译器上没有错误,CPU2在我调试时开始运行(似乎 CPU2没有实际运行。 由于 tickCount2不增加) ,但实际上 CPU1运行正常(控制台和 tickCount1增加了"CPU1 BIOS 运行"注释)  

    现在、我想调试过程中会出现错误

    基于"调试多核器件"(https://software-dl.ti.com/ccs/esd/documents/ccs_multi-core-debug.html)、我通过.ccxml 文件(存在两个文件名相同的项目)调试了项目

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、我不知道为什么 CPU2的状态在调试会话中始终处于"正在运行"状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    昨天我第一次遇到 CPU2问题、但在增加堆栈大小并对 cmd 文件进行一些更新之后、它似乎消失了。 更新位于我发送的文件中、因此我不知道为什么它仍在为您执行。 如果您重置并重新启动 CPU2、您是否可以使其转至 main()?

    如果您按下 CPU2的"暂停"按钮、您能看到它在什么位置卡住了-在某个地址或代码行上吗? .out 是否正确加载? 您可以转到"Run"->"Load"->"Load Program..."。 再次加载以确保安全。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最后,它是有效的!  

    我创建了新项目并导入您的文件。 我工作了!!

    我想 之前项目中的某些内容 与您的 fille 相冲突。 这就是我没有使用您的文件运行项目的原因。

    我有最后一个问题。 您可以提供两种解决  方案:增加堆栈大小和更新 cmd 文件。

    您似乎使用现有的.cmd 文件(2838x_flash_Ink _cpuX.cmd)(对 cmd 文件进行更新)

    但是、如何检查堆栈大小的增加? 增加堆栈大小有什么影响?

    此致

    Kim

    **对于遇到与我类似的问题并正在阅读此帖子的每个人,最好以不同的方式(在.cfg 文件中)设置计时器 ID,以便独立控制 CPU 计时器。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴它现在正在工作! 当我提到堆栈大小的变化时、我指的是 cfg 文件中的 Program.stack 行。 您可以使用 ROV 来监控 Swi 和 Hwi 的系统堆栈使用情况、以了解您与溢出的接近程度。 SYS/BIOS 还会在系统初始化期间使用模式(如果我正确调用、则为0xBEBE)填充堆栈、这样可以轻松地在内存浏览器中查看堆栈并查看使用了多少。

    惠特尼