eCos中的main函数

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值