DSP

也谈cmd文件

2019-07-13 14:55发布

  请看下面这行代码:GpioDataRegs.GPASET.bit.GPIO0=1;  我们都知道,这行代码的功能是对某一个io进行赋值。回顾一个c语言的语法,这行代码其实是对结构体进行变量进行的操作。我们提一个问题大家思考:编译器是如何将这行代码编译为对io的操作指令的呢?       再换一个问法:如果不这样写,我们如何写对io的操作代码呢?    下面我们继续分析代码,再看一看GpioDataRegs结构体的定义处,如下:struct GPIO_DATA_REGS {  union GPADAT_REG       GPADAT;      // GPIO DataRegister (GPIO0 to 31)  union GPADAT_REG       GPASET;      // GPIO DataSet Register (GPIO0 to 31)  union GPADAT_REG       GPACLEAR;     // GPIO Data Clear Register (GPIO0to 31)  union GPADAT_REG       GPATOGGLE;    // GPIO Data Toggle Register(GPIO0 to 31)   union GPBDAT_REG       GPBDAT;      // GPIO DataRegister (GPIO32 to 63)  union GPBDAT_REG       GPBSET;      // GPIO DataSet Register (GPIO32 to 63)  union GPBDAT_REG       GPBCLEAR;     // GPIO Data Clear Register(GPIO32 to 63)  union GPBDAT_REG       GPBTOGGLE;    // GPIO Data Toggle Register(GPIO32 to 63)  union GPCDAT_REG       GPCDAT;      // GPIO DataRegister (GPIO64 to 95)  union GPCDAT_REG       GPCSET;      // GPIO DataSet Register (GPIO64 to 95)  union GPCDAT_REG       GPCCLEAR;     // GPIO Data Clear Register(GPIO64 to 95)  union GPCDAT_REG       GPCTOGGLE;    // GPIO Data Toggle Register(GPIO64 to 95)  Uint16                  rsvd1[8];}; #pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");volatile struct GPIO_DATA_REGS GpioDataRegs; GPIO_DATA_REGS是结构体类型,GpioDataRegs是结构体变量。#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile")这行代码是关键代码,这行代码的功能是为变量GpioDataRegs指定存储位置为GpioDataRegsFileGpioDataRegsFile代表什么呢? 经过查找我们在cmd文件中找到了GpioDataRegsFile, 如下:SECTIONS{    GpioDataRegsFile  : > GPIODAT      PAGE = 1}GPIODAT的定义在这里  MEMORY{ PAGE 0:   /* ProgramMemory */  PAGE 1:   /* DataMemory */GPIODAT     : origin = 0x006FC0, length =0x000020     /* GPIO data registers */}   .结论:在cmd文件中定义了段的名称(GpioDataRegsFile),并根据dps实际情况指定地址, #pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile") 。这个语句指定GpioDataRegs变量对应的段名为GpioDataRegsFile,也即指定了GpioDataRegs变量所对应的地址。 所以在程序中,对结构体GpioDataRegs进行操作,实际上也就是对io地址进行操作。 

热门文章