版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- AI智能调度赋能供应链管理与流程优化
- 建筑业新质生产力人工智能施工辅助
- 高等基础数学 1
- 江苏省南京市2026届高三年级第二次模拟考试(南京二模) 政治
- 新生儿肺炎的护理业务培训课件
- 旋流风口、岗位送风口、织物(布)风管安装检验批质量验收记录
- 2025年人工智能伦理评估消费者权益保护
- 广东省深圳市龙岗区宏扬学校2025-2026学年八年级下学期历史学科期中素养自测题
- 学生特异体质健康状况跟踪登记表
- 老年人大小便护理的绩效考核
- 辽宁省营口市盖州市2025-2026学年八年级(上)期末物理试卷(含答案)
- 初中英语九年级跨学科项目式导学案:数智赋能下的发明叙事与未来思辨
- 2026年广东深圳市48校中考复习阶段模拟测试物理试题(试卷+解析)
- 2026年春新教材八年级下册道德与法治第1~5共5套单元测试卷(含答案)
- 2026湖南益阳职业技术学院招聘事业单位人员6人备考题库及答案详解(新)
- 河南省信阳市固始县2025-2026学年七年级下学期期中考试历史试题(含答案)
- 2026年中国避蚊胺驱蚊剂市场数据研究及竞争策略分析报告
- 江苏省2026事业单位考试真题及答案
- 纸桥承重精美课件
- 急腹症诊断及鉴别诊断课件
- 新产品质量控制流程
评论
0/150
提交评论