版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NanGuanEmbeddedSystemLabSchoolofInformationScienceandEngineeringNortheasternUniversityNanGuan1Memory2005-10-7Memory2005-10-72Declaration以下涉及内容未必对所有的嵌入式系统都适用。只针对共性问题进行探讨所举例子仅为示意Declaration以下涉及内容未必对所有的嵌入式系统都适3MemoryVolatile关键字Thevolatilekeywordisatypequalifierusedtodeclarethatanobjectcanbemodifiedintheprogrambysomethingotherthanstatements,suchastheoperatingsystem,thehardware,oraconcurrentlyexecutingthread.定义存储器映射寄存器时,必须使用volatile关键字。#defineSCI_01*(volatileunsignedint*)0x5808MemoryVolatile关键字Thevolatile4MemoryObjectsdeclaredasvolatilearenotusedinoptimizationsbecausetheirvaluecanchangeatanytime.Thesystemalwaysreadsthecurrentvalueofavolatileobjectatthepointitisrequested,evenifthepreviousinstructionaskedforavaluefromthesameobject.Also,thevalueoftheobjectiswrittenimmediatelyonassignment.While(SCI_01==0);tempVarInt=RXBUF;MemoryObjectsdeclaredasvola5MemoryO
main(void)
{
while
(1)
{
if
(i)
dosomething();
}
}
/*
Interrupt
service
routine.
*/
interruptvoid
ISR_2(void)
{i=1;}MemoryOneuseofthevolatile6Memory栈和堆C语言中的存储区域:1.全局变量区:程序开始分配,程序结束释放2.常量区:程序开始分配,程序结束释放3.堆:程序员分配释放4.栈:编译器自动分配释放Memory栈和堆7Memoryinta=0;//全局初始化区
char*p1;//全局未初始化区
main()
{
intb;//栈
chars[]="abc";//栈
char*p2;//栈
char*p3="123456";//123456\0在常量区,p3在栈上。
staticintc=0;//全局(静态)初始化区
p1=(char*)malloc(10);
p2=(char*)malloc(20);
//分配得来得10和20字节的区域在堆区。
strcpy(p1,"123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}Memoryinta=0;//全局初始化区
cha8Memory栈是系统提供的数据结构,是C程序运行的基础任何系统都提供栈指针寄存器通过栈实现程序跳转等基本程序操作一个未经任何初始化的程序main(){… subFunc(i);}执行时会出现问题???Memory栈是系统提供的数据结构,是C程序运行的基础9Memory硬件堆栈与软件堆栈硬件堆栈当CPU进入子程序或进入中断服务程序时,返回地址被自动压入硬件堆栈软件堆栈函数的参数是通过软件堆栈传递的,函数的出口地址存放在软件堆栈里,函数用到的局部变量也是在软件堆栈里分配的.都是必须的Memory硬件堆栈与软件堆栈都是必须的10MemoryPOP&PUSHPUSH把累加器的内容复制到堆栈顶部POP指令把堆栈顶部的数值复制到累加器POPD&PSHDPSHD把数据存储器的值压入软件堆栈顶部POPD指令把数值从软件堆栈顶部弹出至数据存储器软件压栈与弹栈SP++SP—MemoryPOP&PUSH11Memoryvoidmain(void){unsignedinti;Test(2,10);}intTest(inti,intj){inttemp;temp=0;……returntemp;}AADD#-3,SPMOVT1,*SP(#01h)MOVT0,*SP(#00h)MOV#0,*SP(#02h)……MOVAR1,*SP(#02h)MOVAR1,T0AADD#3,SPRETMOV#10,T1MOV#2,T0CALLTestAADD#-4,SPPOPD*SP(#00h)MOVT1,*SP(#02h)MOVT0,*SP(#01h)MOV#0,*SP(#03h)……MOVAR1,*SP(#03h)MOVAR1,T0PSHD*SP(#00h)AADD#3,SPRETMOV#10,T1MOV#2,T0CALLTestMemoryvoidmain(void)AADD#-3,12Memoryvoidmain(void){unsignedinti;……}interruptvoidTest(){inttemp;temp=0; ……return;}AADD#-1,SPMOV#0,*SP(#00h)……AADD#1,SPRET……Memoryvoidmain(void)AADD#-1,13Memory堆是由C函数库提供的数据结构 由malloc()、realloc()
产生 使用后要free()掉堆的数据结构是怎样的??Memory堆是由C函数库提供的数据结构堆的数据结构是怎样的14Memory#defineNULL0
#defineMEMSIZE(1024*8)
typedefdoubleAlign;
typedefunionheader{
struct{
unionheader*next;
unsignedusedsize;
unsignedfreesize;
}s;
Aligna;
}Header;
staticHeadermem={{mem,1,MEMSIZE–1}};
staticHeader*memptr=mem;
void
free(void*ap)
{
Header*bp,*p,*prev;
bp=(Header*)ap-1;
for(prev=memptr,p=memptr->s.next;
(p!=bp)&&(p!=memptr);prev=p,p=p->s.next);
if(p==bp){
prev->s.freesize+=p->s.usedsize+p->s.freesize;
prev->s.next=p->s.next;
memptr=prev;
}
}void*
malloc(unsignednbytes)
{
Header*p,*newp;
unsignednunits;
nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1;
for(p=memptr;
(p->s.next!=memptr)&&(p->s.freesize<nunits);
p=p->s.next);
if(p->s.freesize<nunits)returnNULL;
newp=p+p->s.usedsize;
newp->s.usedsize=nunits;
newp->s.freesize=p->s.freesize-nunits;
newp->s.next=p->s.next;
p->s.freesize=0;
p->s.next=newp;
memptr=newp;
return(void*)(newp+1);
}
Memory#defineNULL0
void
fre15Memory高效地使用堆Example:如何动态定义二维数组?Memory高效地使用堆16Memorymain()
{
inttemp;intn,m;
int**a;
… a=(int**)malloc(sizeof(int)*n*m);a[i][j]=temp;…
return(1);
}Memorymain()
{
inttemp;17Memorymain()
{
inttemp;inti,n,m;
int**a;…
a=(int**)malloc(sizeof(int*),n);
for(i=0;i<n;i++)
a[i]=(int*)malloc(sizeof(int),m);
a[i][j]=temp;…
return(1);
}Memorymain()
{
inttemp;18嵌入式C语言编程课件19嵌入式C语言编程课件20嵌入式C语言编程课件21Memoryadd3add2add1mainsub1sub2sub3add1add2add3BackMemoryadd3add2add1mainsub1sub222Memoryadd3mainsub1sub2sub3add1add2add3add1add2add3BackMemoryadd3mainsub1sub2sub3add123嵌入式C语言编程课件24嵌入式C语言编程课件25嵌入式C语言编程课件26NanGuanEmbeddedSystemLabSchoolofInformationScienceandEngineeringNortheasternUniversityNanGuan27Memory2005-10-7Memory2005-10-728Declaration以下涉及内容未必对所有的嵌入式系统都适用。只针对共性问题进行探讨所举例子仅为示意Declaration以下涉及内容未必对所有的嵌入式系统都适29MemoryVolatile关键字Thevolatilekeywordisatypequalifierusedtodeclarethatanobjectcanbemodifiedintheprogrambysomethingotherthanstatements,suchastheoperatingsystem,thehardware,oraconcurrentlyexecutingthread.定义存储器映射寄存器时,必须使用volatile关键字。#defineSCI_01*(volatileunsignedint*)0x5808MemoryVolatile关键字Thevolatile30MemoryObjectsdeclaredasvolatilearenotusedinoptimizationsbecausetheirvaluecanchangeatanytime.Thesystemalwaysreadsthecurrentvalueofavolatileobjectatthepointitisrequested,evenifthepreviousinstructionaskedforavaluefromthesameobject.Also,thevalueoftheobjectiswrittenimmediatelyonassignment.While(SCI_01==0);tempVarInt=RXBUF;MemoryObjectsdeclaredasvola31MemoryO
main(void)
{
while
(1)
{
if
(i)
dosomething();
}
}
/*
Interrupt
service
routine.
*/
interruptvoid
ISR_2(void)
{i=1;}MemoryOneuseofthevolatile32Memory栈和堆C语言中的存储区域:1.全局变量区:程序开始分配,程序结束释放2.常量区:程序开始分配,程序结束释放3.堆:程序员分配释放4.栈:编译器自动分配释放Memory栈和堆33Memoryinta=0;//全局初始化区
char*p1;//全局未初始化区
main()
{
intb;//栈
chars[]="abc";//栈
char*p2;//栈
char*p3="123456";//123456\0在常量区,p3在栈上。
staticintc=0;//全局(静态)初始化区
p1=(char*)malloc(10);
p2=(char*)malloc(20);
//分配得来得10和20字节的区域在堆区。
strcpy(p1,"123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}Memoryinta=0;//全局初始化区
cha34Memory栈是系统提供的数据结构,是C程序运行的基础任何系统都提供栈指针寄存器通过栈实现程序跳转等基本程序操作一个未经任何初始化的程序main(){… subFunc(i);}执行时会出现问题???Memory栈是系统提供的数据结构,是C程序运行的基础35Memory硬件堆栈与软件堆栈硬件堆栈当CPU进入子程序或进入中断服务程序时,返回地址被自动压入硬件堆栈软件堆栈函数的参数是通过软件堆栈传递的,函数的出口地址存放在软件堆栈里,函数用到的局部变量也是在软件堆栈里分配的.都是必须的Memory硬件堆栈与软件堆栈都是必须的36MemoryPOP&PUSHPUSH把累加器的内容复制到堆栈顶部POP指令把堆栈顶部的数值复制到累加器POPD&PSHDPSHD把数据存储器的值压入软件堆栈顶部POPD指令把数值从软件堆栈顶部弹出至数据存储器软件压栈与弹栈SP++SP—MemoryPOP&PUSH37Memoryvoidmain(void){unsignedinti;Test(2,10);}intTest(inti,intj){inttemp;temp=0;……returntemp;}AADD#-3,SPMOVT1,*SP(#01h)MOVT0,*SP(#00h)MOV#0,*SP(#02h)……MOVAR1,*SP(#02h)MOVAR1,T0AADD#3,SPRETMOV#10,T1MOV#2,T0CALLTestAADD#-4,SPPOPD*SP(#00h)MOVT1,*SP(#02h)MOVT0,*SP(#01h)MOV#0,*SP(#03h)……MOVAR1,*SP(#03h)MOVAR1,T0PSHD*SP(#00h)AADD#3,SPRETMOV#10,T1MOV#2,T0CALLTestMemoryvoidmain(void)AADD#-3,38Memoryvoidmain(void){unsignedinti;……}interruptvoidTest(){inttemp;temp=0; ……return;}AADD#-1,SPMOV#0,*SP(#00h)……AADD#1,SPRET……Memoryvoidmain(void)AADD#-1,39Memory堆是由C函数库提供的数据结构 由malloc()、realloc()
产生 使用后要free()掉堆的数据结构是怎样的??Memory堆是由C函数库提供的数据结构堆的数据结构是怎样的40Memory#defineNULL0
#defineMEMSIZE(1024*8)
typedefdoubleAlign;
typedefunionheader{
struct{
unionheader*next;
unsignedusedsize;
unsignedfreesize;
}s;
Aligna;
}Header;
staticHeadermem={{mem,1,MEMSIZE–1}};
staticHeader*memptr=mem;
void
free(void*ap)
{
Header*bp,*p,*prev;
bp=(Header*)ap-1;
for(prev=memptr,p=memptr->s.next;
(p!=bp)&&(p!=memptr);prev=p,p=p->s.next);
if(p==bp){
prev->s.freesize+=p->s.usedsize+p->s.freesize;
prev->s.next=p->s.next;
memptr=prev;
}
}void*
malloc(unsignednbytes)
{
Header*p,*newp;
unsignednunits;
nunits=(nbytes+sizeof(Header)-1)/sizeof(Header)+1;
for(p=memptr;
(p->s.next!=memptr)&&(p->s.freesize<nunits);
p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度保安服务企业应急预案编制合同2篇
- 2025-2030全球带间级联激光器(ICL)行业调研及趋势分析报告
- 2025年全球及中国信息技术运维服务行业头部企业市场占有率及排名调研报告
- 2025年全球及中国网络变压器类线圈绕线设备行业头部企业市场占有率及排名调研报告
- 二零二五年环保材料耗材生产与环保技术合作合同3篇
- 2025-2030全球室内智能花盆行业调研及趋势分析报告
- 2025-2030全球矿渣立式辊磨机行业调研及趋势分析报告
- 二零二五版二手装载机买卖及后续保养维护服务协议3篇
- 2025年度股权激励协议样本3篇
- 专业挖掘机操作员与设备租赁协议2024年版版B版
- 泌尿科主任述职报告
- 新零售门店运营管理流程手册
- 心理学专业知识考试参考题库500题(含答案)(一)
- 2024年浙江高考技术试题(含答案)
- 资管行业投研一体化建设
- 提高保险公司客户投诉处理能力的整改措施
- 物业费收取协议书模板
- 电工(中级工)理论知识练习题(附参考答案)
- 工业设计概论试题
- 起重机的维护保养要求与月度、年度检查记录表
- 消防设施维护保养记录表
评论
0/150
提交评论