资源描述:
《嵌入式C语言编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、NanGuanEmbeddedSystemLabSchoolofInformationScienceandEngineeringNortheasternUniversityMemory2005-10-7Declaration以下涉及内容未必对所有的嵌入式系统都适用。只针对共性问题进行探讨所举例子仅为示意MemoryVolatile关键字Thevolatilekeywordisatypequalifierusedtodeclarethatanobjectcanbemodifiedintheprogrambysomethingotherthans
2、tatements,suchastheoperatingsystem,thehardware,oraconcurrentlyexecutingthread.定义存储器映射寄存器时,必须使用volatile关键字。#defineSCI_01*(volatileunsignedint*)0x5808MemoryObjectsdeclaredasvolatilearenotusedinoptimizationsbecausetheirvaluecanchangeatanytime.Thesystemalwaysreadsthecurrentvalu
3、eofavolatileobjectatthepointitisrequested,evenifthepreviousinstructionaskedforavaluefromthesameobject.Also,thevalueoftheobjectiswrittenimmediatelyonassignment.While(SCI_01==0);tempVarInt=RXBUF;MemoryOneuseofthevolatilequalifieristoprovideaccesstomemorylocationsusedbyasynchr
4、onousprocessessuchasinterrupthandlers.intmain(void){while (1){if (i)dosomething();}}/* Interrupt service routine. */interruptvoid ISR_2(void){i=1;}Memory栈和堆C语言中的存储区域:1.全局变量区:程序开始分配,程序结束释放2.常量区:程序开始分配,程序结束释放3.堆:程序员分配释放4.栈:编译器自动分配释放Memoryinta=0;//全局初始化区char*p1;//全局未初
5、始化区main(){intb;//栈chars[]="abc";//栈char*p2;//栈char*p3="123456";//123456 在常量区,p3在栈上。staticintc=0;//全局(静态)初始化区p1=(char*)malloc(10);p2=(char*)malloc(20);//分配得来得10和20字节的区域在堆区。strcpy(p1,"123456");//123456 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。}Memory栈是系统提供的数据结构,是C程序运行的基础任何系统
6、都提供栈指针寄存器通过栈实现程序跳转等基本程序操作一个未经任何初始化的程序main(){…subFunc(i);}执行时会出现问题???Memory硬件堆栈与软件堆栈硬件堆栈当CPU进入子程序或进入中断服务程序时,返回地址被自动压入硬件堆栈软件堆栈函数的参数是通过软件堆栈传递的,函数的出口地址存放在软件堆栈里,函数用到的局部变量也是在软件堆栈里分配的.都是必须的MemoryPOP&PUSHPUSH把累加器的内容复制到堆栈顶部POP指令把堆栈顶部的数值复制到累加器POPD&PSHDPSHD把数据存储器的值压入软件堆栈顶部POPD指令把数值从软件
7、堆栈顶部弹出至数据存储器软件压栈与弹栈SP++SP—Memoryvoidmain(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(#0
8、2h)MOVT0,*SP(#01h)MOV#0,*SP(#03h)……MOVAR1,*SP(#03h)MOVAR1,T0PSHD*SP(#00h)AADD#3,SP