也谈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指定存储位置为GpioDataRegsFile,GpioDataRegsFile代表什么呢? 经过查找我们在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地址进行操作。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