一,前言
vl.c中main開始初始化,然后就是一個(gè)while循環(huán)進(jìn)行事件處理。今天主要從QOM模型入手來(lái)分析初始化代碼。且圍繞boards-discovery.c中注冊(cè)的函數(shù)來(lái)分析,主要了解什么時(shí)候注冊(cè),什么時(shí)候使用,通過(guò)這樣來(lái)了解設(shè)計(jì)方法。
二,源碼分析
通過(guò)每個(gè)模塊的type_init在main函數(shù)調(diào)用前就進(jìn)行注冊(cè),加入到hash表就不多說(shuō)了。static GHashTable *type_table;
-
然后就開始調(diào)用這個(gè)hash表了,Type_new函數(shù)就是把TypeInfo內(nèi)容復(fù)制到TypeImpl。
總的來(lái)說(shuō)type_register_internal就是創(chuàng)建一個(gè)TypeImpl類,然后添加到hash表中。
static TypeImpl *type_register_internal(const TypeInfo *info)
{
TypeImpl *ti;
ti = type_new(info);
type_table_add(ti);
return ti;
}
- 可以看到ti->name為key,ti為value。
static void type_table_add(TypeImpl *ti)
{
assert(!enumerating_types);
g_hash_table_insert(type_table_get(), (void *)ti->name, ti);
}
- 關(guān)于父類繼承是通過(guò)parent_type進(jìn)行的連接。type_get_by_name通過(guò)hash表的name找到TypeImpl,然后子類指向父類的TypeImpl,其實(shí)是在type_initialize函數(shù)中處理的type_get_parent。
static TypeImpl *type_get_parent(TypeImpl *type)
{
if (!type->parent_type && type->parent) {
type->parent_type = type_get_by_name(type->parent);
g_assert(type->parent_type != NULL);
}
return type->parent_type;
}
在代碼中,其實(shí)就是通過(guò)name進(jìn)行了父類關(guān)系連接。

- type_initialize是一個(gè)關(guān)鍵函數(shù),利用了歸遞方式,這是類似圖形HMI編程常用的方法,比如litegul和LVGL都有類似的歸遞代碼來(lái)處理圖層,從底層繪制到頂層。當(dāng)前qemu中是從父類開始,先復(fù)制父類的class到子類,然后一次進(jìn)行type實(shí)例中class的初始化。

- type_initialize還將Objectclass和TypeImpl進(jìn)行了掛鉤。
ti->class->type = ti;
-
stm32f4_discovery_board_class_init_callback函數(shù)的關(guān)鍵路徑。
居然是find_default_mechine后進(jìn)行foreach循環(huán)處理之前添加到hash表的TypeImpl對(duì)象,然后進(jìn)行歸遞初始化mc。
-
MachineClass *mc = MACHINE_CLASS(oc);我理解直接指向class等于直接引用,但是mc是個(gè)臨時(shí)變量啊,有什么用?那么就看看賦值的函數(shù)在哪里用吧!那么我就在這個(gè)函數(shù)內(nèi)打斷點(diǎn)。
- 看上去來(lái)源是machine_class,在select_machine函數(shù)中,也就是qemu啟動(dòng)傳入的參數(shù)里面包括board名字,然后就找到了machine_class。
MachineClass *mc = find_machine(board_name);
if (mc == NULL) {
cm_board_help_func("?");
} else {
machine_class = mc;
}
剛剛說(shuō)的mc臨時(shí)參數(shù),原來(lái)是find_machine的返回值,而且還給了變量machine_class,所以找到了關(guān)系。只是里面用了g_hash_table_foreach等api,不熟悉,僅先猜測(cè)功能,當(dāng)黑盒處理。

三,小結(jié)
繼續(xù)逐各擊破來(lái)分析。真心不清楚,現(xiàn)在簡(jiǎn)書的圖上傳后怎么自動(dòng)壓縮了。



