




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 哈尔滨市中储粮2025秋招面试半结构化模拟题30问及答案
- 中国移动宝鸡市2025秋招技术岗专业追问清单及参考回答
- 国家能源烟台市2025秋招面试专业追问及参考能源与动力工程岗位
- 昌都市中储粮2025秋招面试专业追问题库财务资产岗
- 中国移动宜昌市2025秋招计算机类专业追问清单及参考回答
- 宁德市中储粮2025秋招写作案例分析万能模板直接套用
- 银川市中储粮2025秋招面试专业追问题库质检化验岗
- 中国广电济宁市2025秋招计算机类专业追问清单及参考回答
- 乌海市中石油2025秋招笔试模拟题含答案法律与合规岗
- 朔州市中石油2025秋招笔试综合知识专练题库及答案
- 2024版2025秋贵州黔教版综合实践活动五年级上册全册教案教学设计
- 转作风重实干课件
- 甲状腺课件类型
- 单招备考科学方案
- 2025年秋新人教版数学三年级上册全册教学课件
- 医美咨询培训课件
- NoSQL数据库应用与实践 课件 第1-6章 认识NoSQL - 增删改查
- DB37-T4868-2025 既有公路隧道结构健康监测技术规范
- 供应链金融视角下涉农中小企业信用风险评估研究
- 宁夏差旅费管理办法文件
- DB51∕T 3231-2024 公路隧道岩爆防控技术规程
评论
0/150
提交评论