了解 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

这一行的意思是:

到目前为止,还不错。但是标签文件中有很多行我无法理解。例如:

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_TypeDefstruct:__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)。