工具/软件: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 填充链接、我必须做什么?
提前感谢您的回答。