IAR是5.30版本,从官网上下的基于UCOSII2.84版本的移植范例(LPC2378),用J-LINK V6调试,为了节省空间,优化选项选择最高程度的代码量优化(之前选不优化,结果也是跑飞),结果发现在这里会跑飞(在flash中调,开发板SmartARM2300)<br />static void Tmr_TickInit (void)<br />{<br /> CPU_INT32U pclk_freq;<br /> CPU_INT32U rld_cnts;<br /><br /> /* VIC timer #0 Initialization */<br /> VICIntSelect &= ~(1 << VIC_TIMER0); /* Configure the timer interrupt as an IRQ source */<br /> VICVectAddr4 = (CPU_INT32U)Tmr_TickISR_Handler; /* Set the vector address */<br /> VICIntEnable = (1 << VIC_TIMER0); /* Enable the timer interrupt source */<br /><br /> pclk_freq = BSP_CPU_PclkFreq(PCLK_TIMER0); /* Get the peripheral clock frequency */<br /><br /> rld_cnts = pclk_freq / OS_TICKS_PER_SEC; /* Calculate the # of counts necessary for the OS ticker */<br /><br /> T0TCR = (1 << 1); /* Disable and reset counter 0 and the prescale counter 0 */<br /> T0TCR = 0; /* Clear the reset bit */<br /> T0PC = 0; /* Prescaler is set to no division */<br /><br /> T0MR0 = rld_cnts;<br /> T0MCR = 3; /* Interrupt on MR0 (reset TC), stop TC */<br /><br /> T0CCR = 0; /* Capture is disabled. */<br /> T0EMR = 0; /* No external match output. */<br /> T0TCR = 1; /* Enable timer 0 */<br />}<br /><br />就是在上面这个函数的pclk_freq = BSP_CPU_PclkFreq(PCLK_TIMER0);这一行,并且按F11跟进去,发现这个函数:<br />CPU_INT32U BSP_CPU_ClkFreq (void)<br />{<br /> CPU_INT32U msel;<br /> CPU_INT32U nsel=0x10000000;<br /> CPU_INT32U fin;<br /> CPU_INT32U pll_clk_feq; /* When the PLL is enabled, this is Fcco */<br /> CPU_INT32U clk_div;<br /> CPU_INT32U clk_freq;<br /><br /><br /> switch (CLKSRCSEL & 0x03) { /* Determine the current clock source */<br /> case 0:<br /> fin = IRC_OSC_FRQ;<br /> break;<br /><br /> case 1:<br /> fin = MAIN_OSC_FRQ;<br /> break;<br /><br /> case 2:<br /> fin = RTC_OSC_FRQ;<br /> break;<br /><br /> default:<br /> fin = IRC_OSC_FRQ;<br /> break;<br /> }<br /><br /> if ((PLLSTAT & (1 << 25)) > 0) { /* If the PLL is currently enabled and connected */<br /> msel = (CPU_INT32U)(PLLSTAT & 0x3FFF) + 1; /* Obtain the PLL multiplier */<br /> nsel = (CPU_INT32U)((PLLSTAT >> 16) & 0x0F) + 1; /* Obtain the PLL divider */<br /> pll_clk_feq = (2 * msel * (fin / nsel)); /* Compute the PLL output frequency */<br /> } else {<br /> pll_clk_feq = (fin); /* The PLL is bypassed */<br /> }<br /><br /> clk_div = (CPU_INT32U)(CCLKCFG & 0xFF) + 1; /* Obtain the CPU core clock divider */<br /> clk_freq = (CPU_INT32U)(pll_clk_feq / clk_div); /* Compute the ARM Core clock frequency */<br /><br /> return (clk_freq);<br />}<br />跟踪到nsel = (CPU_INT32U)((PLLSTAT >> 16) & 0x0F) + 1;这一行时候,发现nsel为unavailable,即使在这之前已经给nsel取了0作为初值。在这一行再往下跟,就飞了。 |
|