开源PLC学习笔记11(再从51开始 内存管理)——2013_11_27
本帖最后由 oldbeginner 于 2013-11-27 15:57 编辑因为采用的是KEIL编辑器,
查看手册,
(3)LARGE模式。LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64KB字节空间,存储器类型为xdata。
变量和函数定义都是在c文件中,现在就开始理解这些变量和函数的存储类型。
在PLC51x.c文件中
bitRUN = 0;
unsigned int code TYPE_BCD={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, // LED显示器段码表
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};// 0123456789AbCdEF
/***************************************************************************************/
unsigned charTimer_5ms; // 5ms时基计数器,5ms Timer0中断计数
unsigned charTimer_10ms; // 10ms时基计数器,5ms Timer0中断计数
unsigned charTimer_100ms; // 100ms时基计数器,5ms Timer0中断计数
unsigned charPulse_val_Sec; // 1s时基计数器
unsigned charPulse_val_Min; // 1min时基计数器
bit Pulse_10ms ;
bit Pulse_100ms;
bit Pulse_Sec;
bit Pulse_Min;
<font color="Blue" size="4"><b>volatile unsigned char dataACC_BIT; //位运算器及 7级中间过渡栈</b></font>
volatile unsigned char dataMPS_BIT; //位元件 8级堆栈//-------------------------------------------------------------------------------------//
//位元件 D 内存分配 //
//-------------------------------------------------------------------------------------//
<font color="Blue"><font size="4"><b>volatile TYPE_BIT_BYTE datarX , rY; //位元件 X,Y 存储位
volatile TYPE_BIT_BYTE datarX1, rY1; //位元件 X,Y 存储位上一步备份</b></font></font>
volatile TYPE_BIT_BYTE datarM8xxx; //位元件 M8xxx 存储位
volatile TYPE_BIT_BYTE datarM8xxx1; //位元件 M8xxx 存储位上一步备份
volatile TYPE_BIT_BYTE datarTF; //T 得电失电标志位
volatile TYPE_BIT_BYTE datarCF; //C 得电失电标志位
volatile TYPE_BIT_BYTE datarT , rC; //位元件 T,C 输出位
volatile TYPE_BIT_BYTE datarT1, rC1; //位元件 T,C 输出位上一步备份
volatile TYPE_BIT_BYTExdatarM; //位元件 M 存储位
volatile TYPE_BIT_BYTExdatarS; //位元件 S 存储位
volatile TYPE_BIT_BYTExdatarM1; //位元件 M 存储位上一步备份
volatile TYPE_BIT_BYTExdatarS1; //位元件 S 存储位上一步备份
volatile signed int xdata_T; //位元件 T 内存分配
volatile signed int xdata_C; //位元件 C 内存分配
volatile signed int xdata_D; //位元件 D 内存分配
//-------------------------------------------------------------------------------------//
//基本指令,扩展指令 子函数 //
//-------------------------------------------------------------------------------------//
volatile unsigned charxdata addr0T,addr1T,addr2T,addr3T,addr4T;// 数据位第一至第五位字地址/数据类型
volatile TYPE_BYTES_WORD xdata addr0x,addr1x,addr2x,addr3x,addr4x; // 数据位第一至第五位字地址/数据缓冲区
volatile TYPE_BYTES_WORDxdata order0; // 命令位地址缓冲区
volatile unsigned int ppp;
volatile unsigned char code *CODE_p;
****************************************************
因为选择了large模式,默认存储在片外RAM中,如果要存储在片内RAM,需要定义前加data
volatile unsigned char dataACC_BIT; //位运算器及 7级中间过渡栈
volatile TYPE_BIT_BYTE datarX , rY; //位元件 X,Y 存储位
volatile TYPE_BIT_BYTE datarX1, rY1; //位元件 X,Y 存储位上一步备份
不加存储类型定义或加xdata都是存储在片外RAM。
还有code类型,指明在程序存储区,也是片外的。
大部分变量都加了volatile,在笔记01中简单提了一下啊,现在复习,
******************************************************
在PLC51x_FNC.c文件中
code (*key_list)();
code (*key_list_1)();
code (*key_list_2)();
code (*key_list_3)();
int RD_ADDR(unsigned int a, unsigned char c);
#define CSP_Pn_MAX 8
#define CALL_SP_MAX 2
volatile unsigned char CALL_SP_i;
volatile unsigned char code*CALL_SP;
volatile unsigned char code*CSP_Pn;
volatile bit CODE_ERROR;
volatile unsigned intdataPS_BIT; //P 指令16级暂存
volatile unsigned intdataPS1_BIT; //P 指令16级暂存备份
volatile unsigned intdataPi;
使用了很多code存储类型,因为定义了函数指针数组。
*****************************************
在uart.c文件中
volatile unsigned char UartSendBuffer; //发送缓冲
volatile unsigned char UartReceiveBuffer; //接收数据缓冲
volatile unsigned char *outlast=UartSendBuffer; //最后由中断传输出去的字节位置
volatile unsigned char *putlast=UartSendBuffer; //最后放入发送缓冲区的字节位置
volatile unsigned char UartSendBufferemptyFlag=1; //缓冲区数据发完标志 发完=1
volatile unsigned char UartSendBufferHaveDataFlag=0; //发送缓冲区非空标志 有=1
volatile unsigned char UartReceiveCounter=0; //接收计数器
volatile unsigned char UartRxTimerStartFlag=0; //接收超时计数器启动标志
volatile unsigned char UartWaitForCounter=0; //接收超时计数器
volatile unsigned char UartDataReadyFlag=0; //接收完成标志
默认都是片外存储类型。
内存管理对我来说比较抽象,而且入门资料不完备。暂时不考虑优化,只理解和模仿。
和文件管理一起看,理解更容易
支持楼主,牛
页:
[1]