了解 ctags 文件格式
Understanding the ctags file format
我使用 "Exhuberant ctags" 索引了我的 c 项目中的所有标签。 c-project 是用于 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
- 即 "macro definition".
到目前为止,还不错。但是标签文件中有很多行我无法理解。例如:
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
而且我可以继续前进...
你能帮我理解它们吗?也许制定一两个例子,同时给出一些关于如何解释这些线的一般规则?那真的很有帮助。
编辑:对于"universal ctags"的最新.exe文件,请参考这个问题:
一般来说,手动查看 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
) 的成员 to/from 数学加速函数。
硬件寄存器
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
值得特殊对待,因为它是位域声明。它更复杂,因为它是一个结构成员 inside 一个联合(m struct:__anon182::__anon183
),但实际上它是同一类东西。根据您所查看的内容,这些匿名嵌套可能会变得非常深——跟踪这些内容是 CTag 和类似工具真正开始证明其价值的地方。
类型定义
ADC_Common_TypeDef .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^} ADC_Common_TypeDef;$/;" t typeref:struct:__anon3
这就是 CTags 跟踪所有这些匿名结构的方式。它说“ADC_Common_TypeDef
与 struct:__anon3
相同”
常量(枚举)
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
)。
我使用 "Exhuberant ctags" 索引了我的 c 项目中的所有标签。 c-project 是用于 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
- 即 "macro definition".
到目前为止,还不错。但是标签文件中有很多行我无法理解。例如:
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
而且我可以继续前进...
你能帮我理解它们吗?也许制定一两个例子,同时给出一些关于如何解释这些线的一般规则?那真的很有帮助。
编辑:对于"universal ctags"的最新.exe文件,请参考这个问题:
一般来说,手动查看 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
) 的成员 to/from 数学加速函数。
硬件寄存器
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
值得特殊对待,因为它是位域声明。它更复杂,因为它是一个结构成员 inside 一个联合(m struct:__anon182::__anon183
),但实际上它是同一类东西。根据您所查看的内容,这些匿名嵌套可能会变得非常深——跟踪这些内容是 CTag 和类似工具真正开始证明其价值的地方。
类型定义
ADC_Common_TypeDef .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^} ADC_Common_TypeDef;$/;" t typeref:struct:__anon3
这就是 CTags 跟踪所有这些匿名结构的方式。它说“ADC_Common_TypeDef
与 struct:__anon3
相同”
常量(枚举)
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
)。