DZ60问题汇总120708.pdf
/例1没有定义变量/main.cvoidmain(void)EnableInterrupts;/*enableinterrupts*/*includeyourcodehere*/for(;)_RESET_WATCHDOG();/*feedsthedog*/*loopforever*/*pleasemakesurethatyouneverleavemain*/图1程序运行时:1:当程序运行进入main()时,程序计数器指针PC=0 x1992。从程序的Project.map文件中可以找到,如下红字标示:OBJECTALLOCATIONSECTIONNameModuleAddrhSizedSizeRefSectionRLIBMODULE:main.c.oPROCEDURES:main1992B111.textVARIABLES:2:当程序进入main()时,堆栈指针SP=0 x17F。堆栈指针SP,这个16位地址指针寄存器指向自动后进先出(LIFO)堆栈上的下一个可用位置。该堆栈可以位于64Kb地址空间的任意位置,64Kb地址空间具有RAM,大小可以是可用RAM量的任意值。该堆栈用于自动保存子程序调用的返回地址,以及在中断期间供本地变量使用的返回地址和CPU寄存器。SP在复位时被强制放在0 x00FF上,以实现与早期M68HC05系列的兼容性。在复位初始化期间,HCS08程序通常将SP中的值更改为片上RAM最后位置(最高地址,即SP=0 x00FF+变量占用RAM的空间+堆栈的空间)的地址,以释放直接页面RAM(从片上寄存器末端(即RAM的最高地址)到0 x00FF)。即在复位初始化期间,SP=0 x00FF+变量占用RAM的空间+堆栈的空间。堆栈的空间在程序的Project.prm文件中设置,STACKSIZE0 x80。因为在例1中没有定义变量,堆栈空间设置为0 x80,所以在复位初始化期间SP=0 x00FF+0+0 x80=0 x17F。当程序复位后:图21:复位时,程序计数器PC被加载位于0 xFFFE和0 xFFFF的复位向量。这里保存的向量是退出复位状态后将要执行的第一个指令的地址。从程序的Project.map文件中可以找到,如下红字标示:VECTORALLOCATIONSECTIONAddressInitValueInitFunction0 xFFFE0 x197B_Startup2:SP在复位时被强制放在0 x00FF上。/例2定义变量/mian.c定义g_Min和g_Max两个变量intg_Min,g_Max;voidmain(void)EnableInterrupts;/*enableinterrupts*/*includeyourcodehere*/g_Min=10;g_Max=18;for(;)_RESET_WATCHDOG();/*feedsthedog*/*loopforever*/*pleasemakesurethatyouneverleavemain*/图3程序运行时:1:当程序运行进入main()时,程序计数器指针PC=0 x1992。解释见例1。2:当程序进入main()时,堆栈指针SP=0 x183。在复位初始化期间SP中的值改为片上RAM的最高地址。因为在程序中定义了两个int变量,占用4字节RAM空间(每个int变量占用2字节RAM空间),且堆栈空间大小设置为0 x80,所以此时SP中的值=0 x00FF+0 x4+0 x80=0 x183。main()中定义的变量,从程序的Project.map文件中可以找到,如下:当程序复位后:同例1。