eCos中的main函数

来源:互联网 发布:python xml dom 编辑:程序博客网 时间:2024/04/29 20:47

mingdu.zheng <at> gmail <dot> com
http://blog.csdn.net/zoomdy/article/details/12622843


eCos提供了标准的main函数支持,这给程序移植提供了便利,函数原型

int main(int argc, char* argv[]);

输入参数通过CYGDAT_LIBC_ARGUMENTS选项定义,该选项位于

ISO C library  ISO environment startup/termination    Arguments to main()

eCos可以通过三种方式调用main函数。


一、作为eCos线程

ISO C library  ISO environment startup/termination    Startup context for main()      Invoked as eCos thread   ==> true

这是包含kernel组件时的默认配置。这种配置下,eCos将在初始化过程创建一个线程,该线程的入口函数为cyg_libc_invoke_main,cyg_libc_invoke_main负责为main函数准备命令行参数,即main函数的argc和argv参数,然后调用main函数,并在main函数退出后调用phtread_exit或exit函数执行清理工作。

使用这种配置,编写eCos应用就像在Linux上编写多线程应用一样,首先进入的是main函数,在main函数中创建其它线程,同时main也作为多线程之一继续运行。

如果应用没有提供main函数,那么将链接到C库提供的默认main函数,该默认实现除了将main线程挂起不做其它任何事。


二、在初始化环境中调用main函数

ISO C library  ISO environment startup/termination    Startup context for main()      Invoked from initialization context   ==> true

这是不包含kernel组件时的默认配置。这种配置下,C库将重定义cyg_user_start函数,并覆盖infra提供的cyg_user_start函数,在C库重定义的cyg_user_start中调用cyg_libc_invoke_main来调用main函数。

这种方式适合没有包括kernel的情况,在没有kernel的情况下,用户可以不用定义cyg_user_start函数,而是定义main函数。C库定义的cyg_user_start函数是弱函数,因此如果用户仍然定义cyg_user_start函数,那么C库的cyg_user_start函数将被用户定义函数覆盖,即使定义了main函数也不会被调用执行,但是用户可以自行调用cyg_libc_invoke_main来调用main函数。


三、用户自行调用

ISO C library  ISO environment startup/termination    Startup context for main()      Invoked elsewhere   ==> true

这种配置下,eCos将不会调用main函数,如果有需要应用程序可以自行调用cyg_libc_invoke_main来创建main运行环境、调用main,使用cyg_libc_invoke_main调用main函数所引用的argv是在eCos配置的过程中决定的不能在运行时修改,假如应用程序需要可以修改mian函数引用的argv,那么可以自行实现cyg_libc_invoke_main函数(但是不能命名为cyg_libc_invoke_main,cyg_libc_invoke_main不是弱符号),在为main准备argv参数时动态读取创建argv所指向的内容,例如可以将入口参数保存到EEPROM且支持用户修改入口参数,在系统初始化时读取EEPROM的内容并转化成有效的argv参数传递给main函数。


更多内容

参数eCos源代码packages/language/c/libc/startup/<version>/src/cstartup.exx, invokemain,cxx, mainthread.cxx, main.cxx。

原创粉丝点击