了解ctags文件格式

时间:2017-01-30 10:39:50

标签: arm ctags cortex-m exuberant-ctags

我用了#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

1 个答案:

答案 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_TypeDefstruct:__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)的一部分。