从用户代码的角度来看,每个应用程序都像往常一样在main()程序中开始。
Cobalt
提供了两种不同的启动方式:自动启动和手动启动
--
Cobalt
服务已经就绪并可供使用。Cobalt
服务未初始化。Cobalt
服务之前进行一些早期的初始化,应该使用此模式。xenomai_init(&argc, &argv)
来启动进程的 Cobalt
服务。Cobalt
选项,然后更新参数指向一个清除了标准命令行选项参数的副本。在自动启动模式下,Cobalt
确保在执行任何主执行文件中的 C++ 静态对象构造函数之前,其服务已经被初始化。这意味着,位于主执行文件中的静态对象的构造函数可以安全地调用 Cobalt
服务。这种保证适用于默认优先级的静态构造函数。
与自动模式不同,手动启动模式下,Cobalt
服务在调用 xenomai_init()
之前不可用。如果你选择手动模式,需要在 xenomai_init()
被成功调用之后,才能在构造函数中安全地使用 Cobalt
服务。这意味着,如果构造函数需要在此之前使用 Cobalt
服务,你需要在静态对象构造之前手动初始化 Cobalt
。
如果静态对象被实例化在共享库中,无论是在自动还是手动模式下,这些对象的构造函数都无法访问 Cobalt
服务,因为它们被实例化的时间点在 Cobalt
启动代码之前。这是因为共享库的加载和初始化通常在主执行文件的初始化之前完成。
如果你有使用非默认构造优先级的静态对象,或者你的执行文件依赖于实例化了静态对象的共享库,你可能需要在这些构造函数尝试调用 Cobalt
服务之前,提供自己的早期引导代码。这包括在合适的时间点调用 xenomai_init()
,以确保在这些静态构造函数运行时,Cobalt
服务已经可用。
实时应用程序初始化过程引导软件层如下:
如果您使用手动初始化程序,请参考构建实时程序(手动启动)