占用内存小的安全软件投稿软件

【私信投稿】51单片机基础剖析(基于C语言)
—— BY 司海瑞
前言:为了同学们更好的学习单片机知识。希望大家将学习中遇到的问题和优质的学习资源,通过私信发给主页君。主页君会帮大家转发,一起进行讨论,共享学习资源,欢迎大家投稿。望我们在沟通学习中多交良师益友! &&
51单片机基础剖析(基于C语言)
"玩转单片机"公共主页好友 原创,转载请注明。&潜水在玩转单片机的人人主页已经有一段时间了。之前一直喜欢在CSDN和21IC发帖子,今天看到主页君发出征稿启事,遂投稿,并将长期投稿,将自己的单片机学习心得分享出来,以抛砖迎玉。虽然接触51单片机有些年头,也跟导师做过几个项目,但深知高手出自民间,于是从不敢将自己写的东西称为&文章&,更倾向于&帖子&、&心得&这样的说法。由于知识点不足是硬伤,望各位轻喷,不吝赐教。特此留下邮箱以交流:&&
一、51单片机内存剖析(很重要,尤其在开发实际项目中)&&& 在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方;当定义变量大小超过MCU的内存范围时怎么办;如何控制变量定义不超过存储范围;以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。以下将一一解答。1.六类存储类型 &code& data& idata& xdata&& pdata& bdata&& &code:程序存储器,也即只读存储器,用来保存常量或是程序,采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KB。&&& 作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code或明确指明定义的常量保存到code memory(只读。)比如:&&& char& code& table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};&& &此关键字的使用方法等同于const。&&& data:数据存储区,只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码,具有最快的存储速度,但是数量被限制在128byte或更少。&& &使用方法:unsigned char data fast_variable=0;&& &Idata:数据存储区,只能用于声明变量,不能用来声明函数。该区域位于片内,采用8位地址线编码,内存大小被限制在256byte或更少。该区域的低地址区与data区地址一致,高地址区域是52系列在51系列基础上扩展的并与特殊功能寄存器具有相同地址编码的区域。即:data memory是idata memory的一个子集。&&&&&&&& &&xdata:只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用16位地址线进行编码,存储大小被限制在64KB以内。如:unsigned char xdata count=0;&& &pdata:只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用8位地址线进行编码。存储大小限制在256byte,是xdata memory的低256byte。为其子集。如:unsigned char pdata count=0;&& &bdata:只能用于声明变量,不能用来声明函数。该区域位于8051内部位数据地址。定义的量保存在内部位地址空间,可用位指令直接读写。使用方法:unsigned char bdata varab=0。注:一般情况下,定义字符型变量时,在缺省unsigned的情况下,默认为无符号。但是本人在Keil uV3中遇到并非如此的案例。在缺省的情况下默认为有符号。要注意一下,或许不同的编译器规则不同。所以我们在写程序的时候,还是最好把unsigned signed加上。2.函数的参数和局部变量的存储模式&&& C51 编译器允许采用三种存储器模式:SMALL,COMPACT 和LARGE。一个函数的存储器模式确定了函数的参数的局部变量在内存中的地址空间。处于SMALL模式下的函数参数和局部变量位于8051单片机内部RAM中,处于COMPACT和LARGE模式下的函数参数和局部变量则使用单片机外部RAM。在定义一个函数时可以明确指定该函数的存储器模式。方法是在形参表列的后面加上一存储模式。&& 示例如下:&&&&& &&#pragma large &&//此预编译必须放在所有头文前面&&&&&&& int& &&func0(char& x,y)&&&&&&& char& func1(int& x)&&&&&&& int&& &func2(char x);&&& 注:上面例子在第一行用了一个预编译命令#pragma,它的意思是告诉c51编译器在对程序进行编译时,按该预编译命令后面给出的编译控制指令LARGE进行编译,即本例程序编译时的默认存储模式为LARGE。随后定义了三个函数,第一个定义为SMALL存储模式,第二个函数定义为LARGE第三个函数未指定,在用C51进行编译时,只有最后一个函数按LARGE存储器模式处理,其它则分别按它们各自指定的存储器模式处理。本例说明,C51编译器允许采用所谓的存储器混合模式,即允许在一个程序中将一些函数使用一种存储模式,而其它一些则按另一种存储器模式,采用存储器混合模式编程,可以充分利用8051系列单片机中有限的存储器空间,同时还可以加快程序的执行速度。3.绝对地址访问(头文件为:absacc.h(相当重要))&&& #define CBYTE ((unsigned char volatile code& *) 0)&&& #define DBYTE ((unsigned char volatile data &&*) 0)&&& #define PBYTE ((unsigned char volatile pdata& *) 0)#define XBYTE ((unsigned char volatile xdata &*) 0)功能:CBYTE寻址CODE区&&&&&&& &&DBYTE寻址DATA区&&&&&&& &&PBYTE寻址XDATA(低256)区&&&&&&& &&XBYTE寻址XDATA区&& 例:如下指令在对外部存储器区域访问地址0x1000&&&&& &xvar=XBYTE[0x1000];&&&&&& XBYTE[0x1000]=20;&&&& #define CWORD ((unsigned int volatile code& *) 0)&&& #define DWORD ((unsigned int volatile data& &*) 0)&&& #define PWORD ((unsigned int volatile pdata &*) 0)&&& #define XWORD ((unsigned int volatile xdata &*) 0)&& &功能:与前面的一个宏相似,只是它们指定的数据类型为unsigned int。通过灵活运用不同的数据类型,所有的8051地址空间都是可以进行访问。例如:DWORD[0xF8;// 即内部数据存储器中(0x08)=0x12; (0x09)=0xF8&&& 注:用以上八个函数,可以完成对单片机内部任意ROM和RAM进行访问,非常方便。还有一种方法,那就是用指钟,后面会对C51的指针有详细的介绍。4.寄存器变量(register)为了提高程序的执行效率,C语言允许将一些频率最高的那些变量,定义为能够直接使用硬件寄存器的所谓的寄存器变量。定义一个变量时,在变量类型名前冠以&register& 即将该变量定义成为了寄存器变量。寄存器变量可以认为是一自动变量的一种。有效作用范围也自动变量相同。由于计算机寄存器中寄存器是有限的。不能将所有变量都定义成为寄存器变量,通常在程序中定义寄存器变量时,只是给编译器一个建议,该变量是否真正成为寄存器变量,要由编译器根据实际情况来确定。另一方面,C51编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。被定义的变量是否真正能成为寄存器变量,最终是由编译器决定的。5.内存访问的实现& &&(1)指钟&&& 指钟本身是一个变量,其中存放的内容是变量的地址,也即特定的数据。8051的地址是16位的,所以指针变量本身占用两个存储单元。指针的说明与变量的说明类似,仅在指针名前加上&*&即可。& 如:&& int& &*int_&&&& //声明一个整型指针&&&&&& char& *char_&& //声明一个字符型指针& 利用指针可以间接存取变量。实现这一点要用到两个特殊运算符&&&&&&&&& && 取变量地址&&&&&&&&& *&& 取指针指向单元的数据示例一:&&&&&& int&& a=15,b;&&&&&& int& *int_&&&& //定义一个指向整型变量的指针&&&&&& int_point=&a;&&&&&& //int_point指向 a&&&&&& *int_point=5;&&&&&&& //给int_point指向的变量a 赋值5 等同于a=5;示例二:&&&&&& char& i,table[6],*char_&&&&&& char_point=&&&&&& for(i=0;i&6;i++)&&&&& &{&&&&&&&&&& char_point=i;&&&&&&&&&& char_point++;&&&&&& }&&& 注:指针可以进行运算,它可以与整数进行加减运算(移动指针)。但要注意,移动指针后,其地址的增减量是随指针类型而异的,如,浮点指针进行自增后,其内部将在原有的基础上加4,而字符指针当进生自增的时候,其内容将加1。原因是浮点数,占4个内存单元,而字符占一个字节。&&& 宏晶科技最新一代STC12C5A360S2系列,每一个单片机出厂时都有全球唯一身份证号码(ID号),用户可以在单片机上电后读取内部RAM单元F1H~F7H的数值,来获取此单片机的唯一身份证号码。使用MOV& @Ri指令来读取。下面介绍C51获取方法:&&&&&&& char& id[7]={0};&&&&&&& char&&&&&&&& char idata& *&&&&&&& for(i=0;i&7;i++)&&&&&&& {&&&&&&&& &&&&&id[i]=*&&&&&&&&&&&&& point++;&&&&&&& }(此处只是对指针做一个小的介绍,达到访问内部任何空间的方式,后述有对指针使用的详细介绍)&&& (2)对SFR,RAM ,ROM的直接存取&&& C51提供了一组可以直接对其操作的扩展函数&&& 若源程序中,用#include包含头文件,io51.h 后,就可以在扩展函数中使用特殊功能寄存器的地址名,以增强程序的可读性:& &&注 此方法对SFR,RAM,ROM的直接存取不建议使用.因为,淡io51.h这个头文件在KEIL中无法打开,可用指针,或是采用absacc.h头文件,&&& (3) PWM与PCA&&& STC12系列有两路PWM/PCA&&& PWM:(Pulse Width Modulation)脉宽调制,是一种使用程序来控制波形占空比,周期,相位波形的技术。&&&& PCA:(Programmable Counter Array)可编程计数阵列,它比通常的定时/计数器的定时能力强,需要CPU的干预少。其优势一是软件简单,二是精度大有提高。&*6.动态内存分配的实现&&& 在单片机的实际开发中,很多情况下我么需要开辟一块内存,但是具体开辟多大,也就是内存的字节数我们还无法确定,比如可能要等到上位机的指令发送下来才能确定,这个时候我们就得动态分配内存。注意,单片机内部存储资源是极其有限的,不允许开发人员开辟出一块很大的存储区来备用。在VC 6.0环境下很容易用malloc()来得到一块RAM,但是由于单片机内部没有操作系统(如何在51上跑uC/OS-II我以后会写出来),所以在51上实现动态内存分配就是个难点也是一个重点问题。下面给出代码,详细分析大家可以参考求是科技编的《8051系列单片机C程序设计完全手册》这本书。#include &REG52.H&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#include &stdlib.h&&&& //init_mempool()、malloc()、free()函数所在的头文件&&&void main (void){&&&&&& char *ptr1;&&&&&& init_mempool (0x); //内存池初始化,0x1000为起始地址,0x500为内存大小&&&&&& ptr1=malloc(30);& /*动态为指针变量分配长度为30字节的存储空间*/&&& &&&&&&&& //此处为你的代码&&& &&&&&&&& free(ptr1) ;& //注意,动态内存用完之后务必要释放,否则程序将会出错&&& while (1);}&
二、变量类型及其作用域剖析变量可分为&& 1.局部变量;2.全局变量(按变量的有效作用范围划分)&&& 1.局部变量&&& 是指函数内部(包括main函数)定义的变量,仅在定义它的那个函数范围内有效,不同函数可使用相同的局部变量名,函数的形式参数也属于局部变量,在一个函数的内部复合语句中也可以定义局部变量,该局部变量只在该复合语合中有效。&&& 2.全局变量&&& 是指函数外部定义的变量,以称外部变量。可为多个函数共同使用,其有效作用范围是从它定义开始到整个程序文件结束。如果全局变量,定义在一个程序文件的开始处,则在整个程序文件范围都可以使用它,如果一个全局变量不是在程序文件的开始处定义,但又希望在它定义之前的函数中引用该变量,这时应在引用该变量的函数中用关键字extern将其声明为&外部变量&。另个,如果在一个程序模块文件中引用另一个程序模块文件中定义的变量时,也必须用extern进行说明。&&& 外部变量的说明与外部变量的定义是不同的,外部变量定义只能有一次,定义的位置在所有函数之外,而同一个程序文件中(不是指模块文件)的外部变量声明可以有多次,声明的置在需要引用该变量的函数之内,外部变量的声明的作用只是声明该变量是一个已经在外部定义过了的变量而已。&&& 如在同一个程序文件中,全局变量与局部变量同名,则在局部变量的有效作用范围之内,全局变量不起作用,也就是说,局部变量的优先级比全局变量高。&&& 在编写C语言程序时,不是特别必要的地方一般不要使用全局变量,而应当尽可能的使用局部变量。因为局部变量只在使用它的时候,才为其分配内存单元,而全局变量在整个程序的执行过程中都要占用内存单元,且当全局变量使用过多时,会降低程序的可读性。&&& 变量的存储种类&& (1).自动变量(auto)&& 定义变量时,在变量类型名前加上& &auto& ,自动变量是C语言中使用最为广泛的一类变量,在函数体内部或是复合语句内部定义的变量,如果省略了存储种类说明,则该变量默认为自动变量。&& 例如:&&&&&&&& {&&&&&&&&&&&&&& 等价于&&& &&{&&&&&&&&&&& char&&&&&&&&&&&&&&&&&&&&&& auto&&&&&&&&&&&& int&&&&&&&&&&&&&&&&&&&&&& &&auto& int&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& 注:自动变量的作用范围在定义它的函数体或是复合语句内部,只有在定义它的函数内被调用,或是定义它的复合语句被执行时,编译器才会为其分配内存空间,开始其生存期。当函数调用结束返回,或复合语句执行结束,自动变量所占用的内存空间就被释放,变量的值当然也就不复存在,其生存期结束。当函数再次调用,或是复合语句被再次执行时,编译器又会为其内部的自动变量重新分配内存空间。但不会保留上一次运行的值。而必须被重新分配。因此自动变量始终是相对于函数或复合语句的局部变量。&&& (2).外部变量(extern)&&& 用说明符&extern&定义的变量称为外部变量。按缺省规则,凡是在所有函数之前,在函数外部定义的变量都是外部变量,定义时可以不写extern说明符,但是一个函数体内说明一个已在该函数体外或别的程序模块文件中定义过的外部变量时,刚必须要使用extern说明符。外部变量定义后,它就被分配了固定的内存空间。外部变量的生存期为程序的整个执行时间。 外部变量的存储不会随函数或复合语句执行完毕而释放,因此外部变量属于全局变量。&&& C语言允许将大型程序分解为若干个独立的程序模块文件,各个模块可分别进行编译,然后再将它们连接在一起,如果某个变量需要在所有程序模块文件中使用,只要在一个程序模块文件中将该变量定义成全局变量,而在其它程序模块文件中用extern声明该变量是已被定义过的外部变量就可以了。&&& 函数是可以相互调用的,定义函数时,如果冠以关键字extern 即将其明确定义为一个外部函数。例如& extern& int& func2(char a,b) 。如果在定义函数时省略关键字extern,则隐含为外部函数。如果在调用一个在本程序模块文件以外的其它模块文件所定义的函数,则必须要用关键字extern说明被调用的函数是一个外部函数。对于具有外部函数相互调用的多模块程序,可用C51编译器分别对各个模块文件进行编译,最后再用L51连接定位器将它们连接成为一个完整的程序。如下为一个多模块程序:&程序模块1,文件名为file1.c#include&stdio.h&int x=5;void main()&{&& extern void fun1(& );&& extern viod fun2(int& y);&& fun1( );&& fun1( );&& fun1( );&& printf( &\n%d& %d\n&,x,fun2(x));}&程序模块2,文件名为file2.c#include&stdio.h&extern&void fun1( ){& &&static& int& a=5;&&& //静态变量只在第一次调用函数时赋值,退出函数时&&&&&&&&&&&&&&&&&&&&&& //会保留上次的值,下次调用不再重新赋值。&&& int b=5;&&& printf(&%d& %d& %d& |&,a,b,x);&&& a-=2;&&& b-=2&&& x-=2;&&& printf(&%d& %d& %d& |&,a,b,x);}int fun2(int y){& return(35*x*y);}程序执行如果如下:&&&&&& 5&&& 5&&& 5& |&& 3&&& 3&&& 3&&&&&& 3&&& 5&&& 3& |&& 1&&& 3&&& 1&&&&&& 1&&& 5&&& 1& |&& -1&&& 3&&& 1&&&&&& -1&&& 35&&& 注:C语言不允许在一个函数内嵌套定义另一个函数。为了能够访问不同文件中各个函数的变量,除了可以采用参数传递的方法外,还可以采用外部变量的方法,上面的例子就说了这一点。不过,尽管使用外部变量在不同函数之间传递数据有时比使用函数参数传递更为方便,不过当外部变量过多时,会增加程序的调试排错的困难。使得程序不便于维护。别外不通过参数传递直接在函数中改变全局变量的值...
人人移动客户端下载常用软件推荐
原创软件推荐
内存释放工具是电脑内存释放优化大师的升级版,修复了一个自动释放内存时候的BUG。内存释放工具是一款免费绿色的电脑优化的软件,很多老爷机电脑的网友都经常抱怨电脑玩一段时间后会变的很卡,卡的原因基本就是内存占用率过高,电脑内存释放优化大师可以释放电脑内存里的垃圾达到优化内存的作用,使老爷机重回年轻。内存释放工具软件支持定时释放内存,非常方便,并且内存释放工具软件不会和其它软件一样在安装的时候会向电脑里添加很多启动项,占用更多的电脑资源、内存释放工具这款软件、完全免费绿色、不需安装直接使用,占用内存非常少。内存释放工具 v2.0更新:解决了软件的一些BUG。&释放了皮肤,现在几乎布展内存。优化了内核
电脑运行久了,可用的内存便会越来越少,其中很大的一方面原因就是一些软件在退出的时候没有及时释放掉占用内存的一部分。内存清理软件则可以帮您最大化的释放电脑可用内存。
v7.5.9.2016
SuperRam(内存优化工具)能够让你方便的管理和修改...
Chris-PC RAM Booster是一款专业的windows系统内...
超级内存清理具有内存扫把的整理方法外还具有更为...
Web Browse Optimizer,这是一款专门用于浏览器内...
适合机型:三星N910P,三星N910P刷机包
Android版本:6.0.1
ROM大小:1220.00 MB
本站提供的软件会测试再上传,但无法保证所有软件都没有问题,如果您发现链接错误或其它问题,请在评论里告诉我们!
下载点支持点击下载(IE图标)或(迅雷图标),若直接点击下载速度太慢,请尝试点击其他的下载点,若文件太大请尝试使用迅雷下载。为确保下载的文件能正常使用,请使用最新版本解压本站软件。
建议大家谨慎对待所下载的文件,大家在安装的时候务必留意每一步!关于或的有关提示,请自行注意选择操作。
本站所有资源均是软件作者、开发商投稿、网上搜集,任何涉及商业盈利目的均不得使用,否则产生的一切后果将由您自己承担!将不对任何资源负法律责任。所有资源请在下载后24小时内删除。
网友评论评论内容摘要(共 0 条,) 得分 5 分msn - 主流聊天软件使用技巧大全 - 网易学院·教程
MSN message []
最新版本:8.5 Beta
软件大小:17M
收费服务:VIP会员
占用内存:中高
推荐msn使用技巧
胡晓、陈慧玲
网易科技推荐
网易公司版权所有}

我要回帖

更多关于 杀毒软件占用内存小 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信