我用了#34; Exhuberant ctags"索引我的c项目中的所有标签。该项目是用于Cortex-M7微控制器的嵌入式软件。结果是一个标签文件。我试图阅读这个文件并理解写下来的内容 根据我发现的ctags和Exhuberant ctags的文档,我可以掌握大多数行的含义。例如:
ADC3 .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h 1525;" d
这一行意味着:
ADC3
的广告代码。.\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h
。1525
行。d
- 这是一个"宏定义"。到目前为止,这么好。但是标签文件中有很多行我无法理解。例如:
A0 .\Drivers\CMSIS\Include\arm_math.h /^ q15_t A0; \/**< The derived gain, A0 = Kp + Ki + Kd . *\/$/;" m struct:__anon68
这一个:
ABFSR .\Drivers\CMSIS\Include\core_cm7.h /^ __IOM uint32_t ABFSR; \/*!< Offset: 0x2A8 (R\/W) Auxiliary Bus Fault Status Register *\/$/;" m struct:__anon187
这一个:
ABR .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^ __IO uint32_t ABR; \/*!< QUADSPI Alternate Bytes register, Address offset: 0x1C *\/$/;" m struct:__anon39
这一个:
ADC_Common_TypeDef .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^} ADC_Common_TypeDef;$/;" t typeref:struct:__anon3
这一个:
ADC_IRQn .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^ ADC_IRQn = 18, \/*!< ADC1, ADC2 and ADC3 global Interrupts *\/$/;" e enum:__anon1
这一个:
C .\Drivers\CMSIS\Include\core_cm7.h /^ uint32_t C:1; \/*!< bit: 29 Carry condition code flag *\/$/;" m struct:__anon182::__anon183
我可以说... ...
你能帮我理解一下吗?也许制定一两个例子,同时给出一些关于如何解释这些线的一般规则?这将非常有用。编辑:对于&#34;通用ctags&#34;的最新.exe文件,请参阅此问题:Universal ctags on Windows
答案 0 :(得分:1)
一般来说,手动查看CTags文件并不会很有效率(虽然我知道你可能只是想了解发生了什么)。话虽如此,这里是我对你发布的各种条目的解释。
我怀疑你所看到的大部分内容都属于这些广泛的类别之一,但如有疑问,直接查看代码将真正帮助你找出正在发生的事情。
A0 .\Drivers\CMSIS\Include\arm_math.h /^ q15_t A0; \/**< The derived gain, A0 = Kp + Ki + Kd . *\/$/;" m struct:__anon68
A0
是结构(m struct:__anon68
)的成员,用于向/从数学加速函数传递数据。
ST以特定方式声明其硬件寄存器。我将使用core_m7.h
中的一个示例,该示例声明所有Cortex-M7 CPU共用的寄存器块,无论供应商如何:
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
} NVIC_Type;
/* ... */
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
/* ... */
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
结构确定各种配置和控制寄存器的内存位置,在本例中是NVIC
(嵌套向量中断控制器)块,它管理系统的异常处理。
就CTags而言,这与上面的A0
相同。 (非常重要的)区别在于如何实例化结构 - 对于硬件块,结构声明映射到必须特殊处理的特定内存地址。
您的许多ctags行都会引用这些声明,包括:
ABFSR .\Drivers\CMSIS\Include\core_cm7.h /^ __IOM uint32_t ABFSR; \/*!< Offset: 0x2A8 (R\/W) Auxiliary Bus Fault Status Register *\/$/;" m struct:__anon187
ABR .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^ __IO uint32_t ABR; \/*!< QUADSPI Alternate Bytes register, Address offset: 0x1C *\/$/;" m struct:__anon39
这两个都是结构成员。在您的代码中,您可能会看到类似SCB->ABFSR = ...
的内容。
C .\Drivers\CMSIS\Include\core_cm7.h /^ uint32_t C:1; \/*!< bit: 29 Carry condition code flag *\/$/;" m struct:__anon182::__anon183
值得特别对待,因为它是一个位域声明。它更复杂,因为它是一个结构成员里面一个联合(m struct:__anon182::__anon183
),但实际上它是同样的东西。根据您的看法,这些匿名嵌套可以变得非常深入 - 跟踪这些东西是CTags和类似工具真正开始证明其价值的地方。
ADC_Common_TypeDef .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^} ADC_Common_TypeDef;$/;" t typeref:struct:__anon3
这就是CTags跟踪所有匿名结构的方式。它说&#34; ADC_Common_TypeDef
与struct:__anon3
&#34;
ADC_IRQn .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^ ADC_IRQn = 18, \/*!< ADC1, ADC2 and ADC3 global Interrupts *\/$/;" e enum:__anon1
这是一个常量(ADC中断的中断向量编号)。它被声明为匿名枚举(e enum:__anon1
)的一部分。