|
本帖最后由 oldbeginner 于 2013-11-27 15:57 编辑
因为采用的是KEIL编辑器,
查看手册,
(3)LARGE模式。LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64KB字节空间,存储器类型为xdata。
变量和函数定义都是在c文件中,现在就开始理解这些变量和函数的存储类型。
在PLC51x.c文件中
- bit RUN = 0;
- unsigned int code TYPE_BCD[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, // LED显示器段码表
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 0123456789AbCdEF
- /***************************************************************************************/
- unsigned char Timer_5ms; // 5ms时基计数器,5ms Timer0中断计数
- unsigned char Timer_10ms; // 10ms时基计数器,5ms Timer0中断计数
- unsigned char Timer_100ms; // 100ms时基计数器,5ms Timer0中断计数
- unsigned char Pulse_val_Sec; // 1s时基计数器
- unsigned char Pulse_val_Min; // 1min时基计数器
- bit Pulse_10ms ;
- bit Pulse_100ms;
- bit Pulse_Sec ;
- bit Pulse_Min ;
复制代码
- <font color="Blue" size="4"><b>volatile unsigned char data ACC_BIT; // 位运算器及 7级中间过渡栈</b></font>
- volatile unsigned char data MPS_BIT; // 位元件 8级堆栈
复制代码- //-------------------------------------------------------------------------------------//
- // 位元件 D 内存分配 //
- //-------------------------------------------------------------------------------------//
- <font color="Blue"><font size="4"><b>volatile TYPE_BIT_BYTE data rX[_X_BYTE] , rY[_Y_BYTE]; // 位元件 X,Y 存储位
- volatile TYPE_BIT_BYTE data rX1[_X_BYTE], rY1[_Y_BYTE]; // 位元件 X,Y 存储位上一步备份</b></font></font>
- volatile TYPE_BIT_BYTE data rM8xxx[3]; // 位元件 M8xxx 存储位
- volatile TYPE_BIT_BYTE data rM8xxx1[3]; // 位元件 M8xxx 存储位上一步备份
- volatile TYPE_BIT_BYTE data rTF[_T_BYTE]; // T 得电失电标志位
- volatile TYPE_BIT_BYTE data rCF[_C_BYTE]; // C 得电失电标志位
- volatile TYPE_BIT_BYTE data rT[_T_BYTE] , rC[_C_BYTE]; // 位元件 T,C 输出位
- volatile TYPE_BIT_BYTE data rT1[_T_BYTE], rC1[_C_BYTE]; // 位元件 T,C 输出位上一步备份
- volatile TYPE_BIT_BYTE xdata rM[_M_BYTE]; // 位元件 M 存储位
- volatile TYPE_BIT_BYTE xdata rS[_S_BYTE]; // 位元件 S 存储位
- volatile TYPE_BIT_BYTE xdata rM1[_M_BYTE]; // 位元件 M 存储位上一步备份
- volatile TYPE_BIT_BYTE xdata rS1[_S_BYTE]; // 位元件 S 存储位上一步备份
- volatile signed int xdata _T[_T_num][2]; // 位元件 T 内存分配
- volatile signed int xdata _C[_C_num]; // 位元件 C 内存分配
- volatile signed int xdata _D[_D_num]; // 位元件 D 内存分配
复制代码- //-------------------------------------------------------------------------------------//
- // 基本指令,扩展指令 子函数 //
- //-------------------------------------------------------------------------------------//
- volatile unsigned char xdata addr0T,addr1T,addr2T,addr3T,addr4T; // 数据位第一至第五位字地址/数据类型
- volatile TYPE_BYTES_WORD xdata addr0x,addr1x,addr2x,addr3x,addr4x; // 数据位第一至第五位字地址/数据缓冲区
- volatile TYPE_BYTES_WORD xdata order0; // 命令位地址缓冲区
- volatile unsigned int ppp;
- volatile unsigned char code *CODE_p;
复制代码
****************************************************
因为选择了large模式,默认存储在片外RAM中,如果要存储在片内RAM,需要定义前加data
volatile unsigned char data ACC_BIT; // 位运算器及 7级中间过渡栈
volatile TYPE_BIT_BYTE data rX[_X_BYTE] , rY[_Y_BYTE]; // 位元件 X,Y 存储位
volatile TYPE_BIT_BYTE data rX1[_X_BYTE], rY1[_Y_BYTE]; // 位元件 X,Y 存储位上一步备份
不加存储类型定义或加xdata都是存储在片外RAM。
还有code类型,指明在程序存储区,也是片外的。
大部分变量都加了volatile,在笔记01中简单提了一下啊,现在复习,
******************************************************
在PLC51x_FNC.c文件中
- code (*key_list[16])();
- code (*key_list_1[12][2])();
- code (*key_list_2[14][2])();
- code (*key_list_3[256])();
- 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[CALL_SP_MAX];
- volatile unsigned char code *CSP_Pn[CSP_Pn_MAX+1];
- volatile bit CODE_ERROR;
- volatile unsigned int data PS_BIT; // P 指令16级暂存
- volatile unsigned int data PS1_BIT; // P 指令16级暂存备份
- volatile unsigned int data Pi;
复制代码
使用了很多code存储类型,因为定义了函数指针数组。
*****************************************
在uart.c文件中
- volatile unsigned char UartSendBuffer[OutLEN]; //发送缓冲
- volatile unsigned char UartReceiveBuffer[InLEN]; //接收数据缓冲
- 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; //接收完成标志
复制代码
默认都是片外存储类型。
内存管理对我来说比较抽象,而且入门资料不完备。暂时不考虑优化,只理解和模仿。
和文件管理一起看,理解更容易
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|