分类:
2012-09-19 21:25:36
原文地址:Redboot 设备初始化说明 - [源码分析] 作者:fly123456789
:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://redboot.blogbus.com/logs/22987104.html
当redboot启动完毕后,进入cyg_start 函数,在这个函数里进行了初始化设备的工作:
for (init_entry = __RedBoot_INIT_TAB__; init_entry != &__RedBoot_INIT_TAB_END__; init_entry++)
{
(*init_entry->fun)();
}
__RedBoot_INIT_TAB__ 为初始化表,初始化表是一个 struct init_tab_entry 的数组。
而 struct init_tab_entry 只有一个函数 fun。
而这一段初始化过程就是执行初始化表中的每一个fun函数。
相关定义如下:
extern struct init_tab_entry __RedBoot_INIT_TAB__[], __RedBoot_INIT_TAB_END__;
struct init_tab_entry {
void_fun_ptr fun;
} CYG_HAL_TABLE_TYPE;
如果希望在这个初始化过程中,执行某函数需要加入如下声明:
RedBoot_init(net_init, RedBoot_INIT_LAST);
net_init 是网络设备的初始化函数, RedBoot_INIT_LAST是表示放在 __RedBoot_INIT_TAB__ 表的尾部。
-------------------------------------------------------------------
大致的实现原理在下面简单解释 一下
首先,_RedBoot_INIT_TAB__ 和 __RedBoot_INIT_TAB_END__ 有如下宏定义
CYG_HAL_TABLE_BEGIN( __RedBoot_INIT_TAB__, RedBoot_inits );
CYG_HAL_TABLE_END( __RedBoot_INIT_TAB_END__, RedBoot_inits );
#define CYG_HAL_TABLE_BEGIN( _label, _name ) \
__asm__(".section \".ecos.table." __xstring(_name) ".begin\",\"aw\"\n" \
".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \
".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \
".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \
__xstring(CYG_LABEL_DEFN(_label)) ":\n" \
".previous\n" \
)
#define CYG_HAL_TABLE_END( _label, _name ) \
__asm__(".section \".ecos.table." __xstring(_name) ".finish\",\"aw\"\n" \
".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \
".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \
".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \
__xstring(CYG_LABEL_DEFN(_label)) ":\n" \
".previous\n"
解析后大致为:
.section ".ecos.table.RedBoot_inits.begin","aw"
.globl __RedBoot_INIT_TAB__
.type __RedBoot_INIT_TAB__ ,object
.p2align 5
__RedBoot_INIT_TAB__ :
.previous
.section ".ecos.table.RedBoot_inits.finish","aw"
.globl __RedBoot_INIT_TAB_END__
.type __RedBoot_INIT_TAB_END__ ,object
.p2align 5
__RedBoot_INIT_TAB__ :
.previous
另外,对于 RedBoot_init(net_init, RedBoot_INIT_LAST); 宏定义分别如下:
#define RedBoot_init(_f_,_p_) _RedBoot_init(_f_,_p_)
#define _RedBoot_init(_f_,_p_) \
struct init_tab_entry _init_tab_##_p_##_f_ \
CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_inits,_p_##_f_) = { _f_ };
#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \
__xstring(_qual))
#define RedBoot_INIT_FIRST 0000
#define RedBoot_INIT_LAST 9999
#define CYGBLD_ATTRIB_SECTION(__sect__) __attribute__((section (__sect__)))
解析后大致为:
struct init_tab_entry _init_tab_RedBoot_9999net_init
__attribute__((section (.ecos.table.RedBoot_inits.data.9999net_init))) = { net_init };
-------------------------------
这种表结构在eCos的其他部分也经常使用,所以了解一下,很有必要的。