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.

[参考译文] RTOS/TMS320F28075:SYS/BIOS 和引导/固件分离

Guru**** 2595800 points
Other Parts Discussed in Thread: TMS320F28075

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/587573/rtos-tms320f28075-sys-bios-and-boot-firmware-separation

器件型号:TMS320F28075

工具/软件:TI-RTOS

您好!
我正在使用 TMS320F28075 DSP 和 TI SYS/BIOS (仅 TI SYS/BIOS、不是完整的 RTOS)开发一个新电路板。
我使用的是 CCS 版本6.1.00022。

在前几周、我已经对 TI 示例进行了一些测试、以熟悉任务、时钟、Swi、Hwi、ECC 的 SYS/BIOS 管理。

现在、我要构建电路板的软件。

该软件分为两部分:

1)引导:它包括 INIT()函数、该函数在 DSP 上电后在启动时执行。
init()函数初始化一些基本 DSP 资源(CPU 时钟、端口等),然后检查外部闪存:如果在其中找到新固件,init()将该固件复制到 DSP 闪存的 FW_FLASH_SECTION 中。
最后 init()调用 main()函数,该函数包含在固件中。

2)固件:它包括 main()函数和与应用程序相关的所有函数。
main()函数初始化某些数据结构,然后调用 BIOS_start()函数,启动 SYS/BIOS。

引导和固件是在同一个 CCS 项目中开发和编译的。

在首次编程引导中、固件通过引导加载程序下载到 DSP 中。

首次编程后、我希望通过现场总线/USB 端口按我希望的频率使用以下步骤来升级固件(假设板上安装了固件版本1.0、并且必须安装固件版本2.0)
-主设备将固件2.0下载至板载外部闪存;
-固件1.0退出并再次执行引导;
-引导会将固件2.0找到外部闪存、通过擦除 FW_FLASH_SECTION 来取消 Firmare 1.0、然后在 FW_FLASH_SECTION 中复制固件2.0;
-最后引导调用固件2.0中包含的 main()函数,因此执行新固件。

协调中心是:
a) boot 必须调用 main()函数(正确!) 对于所有固件版本、使用固件版本1.0只编译一次 ALTough 引导。 换言之,boot 必须知道所有固件未来版本的 main()函数的地址;
b)引导函数/数据和固件函数/数据之间不得有链接。

在我之前的应用(没有 SYS/BIOS)中、我应用了一些权变措施来满足这些要求:
a) main()函数的地址被复制到引导程序已知的同一闪存位置 address_main 中。 换言之,在不同固件版本中,main()位于不同的闪存位置,但其地址始终复制到 address_main 中,因此引导 init()函数可以通过指向 address_main 的指针调用 main();

b)引导和固件是在同一 CCS 工程中开发的、但它们位于 DSP 闪存存储器的不同扇区(BOOT_FLASH_SECTION 和 FW_FLASH_SECTION)中。 此外、引导和固件对其数据和变量使用不同的 RAM 扇区(BOOT_RAM_SECTION 和 FW_RAM_SECTION)。

在此应用中、我使用 SYS/BIOS。
我已经了解到启动序列由 XDCTools ( http://rtsc.eclipse.org/docs-tip/Using_xdc.runtime_Startup )管理 ,并且在某个位置调用 main()函数(即使我不知道在哪里...)。
关于要求 A),我需要不直接进行 main()调用,否则我必须同时编译和升级引导和固件,而只想升级固件。

问题1:如何满足此要求?

对于要求 b)、我将 Startup_resetFxn ()、Startup_firstFxns ()、Startup_lastFxns ()定位到 boot_flash_section 中、而任务、时钟、计时器、Swis、Hwi 和所有 SYS/BIOS 内容都位于 FW_FLASH_SECTION 中、因为我希望引导和固件之间没有链接、但 address_main 除外。
但是、我不知道 XDCTools 或 SYS/BIOS 是否仍然在位于 BOOT_FLASH_SECTION / BOOT_RAM_SECTION 中的函数或数据结构与位于 FW_FLASH_SECTION / FW_RAM_SECTION 中的函数或数据结构之间保留一些"隐藏链接"。

问题2:为了确保引导中的所有 XDCTools/SYS-BIOS 填充不与固件中的 XDCTools/SYS-BIOS 填充链接、我必须做什么?

提前感谢您的回答。

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

    SYS/BIOS 实际上并未设置为满足您的要求。 正如您所指出的,内核在 main()之前调用了几个项目。 我们从未记录过在 main()之前需要发生的项目的整个列表,我不愿意这样做,因为它可能会随着不同版本的不同而发生变化。

    我们也没有从图像中删除预主项目的机制。 我认为您需要一个简单的引导加载程序(不带 SYS/BIOS)来执行您的引导功能。 然后是单独的固件项目。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    感谢您的回答。 我担心这是解决办法,但我希望不是。
    没关系、这是可以的。

    谢谢。

    演示