oldbeginner 发表于 2013-11-27 08:24:59

开源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;                //接收完成标志


默认都是片外存储类型。

内存管理对我来说比较抽象,而且入门资料不完备。暂时不考虑优化,只理解和模仿。


和文件管理一起看,理解更容易

yx20016 发表于 2015-6-23 11:32:39

支持楼主,牛
页: [1]
查看完整版本: 开源PLC学习笔记11(再从51开始 内存管理)——2013_11_27