本文由博主译自《SYS/BIOS(TI-RTOS Kernel) v6.46 User's Guide》,
TEXAS INSTRUMENTS,文献编号:SPRUEX3Q,2016年6月,P47-48。
内容以原文为准,转载或拷贝需标明本网址的链接。
3.1 SYS/BIOS启动时序
SYS/BIOS启动时序在逻辑上分为2个阶段:发生在应用(程序)的 main( ) 函数调用之前的操作;发生在应用(程序)的 main( ) 函数调用后的操作。
main()之前的启动时序完全由XDCtools runtime包管理。有关主程序之前的引导时序详见 "XDCtools Boot Sequence andControl Points" wiki 页面。XDCtools运行时启动时序入下:
1 CPU复位后立即完成对设备使用的CPU初始化。(从c_int00开始),这一步和 cinit( ) 一步的详细情况见 与你的器件相符的汇编语言工具用户指南 中的“程序加载与运行”一章。
2 在 cinit( ) 之前,运行复位功能表(xdc.runtime.Reset 模块提供了这个钩子)。调用在 Reset.fxns[ ] 数组中指定的函数。这些复位功能仅在复位以后且运行程序之前被调用。
3 运行 cinit( ),初始化 C 的运行时环境。
4 运行用户的第一个函数(xdc.runtime.Startup 模块提供了这个钩子)。
5 运行全部的模块初始化函数。
6 运行用户的最后一个函数(xdc.runtime.Startup 模块提供了这个钩子)。
7 运行pinit( )。
8 运行main( )。
main( ) 之后的启动时序由 SYS/BIOS 管理,为了完成初始化过程,需要在应用程序的main( ) 函数的结尾明确调用 BIOS_start()。当调用了BIOS_start(),SYS/BIOS 的启动时序如下:
1 启动函数。运行用户提供的启动函数(见BIOS.startupFxns)。如果系统支持定时器,全部静态创建的定时器都要按照它们的静态配置进行初始化。如果定时器配置成“自动”启动,定时器就从现在开始运行。
2 使能硬件中断。
3 使能软件中断。如果系统支持软件中断(Swis)则使能软件中断(见BIOS.swiEnabled)。
4 任务启动。如果系统支持任务,则开始任务调度(见BIOS.taskEnabled).如果系统里没有静态或动态地创建任务,则直接执行空闲的循环过程。
下面举例说明配置模块和目标的 .cfg 文件中关于启动时序的可能控制点:
————————————————————————————————————
Reset = xdc.useModule('xdc.runtime.Reset');
var Startup = xdc.useModule('xdc.runtime.Startup');
Startup.firstFxns[Startup.firstFxns.length++] = '&myFirst';
Startup.lastFxns[Startup.lastFxns.length++] = '&myLast';
var BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.addUserStartupFunction('&myBiosStartup');
————————————————————————————————————