当前位置:文档之家› 第4讲 位域结构体定义方法 2012-3-13

第4讲 位域结构体定义方法 2012-3-13


寄存器位域定义实例
/* 定时器控制寄存器的位域定义 */ struct TCR_BITS { //位号 Uint16 rsvd1:4; // 3:0 Uint16 TSS:1; //4 Uint16 TRB:1; // 5 Uint16 rsvd2:4; //9: 6 Uint16 SOFT:1; // 10 Uint16 FREE:1; // 11 Uint16 rsvd3:2; // 13:12 Uint16 TIE:1; // 14 Uint16 TIF:1; // 15 }; 位功能描述 保留位 启动与停止 重载控制设置 保留位 设置仿真模式 设置仿真模式 保留位 中断使能位 中断标志位
____________
8
TMS320F2812 DSP控制器原理及应用
#pragma DATA_SECTION语句的详细说明
The DATA_SECTION pragma allocates space for the symbol in C, or the next symbol declared in C++, in a section named section name. The syntax of the pragma in C is: #pragma DATA_SECTION ( symbol , " section name " ); The syntax of the pragma in C++ is: #pragma DATA_SECTION (" section name " );
4
TMS320F2812 DSP控制器原理及应用
位域结构定义语句的应用
volatile 是避免C编 译器优化 代码的关 键字
特点 (1)外设寄存器定义顺序与其占用存储器地址的顺序一致! (2)保留的成员变量仅仅为了占用相应的存储器地址 应用语句 用定时器寄存器结构体定义2812的3个定时器语句如下: volatile struct cputimer_regs cputimer0regs; volatile struct cputimer_regs cputimer1regs; volatile struct cputimer_regs cputimer2regs; 注意:至此,位域结构定义语句的寄存器宏常量并没有显式规定寄 存器宏常量的存储器地址。通常用#pragma DATA_SECTION语句 为每个寄存器结构体进行用户命名数据段的分配与绝对地址定 位。
____________
11
TMS320F2812 DSP控制器原理及应用
#pragma DATA_SECTION语句的详细说明

Using the DATA_SECTION Pragma C++ Source File
char bufferA[512]; #pragma DATA_SECTION("my_sect") char bufferB[512]; // bufferB分配段了 //bufferA没有分配!
____________
7
TMS320F2812 DSP控制器原理及应用
#pragma
#pragma #pragma #pragma #pragma #pragma CODE_SECTION(func,”section name”); DATA_SECTION(symbol,”section name”) INTERRUPT(func) FAST_FUNC_CALL (func) FUNC_EXT_CALLED(func)





.text段:包含所有的可执行代码以及常数; .cinit段和.pinit段:包含用于全局变量或静态变量初始化所需的表和常 数; .const段:包含字符串常数以及用const关键词限定的全局和静态变量以 及其初始化值。 .econst段:包含大内存模型下的字符串常数以及用far const限定的全局 和静态变量的申明和初始化值(存放于远内存—far memory中)。 .switch段:包含用于switch语句的表。 .bss段和.ebss段:这个段为全局变量和静态变量保留空间。 .stack段:存放C的系统堆栈,堆栈用于为函数传递参数或者为局部变量 创建存储空间。 .const段:包含字符串常数以及用const关键词限定的全局和静态变量以 及其初始化值。 .system段和.esystem段:保留空间用于动态内存分配,如调用malloc() 函数。 2 ____________

____________
5
TMS320F2812 DSP控制器原理及应用
结构体变量分配到数据段的语句和定位伪指令
结构体寄存器变量分配到数据段的语句 #pragma DATA_SECTION(cputimer0regs,“time0sect”) volatile struct cputimer_regs cputimer0regs; 链接器命令文件.cmd中关于用户命名数据段”time0sect”的定 位: MEMERY {PAGE1: „ T0:origin=0x000c00,length=0x000008//time0绝对地址 „ } SECTIONS { „ time0sect :>T0, PAGE1 „ }
____________
12
TMS320F2812 DSP控制器原理及应用
#pragma DATA_SECTION语句对应汇编效果

Using the DATA_SECTION Pragma Assembly Source File
对齐标志字,可选项,表示定位空 间最小的对齐字节数,可见”4‖ 表示以4字节为最小单位对齐, 即定位地址应定位在可以被4整 除的地址上!
struct ADCTRL1_BITS { Uint16 rsvd1:4; Uint16 SEQ_CASC:1; Uint16 SEQ_OVRD:1; Uint16 CONT_RUN:1; Uint16 CPS:1; Uint16 ACQ_PS:4; Uint16 SUSMOD:2; Uint16 RESET:1; Uint16 rsvd2:1; };
TMS320F2812 DSP控制器原理及应用
DSP控制器原理与应用
第2章外设寄存器的位域结构定义方法 第3章 3.1 F2812 CPU组成结构特点 3.2 F2812 存储器配置
TMS320F2812 DSP控制器原理及应用
DSP F2812的C语言编程
C/C++编译器默认的段和段分配

初始化段
#define SCICCRA(volatile uint16 *) 0x7050
传统宏定义语句#define的缺点: (1)结构相同的外设,因地址不同要分别使用#define定义,不够简洁! (2)不便于对外设寄存器的一位或几位进行按位操作! (3)在CCS的Watch窗口无法直观显示外设寄存器每一位的变化状态!

____________
3
TMS320F2812 DSP控制器原理及应用
F2812编译器提供的位域结构定义方法

把属于某一特定外设(比如3个结构相同的定时器)的所有寄存器 分组到一个C结构体中定义。 位域结构定义方法定义的外设寄存器有如下显著优点:
(1)可以对外设寄存器一位或几位进行按位操作! (2)在CCS的Watch窗口能直观显示外设寄存器每一位的变化状态! 例如2812的3个结构相同的定时器都有控制、计数、周期、预定标寄存 器,用结构体语句定义如下: struct cputimer_regs // struct是保留字! { uint32 TIM; //定时器计数寄存器 uint32 PRD; //定时器周期寄存器 uint16 TCR; //定时器控制寄存器 uint16 RSV; //保留 uint16 TPRL; //预定标寄存器低16位 uint16 TPRH; //预定标寄存器高16位 }; ____________
____________
16
TMS320F2812 DSP控制器原理及应用
定时器的联合体定义语句
struct cputimer_regs
{union TIM_GROUP TIM;//定时器计数寄存器 union PRD_GROUP PRD; //定时器周期寄存器 union TCR_REG TCR; //定时器控制寄存器 Uint16 rsvd1; //保留地址 union TPRL_REG TPRL;//预定标寄存器低16位 union TPRH_REG TPRH;//预定标寄存器高16位 } 至此,位域的定义语句即可按位(bit)也可按整体(all)访问! 思考题: (4)可按位域的访问方式有什么优点?(与传统的软件屏蔽其 他位相比)
.global _bufferA .bss _bufferA,512,4 .global _bufferB _bufferB: .usect "my_sect",512,4
____________
13
TMS320F2812 DSP控制器原理及应用
寄存器位域定义实例
/* ADC的控制寄存器1的位定义 */ 占用二进制位数为4位!由此类推

____________
6
TMS320F2812 DSP控制器原理及应用
结构体变量的成员访问语句

putimer0regs.PDR.all=0xFFFFFFFF;
思考题: (1)28xx提供的位域结构定义方法定义外设寄存器有什么优 点?(从书写角度考虑)
(2)位域结构定义方法使用#pragma DATA_SECTION语句为结构体寄存 器变量分配数据段有什么好处? (从统一到”链接器命令文件.cmd”中定义考虑) (3)阅读”spru514d.pdf”文档中的”6.10.6 Pragma Directives”, 学习#pragma DATA_SECTION语句的语法与功能,掌握使用方法。
相关主题