一, 前言
本章节主要是再把GPIO创建的内容进行细化,搞明白gpio是否一个object,还和其它什么内容有关。
二,分析
GPIOA,GPIOB等包括他们的寄存器都是object。
- 每个对象都会再object_new的时候分配空间,比如GPIOA和GPIOB都有自己的空间。创建GPIOA,主要包括创建goio-peripheral类型及在container中追加gpioA的属性。创建GPIOB,主要包括创建goio-peripheral类型及在container中追加gpioB的属性。 type的name名字叫TYPE_STM32_GPIO,也就是stm32:gpio-peripheral,会通过Object_new进行创建,其实就是从gpio.c中的TypeImpl中copy数据且执行钩子函数。
Parent是container的object也就是root object。
cm_object_property_add_child之前分析过,就是在属性成员中保存子类object。 这里就是把GPIOA作为container object的属性。
2.prop属性有自己的name,也有type。这里GPIOA就是属性的name。type是字符串,其实保留的就是一个object,因为object都是从typeImpl的数据中copy来的。
Object的class下第一个就是Type,也就是TypeImpl类型,它的第一个就是name。 struct ObjectClass { /< private >/ Type type; GSList *interfaces; … } 所以这里属性保存的就是这个type name。将来用来根据name来查找typeImpl对应的object中的内容用的。
- svd_add_peripheral_properties_and_children函数中还会创建Object,这是寄存器接口的type,reg名字是从json文件中获取的。 Object *reg = cm_object_new(obj, regi_name, TYPE_PERIPHERAL_REGISTER); svd_add_peripheral_register_properties_and_children(reg, regi); 看这2个关键语句是否和创建GPIO一样呢!只不过reg的属性是挂在peripheral-register对象下的,不是container对象下。
- 另外一个关键的就是realize都是将属性进行实现,也是比较关键的回调函数。
- 接着大概了解下这些GPIO设置的属性值如何用。
gpio_led_irq_handler
qemu_set_irq
cm_irq_set
stm32_gpio_set_odr_irqs
stm32_gpio_update_odr_and_idr
stm32f4_gpio_bsrr_post_write_callback
peripheral_register_write_callback
peripheral_write_callback
memory_region_write_accessor
access_with_adjusted_size
memory_region_dispatch_write
io_writex
io_writew
helper_le_stw_mmu
code_gen_buffer
cpu_tb_exec
cpu_loop_exec_tb
cpu_exec
tcg_cpu_exec
qemu_tcg_cpu_thread_fn
libpthread.so.0!start_thread
libc.so.6!clone
从这个虚拟cpu的线程调用函数来看,基本就是cpu线程执行,然后检查到有操作io口就调用io_writew,接着就是地址转换找到映射的reg,然后就是实现reg操作,接着的函数名字为什么是有个irq暂时不清楚,但是我理解这应该不是中断,这些irq调用后就是为led的SDL2设置一个event,然后LED就可以变绿色了。 关于这块的具体内容比较多,将来会进行分解学习。
三,小结
本节详细分析了下GPIO的实现,GPIOA,GPIOB包括他们的寄存器其实都是一个object对象,而且他们的reg也创建了object及分配了内存空间。而GPIOA,B等对象的属性是连接在container的object的属性下的一个个子node。每一个Reg对象属性是挂载在reg objet下的进行了链表连接。
标签:Apple,--,peripheral,object,name,源码,gpio,reg,属性 From: https://blog.51cto.com/u_16247275/7664864