1.4 存储器类语言

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一般情况下,推荐使用小模式
问题解答
SDCC命令行指定模式示例: sdcc --model-small test.c
// file: test.c …… int i; ……
片内直接寻址 RAM
片外分页寻址 RAM
外部RAM
--model-small
缺省模式时的默认存储区
--model-medium
--model-large


存储类型 存储模式 特殊功能寄存器数据类型 位数据类型 存储器绝对寻址 指针
指针声明方式
xdata unsigned char * data p; 存储类型 数据类型
(指针指向位置)
*
存储类型 变量名
(指针存放位置)
存储类型
data、pdata、xdata、code、idata
数据类型
char、unsigned char、int、float、long等
使用volatile关键字确保c编译器对外设的访问不进行优化移除定义外部存储空间的外设寄存器注意存储类型存储模式特殊功能寄存器数据类型位数据类型存储器绝对寻址指针datapdataxdatacodeidata指针声明方式存储类型指针指向位置数据类型存储类型指针存放位置变量名xdataunsignedchar存储类型存储类型存储类型charunsignedcharintfloatlong等数据类型数据类型数据类型存储类型指针指向位置数据类型存储类型指针存放位置变量名指针类型显式指针datachardata指向内部ram中的字符xdataint指向外部ram中的整型数据codelongdata定义指针指向位置显式指针的存储格式指向code和xdata的存储器指针用两个字节保存指针类型通用指针unsignedcharstr
data int i;
// 直接寻址内部SRAM低128Byte
内部数据 存储器
外部数据 存储器
程序 存储器
idata 关键字:data
xdata
pdata
code
data关键字
C程序:
data unsigned char dVar; dVar = 1;
内部SRAM 间接寻址 特殊功能寄 存器区 直接寻址 0x80 内部SRAM 直接寻址 0x01
-D1H
P D0H
位寻址方式 D6(AC) = D0(基地址) + 6(相对偏移量)


存储类型 存储模式 特殊功能寄存器数据类型 位数据类型 存储器绝对寻址 指针
位数据类型
0xFF 内部SRAM 间接寻址 特殊功能寄 存器区 0x80 内部SRAM 位寻址区 工作寄存器区 0x00 0x30 0x20 外部数据存 储器
特殊功能寄存器数据类型
0xFF 内部SRAM 间接寻址 特殊功能寄 存器区 0x80 内部SRAM 0x30 位寻址区 工作寄存器区 0x00 0x20 外部数据存 储器
0xFFFF
0xFFFF
程序存储器
0x0000
0x0000
内部数据存储器
外部数据存储器
程序存储器
特殊功能寄存器数据类型
0xFF 特殊功能寄 存器区 0x80
间接寻址的内部SRAM整个256字节空间 外部数据存储器整个64K字节空间,用MOVX @DPTR指令访问 分页寻址外部数据存储器256字节空间,用MOVX @Ri指令访问
外部程序存储器整个64K字节空间,用MOVC指令访问
思考
/******************************************************************** ** 变量定义 ********************************************************************/ int i;
// 定义指针指向位置
显式指针的存储格式 指向idata、data和pdata的存储器指针用一个字节保存 指向code和xdata的存储器指针用两个字节保存
指针类型—通用指针
数据类型
*
存储类型 变量名
(指针存放位置)
// str指向的数据类型固定,存放位置不定
unsigned char *str; char * xdata p; ……
范围 位寻址区0x20~0x2F共128位,位地址0x00~0x7F
举例
bit flag; flag = 1;
flag被分配到 位地址0x00
SETB
0x00;


存储类型 存储模式 特殊功能寄存器数据类型 位数据类型 存储器绝对寻址 指针
at(address)关键字作用一
定义普通变量的存放地址 例
1.4 存储器类语言
导读
80C51单片机的存储结构
0xFF 内部SRAM 间接寻址 特殊功能寄 存器区 直接寻址 0x80 内部SRAM 0x30 位寻址区 工作寄存器区 0x00 0x0000 0x0000 0x20 外部数据存 储器 程序存储器 0xFFFF 0xFFFF
内部数据存储器
外部数据存储器
省略存储器类型关键
字定义的i被编译后会放 在哪里?
内部数据 存储器
外部数据 存储器
程序 存储器


存储类型 存储模式 特殊功能寄存器数据类型 位数据类型 存储器绝对寻址 指针
存储器模式
三种存储模式
小模式
变量默认为data存储类型
中模式
变量默认为pdata存储类型
大模式
变量默认为xdata存储类型
区域组成 单片机内部各功能部件的控制寄存器和状态寄存器等
寄存器作用 控制定时/计数器、中断、串行口等外设的运行
特殊功能寄存器的访问方式
SDCC提供的访问特殊功能寄存器区的关键字
sfr
sfr16
sfr32
sbit
使用举例
/**************** 特殊功能寄存器P1定位在地址0x90*************/ sfr at(0x90) P1; /***** 定义16位定时器0,高字节定位在0x8C,低字节定位在0x8A***/ sfr16 at(0x8C8A) TMR0; /**************** 定义全局中断使能位,位地址0xAF*************/ sbit at(0xAF) EA;
0xFF
编译器将iVar分配到 间接寻址区域 汇编程序:
// 假设iVar分配到地址0x30 MOV R0, #0x30 MOV @R0, #1
iVFra Baidu bibliotekr
0x30 0x00
使用R0或R1间接寻址 效率稍低
内部数据存储器
xdata关键字
C程序:
xdata unsigned char xVar; xVar = 1;
外部堆栈
可重入函数 参数 片内RAM 局部变量 普通堆栈 使用--xstack声明堆栈 片外RAM
使用--stack-auto声明堆栈注意事项
所有参数和局部变量均被分配到外部分页存储空间 应用程序不必具体关心P2端口的使用


