一,前言
本节主要看stm32f4_discovery_board_init_callback函数,里面大概看明白了,主要是2个部分,一个是SDL的初始化,另外一个是mcu中各个模块中寄存器对象的属性添加及设置属性值。
二,分析
- Object *object_new(const char *typename)才会调用class_init和ti->instance_init
- 看到了set "hse-freq-hz"属性值,搜索"hse-freq-hz",看看是哪里进行属性add的? 答:关于MCU的实现是调用了Object *mcu = cm_object_new_mcu(machine, TYPE_STM32F407VG); 此函数里面会调用object_new. 所以就要搜索.name = TYPE_STM32F407VG,在mcus.c中拉到底就可以看到他的parent了。然后这个parent和他的父类注册的函数都要被调用。所以stm32_mcu_instance_init_callback中就有add "hse-freq-hz"属性。
- 关于memeory在哪里构造的对象? 答:cortexm_mcu_memory_regions_create_callback中看到关键字Flash,sram及他们的其实地址和size在object_initialize(mr, sizeof(*mr), TYPE_MEMORY_REGION);中调用了。 .name = TYPE_MEMORY_REGION,就会调用typeImp的memory_region_initfn函数去实现。里面的属性主要有3种,地址/优先级/大小。
- 但是addr这样的属性在哪里add的呢? 答:搜索"addr"居然有json文件出现。.svd_file_name = "STM32F40x-qemu.json",确实之前注册过qmp_schema_json是json解析规则表,qjson.c就是用这个解析规则表格式来进行了json数据解析。
- 通过搜索svd_get_peripheral_by_name,随意找到一个adc1.c。但是看起来TYPE_STM32_ADC没有人去初始化。但是我知道gpio应该被调用过的,所以搜索TYPE_STM32_GPIO,可以发现初始化过这个object。 Object *gpio = cm_object_new(parent, child_name, TYPE_STM32_GPIO); 主要是在stm32_mcu_realize_callback函数中调用的,这里面还创建了uart。通过此函数的最后的注释也看到可以再继续添加更多。
- GPIO在哪里添加的属性对象的? 答:stm32_gpio_create中把gpio的属性创建完成了。主要是cm_object_realize(gpio); 比如对象信息都从json文件获取
1. "name": "GPIOA",
"description": "General-purpose I/Os",
"groupName": "GPIO",
"baseAddress": "0x40020000",
"addressBlocks": [
{
"offset": "0x0",
"size": "0x400",
"usage": "registers"
}
- 在加属性的时候就会添加各种属性的callback函数,如下cm_property_get_uint64_ptr_callback和cm_property_set_uint64_ptr_callback就是不同类型的特别的回调函数。
1. void cm_object_property_add_uint64_callback(Object *obj, const char *name,
const uint64_t *v)
{
Error *local_err = NULL;
object_property_add(obj, name, "uint64",
cm_property_get_uint64_ptr_callback,
cm_property_set_uint64_ptr_callback, NULL, (void *) v, &local_err);
if (local_err) {
error_report("Adding property %s for %s failed: %s.", name,
object_get_typename(obj), error_get_pretty(local_err));
exit(1);
}
}
- GPIO是在哪里实现为属性设置值的? 答:gpio的reg的寄存器都当做一个object,实现就在stm32f40x_gpio_create_objects函数。主要调用关系如下
stm32f40x_gpio_create_objects
stm32_gpio_realize_callback
device_set_realized
property_set_bool
object_property_set
object_property_set_qobject
object_property_set_bool
cm_object_realize
stm32_gpio_create
create_gpio
stm32_mcu_realize_callback
cm_device_by_name_realize
stm32_mcus_realize_callback
device_set_realized
property_set_bool
object_property_set
object_property_set_qobject
object_property_set_bool
cm_object_realize
stm32f4_discovery_board_init_callback
三,小结
属性添加和设置的主要api在上一节已经详细分析过了,本节主要看了个大概的实现思路,仿真的STM32的MCU属性从json文件来,然后就是创建,而且创建的过程都是要找父类的object,确保全部创建完成再创建子类object。创建所表达的意思就是添加属性及设置属性值。之后模拟运行就是靠这些属性值来进行逻辑判断了。
标签:set,Apple,cm,object,callback,源码,gpio,property,Qemu From: https://blog.51cto.com/u_16247275/7629931