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.
您好!
我的客户修改了 SBL 以支持 FreeRTOS、但启动应用程序失败。 你对这个问题有什么想法吗?
我正在尝试重现问题。 我们仍然可以通过以下方式在 CCS 中调试 FreeRTOS SBL 吗?
谢谢。
Chris
尊敬的 Chris Meng:
feie feie 说:我的客户修改了 SBL 来支持 FreeRTOS、但启动应用程序失败。 您对此问题有任何想法吗?
引导加载程序文件不是为 FreeRTOS 驱动程序库构建的。 对 RTOS 不支持 SBL。
feie feie 说:我们仍然可以通过以下方式调试 CCS 中的 FreeRTOS SBL 吗?
是的、这可以用于相同的用途。
此致、
Aakash
Aakash,
引导加载程序文件不是为 FreeRTOS 驱动程序库构建的。
我对 SBL 函数流程的理解是读取闪存上的应用映像并将其复制到 RAM 中。 更改中断矢量表、然后复位内核以从应用重新启动。
在 Noos 或 FreeRTOS 上实施的这些函数有何差异?
谢谢。
Chris
尊敬的 Chris Meng:
我们 既不支持 FreeRTOS、也没有对流程进行测试。 现在预测任何问题还为时过早。 但什么 API 你面临的问题或是失败为你?
此致、
Aakash
Aakash,
这些天我做了更多的测试。 请在下面查找更多详细信息。
1.我修改了 mcu_plus_sdk_am273x_08_04_00_17中的 FreeRTOS Empty 演示、以支持 SBL 功能。 请在下面找到我的测试项目。
由于无法使用上述 SBL 引导应用并易于调试、我在上述项目中禁用了 QSPI 中的 DMA 功能。
2.在上述 SBL 下,如果应用较大,如毫米波 MCU 和 SDK 中的毫米波演示。 在对 app 的 MSS 代码的第二大段进行闪存读取期间、代码将运行异常。
3.如果我使用像 hello 这样的小应用程序、Flash 读取工作正常。 但在闪存读取之后、代码将在 DebugP_log 中的信标挂起中挂起。
SemaphoreP_PEND (&gDebugLogLockObj、SystemP_WAIT_FOREVER);
您可以帮助检查我在有关 FreeRTOS 的本次 SBL 中可能错过的内容吗?
谢谢。
Chris
尊敬的 Chris Meng:
感谢您提供这些详细信息。 让我来完成此过程并获取更多信息。 ETA:02/27/2023
此致、
Aakash
Askash、
有更新吗?
谢谢。
Chris
您好,Chris Meng
我们仍在研究此问题、因此预计会有延迟。 该专家不在办公室、很快就会回来与您联系。
此致
Sri Vidya
尊敬的 Chris Meng:
我们正与 FreeRTOS 一起研究一个闪存示例、以预测是否存在任何与此相同的问题。
此致、
Aakash
我们的产品即将量产、但 FreeRTOS 引导跳转到应用程序的功能仍被阻止。 请帮助提高这一问题的优先地位并帮助将其置于实际位置。 非常感谢。
Aakash,
此问题已存在很长时间。 请您提供一个估计的反馈日期?
谢谢,
Chris
尊敬的 Gmsy Bryant / Chris Meng:
让我来讨论一下最高优先级的问题。 我预计在3月10日之前结束。
此致、
Aakash
尊敬的 Chris Meng:
此处需要一些说明-
设备中应用程序的存储器映射是什么? 是这样吗?
我尝试了此功能、它对我有效(在 AM263x 上)。 您能否共享存储器映射、以便我也可以在 AM273x-EVM 上尝试相同的操作?
此致、
Aakash
我尝试过此版本,它对我来说是有效的(在 AM263x 上)。 [/报价]你是否将 SBL 与我分享的 FreeRTOS 和 hello word 项目一起使用?
您能否共享内存映射,以便我也可以在 AM273x-evm 上尝试相同的内存映射?你是指 SBL 与 FreeRTOS 的映射吗?
谢谢。
Chris
[/quote]
尊敬的 Chris Meng:
您是否使用了 SBL 与 FreeRTOS I shared 和 hello word 项目?
可以。 我还必须禁用 EDMA。 不过、我将在内部讨论这一点。
您的意思是 SBL 与 FreeRTOS 的映射吗?
否 实际上、我想知道应用程序 在存储器以及 SBL QSPI 中的位置是什么、我将假设它位于200KB (最大值)的 MSS_L2的开始处。
此致、
Aakash
我还必须禁用 EDMA。
EDMA 的 QSPI 驱动程序存在问题、在8.5版本中已修复。
否 实际上、我想知道应用程序 在存储器中的位置以及 SBL QSPI 的位置、我假设它位于200KB (最大值)的 MSS_L2起始位置。
FreeRTOS 项目的 SBL 使用来自 defulat Noos SBL 的 cmd 文件。 映射文件与此类似。
对于 app、我认为映射文件会提供您需要的信息。 如果您需要其他信息、请告知我。
谢谢。
Chris
尊敬的 Chris Meng:
我想现在我已经清楚你正在尝试什么了。 我将在我的终端尝试此实验,但我想知道您为什么要在引导加载程序中集成操作系统?
Br、
Aakash
Aakash,
客户需要在 SBL 中添加以太网支持。
谢谢。
Chris
尊敬的 Chris Meng:
NO-RTOS 在08.05版中也提供 LwIP 支持。 我认为、比起将引导加载程序代码转换到 Free-RTOS、这可能是更好的选择。 Bootloader 应该是引导主应用程序的启动代码、但 OS (嵌入式系统中)应该是永无休止的循环。
您确定客户使用此路径是否可行?
此致、
Aakash
Aakash,
客户还遇到了 SBL 中的裸 Matel LWIP 驱动程序问题。
请通过 FreeRTOS 问题帮助您解决本 SBL 问题。 我认为这对于以后需要在 SBL 中使用 FreeRTOS 的其他客户也很有帮助。
谢谢。
Chris
Aakash,
请尽快向我们通报进展情况。
谢谢。
我们有一个与 FreeRTOS 配合使用的 SBL QSPI 的有效示例- tidrive.ext.ti.com/.../43231052-04f1-40d7-8d39-dddc93e40714
请尝试相同步骤、如果 您需要任何其他帮助、请告诉我。
此致、
Aakash
谢谢。我们会尽快验证。 我们想知道为什么 FreeRTOS SBL 以前引导失败。 它是否与 SBL 或应用程序的图像尺寸有关?
尊敬的 Gmsy Bryant:
尽管我无法找出共享应用程序中的问题的根本原因。 我想到的主要原因是 OS 的基本初始化需要稳定的 RTI 时钟、该时钟在启动期间或 PLL 配置之前不可用、这可能会导致失败。
此致、
Aakash
项目文件不能直接使用,提示元数据不能解释。我 比较了与原始 SBL 项目的区别。 您提供的项目中的链接是 nortos.am273x.r5f.ti-arm-clang.release.lib)如.cproject(…是否错误提供了项目?谢谢。
尊敬的 Gmsy Bryant:
我已经更新了使用 CCS 构建的项目的链接- https://tidrive.ext.ti.com/u/r1mKD5rZiha9WYoC/dc5e3029-8bf7-4c2c-a5fe-c537ce49f201?l
希望它有所帮助、
Aakash
您能否基于 MCU_PLUS_ SDK_ am273x_ 08_ 04_ 00_ 17来解决 FreeRTOS SBL 无法引导应用程序的问题? 我们的电路板目前处于08_05_00_24中网络功能仍然存在问题。谢谢。
尊敬的 Gmsy Bryant:
只需 在 CCS 中将 MCU_PLUS_SDK 更改为08_ 04_ 00_17即可。 SBL 应用程序是否存在 08_04_00_17上的任何其他问题?
此致、
Aakash
我尝试在08_04_00_17中,只有两个字母的 St 被打印,然后挂起来。 您能否在08_04_ 00_17中进行测试? 谢谢。
Aakash,
请在下面找到当前调试状态。
1. FreeRTOS SBL +hello world 项目: hello world 仍然挂起。
我可以看到串行端口上的 SBL 输出、但没有 hello world 打印。 然后我连接了 R5F 并加载了 hello world 符号。
然后在 CCS 中复位 CPU 并再次运行。 然后、我可以在串行终端中看到"Hello World"。
Hello world 应用程序映像似乎已正确复制到 ram。
您可以再次帮助吗?
谢谢。
Chris
Chris、您好!
在添加了 FreeRTOS 的情况下、我发现 SDK 有两个问题。
第一个问题: UART_flushTxFifo()在映像加载后被调用。
UART_flushTxFifo()在 UART FIFO 不为空但没有超时的情况下调用 taskP_yield ()。
TaskP_Yield ()调用 SVC,这会导致 SVC 异常。
FreeRTOS SVC 异常处理程序通常会调用 FreeRTOS 调度程序。 但是、应用程序已加载、因此会调用应用程序 SVC 处理程序。 SVC 处理程序是一个无限循环并且代码挂起。
第二个问题:在调用 Bootloader_runSelfCpu()之前中断处于活动状态
RTI 计时器(OS tick) IRQ 和 EDMA IRQ 处于活动状态。
这将导致通过 VIM/VIC 接口调用对 IRQ 处理程序的调用。
IRQ 处理程序包含一个 SVC 调用、该调用会导致 SVC 异常。
SVC 异常处理程序是应用 SVC 处理程序、因此代码挂起。
可能有更巧妙的解决方案、但目前我已完成了以下操作:
这似乎起作用。
我在下面附上了我的 CCS 项目。 我为 AM273x 构建了代码、并使用了 MCU+SDK 08.05。 我在 AM273x EVM 修订版 C 上测试了代码
此致、
弗兰克
我尝试了您提供的工程、但只有"正在启动 QSPI 引导加载程序..."。
我想知道我们的0805 SDK 之间是否存在差异。
我已经为我们的电路板提供了 syscfg。 我能否根据此 syscfg 重新编译并提供 timimage 映像? 我会再试一次。
/** *这些参数在生成该文件时被使用。 它们将 通过 GUI 或 CLI *在后续加载时自动应用。 有关如何覆盖这些参数的附加信息,请使用"--help"运行 CLI。 *@cliArgs --device "AM273x"--package "ZCE"--part "Default"--context "r5fs0-0"--product "MCU_PLUS_SDK_AM273x.evmAM273x@08.05.00 *@version{"tool":"1.14.0+2667"} */* 导入用于此配置的模块。 */ 常量闪存 = scripting.AddModule ("/board/flash/flash "、{}、false); const flash1 = flash.addInstance (); const bootloader = scripting.AddModule ("/drivers/bootloader/bootloader ",{}, false); const bootloader1 = bootloader.addInstance (); const EDMA = scripting.AddModule ("/drivers/edma/edma "、{}、false); const edma1 = eDMA.addInstance(); const hsmclient = scripting.AddModule ("/drivers/hsmclient/hsmclient "、{}、false); const hsmclient1 = hsmclient.addInstance(); const clock = scripting.AddModule ("/kernel/dpl/clock "); const debug_log = scripting.AddModule ("/kernel/dpl/debug_log "); const mpu_armv7 = scripting.AddModule ("mpu"/kernel/dpl/mpu_armv7、{}、false );const mpu_armv71 = mpu_armv7.addInstance ();const mpu_armu_armv72 = mpu_armus_armv7_arm (_armus_armcost_arm);cost_armU_armv7_armU_arm = addinstance_armv7** 配置值。 */ bootloader1.$name ="CONFIG_BOOTLOADER0"; bootloader1.appImageOffset ="0x000A0000"; flash1.$name ="CONFIG_FLASH0"; bootloader1.flashDriver = flash1; flash1.device ="custom_flash"; flash1.fname ="XM25QH64C"; flash1.flashManfId ="0x20"; flash1.peripheralDriver.$name ="CONFIG_QSPI0"; hsmclient1.$name ="CONFIG_HSMCLIENT0"; debug_log.enableUartLog = true; debug_log.enableCssLog = false; debug_log.uartLog.$name ="CONFIG_UART0"; debug_log.uartLog.intrEnable ="disable"; debug_log.uartLog.mss_uart.tx.$assign ="ms_UARTA" ;debug_log.uartLog.ms_uart.rX.$assign ="ball.uartLog.uartLog.ms_uartLog.tx.$assign ="ball.w2";debug_log.uartLog.uartLog.edmaConfig" = edma1;edma1.$name ="CONFIG_EDMA0"; flash1.peripheralDriver.edmaConfig = edma1; edma1.instance ="EDMA_MSS_A"; edma1.edmaRmDmaCh[0].resourceType = scripting.forceWrite ("ownDmaCh");edma1.edmaRmDmaCh[0] 。$name ="CONFIG_EDMA_RM0"; edma1.edmaRmQdmaCh[0]。$name ="CONFIG_EDMA_RM1"; edma1.edmaRmTcc[0]。$name ="CONFIG_EDMA_RM2";edma1.edmaRmParam[0].$name ="CONFIG_EDMA_RM3"; edma1.edmaRmReservedDmaCh[0].$name ="CONFIG_EDMA_RM4"; mpu_armv71.$name ="CONFIG_MPU_REGION0"; MPU_armv71.properties ="器件";MPU_armv71.allowExecute = false; MPU_armv72.$name ="CONFIG_MPU_REGION1";MPU_armv72.size = 15; MPU_armv73.$name ="CONFIG_MPU_Region2";MPU_armv73.baseAddr = 0x80000;MPU_armv73.size = 15; mpu_armv74.$name ="CONFIG_MPU_Region3";mpu_armv74.baseAddr = 0x10200000; mpu_armv74.size = 20; mpu_armv75.$name ="CONFIG_MPU_REGION4"; MPU_armv75.baseAddr = 0x102E0000; MPU_armv75.size = 16; MPU_armv75.attributes ="NonCached"; MPU_armv75.allowExecute = false; MPU_armv76.$name ="CONFIG_MPU_REGION5"; MPU_armv76.baseAddr = 0xC3000000; MPU_armv76.size = 14; mpu_armv77.$name ="CONFIG_MPU_REGION6"; mpu_armv77.size = 14; mpu_armv77.baseAddr = 0xC3800000; /** *用于未锁频引脚/外设的 Pinmux 解决方案。 这可确保在将来 *版本的工具中对自动解算器进行的微小更改不会影响您最初看到的 pinmux。 可以完全删除这些行、以便 *从头开始重新解算。 */ flash1.peripheralDriver.ms_qspi["0"].$conrectestSolution ="blue.c2"; flash1.conrectalDriver.ms_qspi["1"].$conrectalDriver.ms_peripheralSolutionestSolution ="blue.d2" ;flash1.flash1.flashalDriver.ms_qspi["2k ="MSS_QSPI0"; flash1.peripheralDriver.MSS_QSPI.clk.$consetSolution ="Ball.E1";flash1.peripheralDriver.MSS_QSPI.cs.$consetSolution ="Ball.F2";
尊敬的 Gmsy:
我正在使用已安装的 SDK 08.05。 我尚未对其进行任何修改。
能否基于此 syscfg 重新编译 tidimage 图像并提供它?
我不明白。 您是否要求我重新编译?
此致、
弗兰克
尊敬的 Gmsy:
我收到以下 UART 日志:
正在启动 QSPI 引导加载程序...
[bootloader_profile]引导介质 :NOR SPI FLASH
[bootloader_profile]引导介质时钟:80.000 MHz
[bootloader_profile]引导映像大小 :64 KB
[bootloader_profile] Cores Present :
r5f0-0
[引导加载程序配置文件] System_init : 160us
[引导加载程序配置文件] Drivers_open : 32us
[Bootloader profile] Board_driversOpen : 2558us
[引导加载程序配置文件] CPU 负载 : 58193us
[BOOTLOADER_PROFILE] SBL 总耗时 : 60946us
图像加载已完成,正在切换到应用程序...
世界、您好!
在这里、我正在使用我上面分享的 SBL-FreeRTOS 项目。 对于此应用、我将使用 FreeRTOS 版本的 hello world 项目: https://software-dl.ti.com/mcu-plus-sdk/esd/AM273X/08_05_00_24/exports/docs/api_guide_am273x/EXAMPLES_HELLO_WORLD.html
我在下面附上了项目。
此致、
弗兰克
Frank 和 Aakash、
非常感谢您的友好帮助! 现在我可以很好地启动 FreeRTOS SBL (8.05)+ hello world 应用程序。
对于8.04、我按照 Aakash 的建议将 UART 更改为轮询模式、并且效果也很好。
此致、
Chris
Frank:
客户在 FreeRTOS SBL 中添加了打开的以太网、然后无法再次启动应用程序。 以下是我对本期问题的建议。 您是否愿意查阅并发表您的评论?
1.在 Bootloader_loadCpu (bootHandle、&bootImageInfo.cpuinfo[CSL_CORE_ID_R5FSS0_0])期间将 MSS 矢量表保存到变量中、而不将其复制到存储器中;
2、在将 MSS 映像从闪存读取到存储器后、关闭驱动程序。
3.禁用 HWI。
4.将 MSS 矢量表复制到存储器中
5.重置 MSS 内核
谢谢。
Chris
Chris、您好!
我再把它重新分配给 Aakash、因为他是我们的战靴专家。
此致、
弗兰克
Chris、您好!
1. 在 Bootloader_loadCpu (bootHandle、&bootImageInfo.cpuinfo[CSL_CORE_ID_R5FSS0_0])期间将 MSS 矢量表保存到变量中、而不是复制到存储器;
您是否复制了软件的所有部分?
4. 将 MSS 矢量表复制到存储器
由于这是 MSS、因此地址假设为0x0。
对我来说、流程很好。 您在这里的故障点是什么?
此致、
Aakash