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 运行两个内核。
这是我正在使用的程序版本
- 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 运行"注释)
现在、我想调试过程中会出现错误
此外、我不知道为什么 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)填充堆栈、这样可以轻松地在内存浏览器中查看堆栈并查看使用了多少。
惠特尼