嵌入式C语言编程课件_第1页
嵌入式C语言编程课件_第2页
嵌入式C语言编程课件_第3页
嵌入式C语言编程课件_第4页
嵌入式C语言编程课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论