lameck - 2008-4-12 17:43:00
应用程序的启动:
经过编译和链接的ecos在目标平台上运行时,首先运行的是硬件抽象层中的启动代码。硬件抽象层中包含了所有的启动代码,基主要启动过程可以概括为:
1).HAL对硬件进行初始化操作,与ROM监控程序协同工作,并进行诊断操作。
2).激活所有静态和全局C++静态构造函数。
3).HAL跳转到启动函数void cyg_start(void)。
下边分别介绍cyg_start()函数和该函数内部的一些与启动应用程序相关的几个函数,包括用户应用程序入口cyg_user_start()函数。
1.启动cyg_start()
启动cyg_start()函数是ecos启动机制的核心。该函数位于源文件infra/current/src/startup.cxx,它依次调用下列函数:
cyg_prestart()
cyg_package_start()
cyg_user_start()
如果在配置时选择了调度器,它还将启动被选择的ecos调度器。
这只是ecos所提供的一个实现方法。用户服务在进行自己的开发时,也可以使用下面的函数原型对该函数进行修改:
void cyg_start(void)
一般来说不需要对该函数进行修改,因为cyg_prestart()函数和cyg_user_start()函数具有足够的灵活性,允许用户加入其他程序代码,几乎可以满足所有的应用需求。
2.函数cyg_prestart()
该函数位于源文件infra/current/src/prestart.cxx内。ecos提供了默认的eyg_prestart()函数,不做任何操作。如果在进行其他系统级初始化操作之前还需要进行某些初始化操作,则可以使用该函数来实现。该函数原型为:
void cyg_prestart(void)
3. 函数cyg_package_start()
该函数位于源程序infra/current/src/pkgstart.cxx内。它允许在进入用户主程序之前对个别包进行初始化操作。
cyg_package_start()函数包含了两个包:UTTRON包和标准C库包。基础结构包中包含了两个配置选项CYGSEM_START_UITRON_COMPATIBILITY和CYGSEM_START_ISO_COMPATIBILITY,它们用于控制这些特殊的包的初始化。函数原型为:
void cyg_package_start()
用户可以根据该原型编写自己的cyg_package_start()函数,但在初始化默认包时必须加以小心。下面是用户编写该函数的一个例子:
void cyg_package_start(start)
{
#ifdef CYGSEM_START_UITRON_COMPATABILITY
cyg_uitron_start(); /*keep the uITRON initialization */
#endif
my_package_start(); /* make sure I initialize my package */
}
4.函数cyg_user_start()
该函数位于源文件infra/current/src/userstart.cxx内。cyg_user_start()函数是用户程序的正常入口点。ecos源码提供的该函数不做任何操作。这是用户创建自己线程的一个理想的地方。如果在配置时没有选择ISO标准C库包,则必须实现该函数,此时它是用户程序的一个强制性入口。其函数原型为:
void cyg_user_start(void)
用户可以编写自己的cyg_user_start()函数。ecos为该函数提供了一个默认实现,但不做任何工作。应用程序使用该函数作为入口时,将覆盖其默认实现,实现应用程序与ecos系统的连接。
当从cyg_user_start()函数返回时,cyg_start()函数将启动调度器,用户在cyg_user_start()函数中所产生和唤醒的所有线程都将开始执行。另一个值得注意的地方是由于cyg_user_start()函数是在调度器启动之前执行的,因此在该函数中不要使用任何需要调度器的内核服务。