存储类型 存储模式 特殊功能寄存器数据类型 位数据类型 存储器绝对寻址 指针
程序存储器
导读
/******************************************************************** ** 变量定义 ********************************************************************/ int i;
TKStudio下存储模式的选择
选择存储模式
生成命令格式的模式定义
三种存储器模式的对比
访问速度
小模式 很快
访问方式
MOV direct, A
空间大小
128Byte (片内直接存储区) 256Byte (外部分页寻址区) 64K (外部数据存储区)
中模式
较快
MOVX @Ri, A
大模式

MOVX @DPTR, A
可位寻址的特殊功能寄存器
地址能被8整除的特殊功能寄存器可以位寻址
名称
地址 P0 80H TCON 88H P1 90H SCON 98H … … IP B8H T2CON C8H PSW D0H Acc E0H B F0H
名称
地址
CY D7H
AC D6H
F0 D5H
RS1 D4H
RS0 D3H
OV D2H
0xFFFF
编译器将xVar分配到 外部数据存储区
外部数据存 储器
汇编程序:
// 假设xVar分配到地址0x0030 MOV DPTR, #0x30 MOV A, #1 MOVX @DPTR, A
0x01
xVar
0x0030 0x0000
外部数据存储器 使用DPTR间接寻址 效率更低
pdata关键字
// 缺省指针指向位置
通用指针存储格式
byte2 数据空间信息 byte1 指针存储地址高字节 byte0 指针存储地址低字节
0x00—外部数据存储器RAM(xdata/far) 0x40—内部数据存储器RAM(idata/near) 0x60—外部数据存储器页RAM(pdata) 0x80—代码存储器ROM(code)
显示指针与通用指针的对比
描述 C源程序 idata指针 指针 idata char *ip; char val; val = * ip; MOV R0, ip MOV val, @R0 1字节 4字节 4周期 xdata指针 指针 xdata char *xp; char val; val = *xp; MOV DPL, xp+1 MOV DPH, xp MOVX A, @DPTR MOV val, A 2字节 9字节 7周期 通用指针 char *p; char val; val = *p; MOV DPL, p MOV DPH, p+1 MOV B, p+2 LCALL __gptrget 3字节 11字节+库调用 远大于13周期
0xFFFF
0xFFFF
程序存储器
0x0000
0x0000
内部数据存储器
外部数据存储器
程序存储器
位数据类型
0x2F 位寻址区 0x20
0x15 0x7F
…… ……
0x79
0x78
0x2F ……
bit不能定义指针和数组 …… 0x09 0x08 0x21
……
0x01 0x00
0x07
0x20
位寻址区
0xFF
编译器将dVar分配到 直接寻址区域 汇编程序:
// 假设dVar分配地址0x30 MOV 0x30, #1
dVar
0x30 0x00
直接寻址 访问速度最快
内部数据存储器
idata关键字
C程序:
idata unsigned char iVar; iVar = 1;
内部SRAM 间接寻址 特殊功能寄 存器区 直接寻址 0x80 内部SRAM 直接寻址 0x01
初始化以避免覆盖后 编译器不提示出错
at(address)关键字作用二
定义外部存储空间的外设寄存器

// 将8255端口A固定在外部数据存储区0x8000地址处 volatile xdata at(0x8000) unsigned char PORTA_8255;
注意
使用volatile关键字确保C编译器对外设的访问不进行优化、移除 此关键字主要用在硬件驱动程序的编写
变量i被编译后 会放在哪里?
内部数据 存储器
外部数据 存储器
程序 存储器


存储类型 存储模式 特殊功能寄存器数据类型 位数据类型 存储器绝对寻址 指针
存储类型
/******************************************************************** ** 变量定义 ********************************************************************/
// 假设变量分配到0x7FFE xdata at(0x7FFE) unsigned int chkSum;
不能覆盖其他未使用绝对寻址定 义的变量 0xFFFF
chkSum(H) 0x7FFF chkSum(L) 0x7FFE

应尽量避免为变量分配绝对地址 0x0000
其他例子
外部数据存储器
code at(0x7FF0) char Id[5] = “SDCC”; bit at(0x02) bvar;
程序存储器
汇编程序:
// 假设cVar分配到地址0x1000 MOV DPTR, #0x1000 CLR A MOVC A, @A+DPTR MOV 0x08, A 使用A+DPTR基址加变址寻址
0x01
cVar
0x1000 0x0000
程序存储器
存储类型总结
SDCC扩展存储类型 存储类型 data idata xdata pdata code 说明 直接寻址的内部SRAM低128字节空间,访问速度最快
C程序:
pdata unsigned char pVar; pVar = 1;
0xFFFF 0xFF00 外部数据存 储器
编译器将pVar分配到 片外分页寻址区 汇编程序:
256Byte
……
0x01FE
// 假设pVar分配到地址0x0030 MOV R0, #0 MOV A, #1 MOVX @R0, A
指针类型—显式指针
存储类型 数据类型
(指针指向位置)
data char data * str; xdata int * numtab; code long data * powtab; ……
*
存储类型 变量名
(指针存放位置)
// 指向内部RAM中的字符 // 指向外部RAM中的整型数据 // 指向程序空间中的长整型数据
pVar
0x00FF 0x0030 0x0000
0x01
外部数据存储器 使用R0或R1间接寻址 效率更低
code关键字
C程序:
code unsigned char cVar = 1; data unsigned char dVar; dVar = cVar;
code常用来定义常量
0xFFFF
编译器将cVar分配 到程序存储区
相关文档
最新文档