打印
[ZLG-ARM]

IAR+JLINK+UCOSII调试的问题

[复制链接]
2361|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZorroCN|  楼主 | 2009-4-16 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IAR是5.30版本,从官网上下的基于UCOSII2.84版本的移植范例(LPC2378),用J-LINK V6调试,为了节省空间,优化选项选择最高程度的代码量优化(之前选不优化,结果也是跑飞),结果发现在这里会跑飞(在flash中调,开发板SmartARM2300)
static  void  Tmr_TickInit (void)
{
    CPU_INT32U  pclk_freq;
    CPU_INT32U  rld_cnts;

                                                                /* VIC timer #0 Initialization                              */
    VICIntSelect &= ~(1 << VIC_TIMER0);                         /* Configure the timer interrupt as an IRQ source           */
    VICVectAddr4  =  (CPU_INT32U)Tmr_TickISR_Handler;           /* Set the vector address                                   */
    VICIntEnable  =  (1 << VIC_TIMER0);                         /* Enable the timer interrupt source                        */

    pclk_freq     =   BSP_CPU_PclkFreq(PCLK_TIMER0);            /* Get the peripheral clock frequency                       */

    rld_cnts      =   pclk_freq / OS_TICKS_PER_SEC;             /* Calculate the # of counts necessary for the OS ticker    */

    T0TCR         =  (1 << 1);                                  /* Disable and reset counter 0 and the prescale counter 0   */
    T0TCR         =   0;                                        /* Clear the reset bit                                      */
    T0PC          =   0;                                        /* Prescaler is set to no division                          */

    T0MR0         =   rld_cnts;
    T0MCR         =   3;                                        /* Interrupt on MR0 (reset TC), stop TC                     */

    T0CCR         =   0;                                        /* Capture is disabled.                                     */
    T0EMR         =   0;                                        /* No external match output.                                */
    T0TCR         =   1;                                        /* Enable timer 0                                           */
}

就是在上面这个函数的pclk_freq = BSP_CPU_PclkFreq(PCLK_TIMER0);这一行,并且按F11跟进去,发现这个函数:
CPU_INT32U  BSP_CPU_ClkFreq (void)
{
    CPU_INT32U  msel;
    CPU_INT32U  nsel=0x10000000;
    CPU_INT32U  fin;
    CPU_INT32U  pll_clk_feq;                                    /* When the PLL is enabled, this is Fcco                    */
    CPU_INT32U  clk_div;
    CPU_INT32U  clk_freq;


    switch (CLKSRCSEL & 0x03) {                                 /* Determine the current clock source                       */
        case 0:
             fin = IRC_OSC_FRQ;
             break;

        case 1:
             fin = MAIN_OSC_FRQ;
             break;

        case 2:
             fin = RTC_OSC_FRQ;
             break;

        default:
             fin = IRC_OSC_FRQ;
             break;
    }

    if ((PLLSTAT & (1 << 25)) > 0) {                                /* If the PLL is currently enabled and connected        */
        msel        = (CPU_INT32U)(PLLSTAT & 0x3FFF) + 1;           /* Obtain the PLL multiplier                            */
        nsel        = (CPU_INT32U)((PLLSTAT >>   16) & 0x0F) + 1;   /* Obtain the PLL divider                               */
        pll_clk_feq = (2 * msel * (fin / nsel));                    /* Compute the PLL output frequency                     */
    } else {
        pll_clk_feq = (fin);                                        /* The PLL is bypassed                                  */
    }

    clk_div         = (CPU_INT32U)(CCLKCFG & 0xFF) + 1;             /* Obtain the CPU core clock divider                    */
    clk_freq        = (CPU_INT32U)(pll_clk_feq / clk_div);          /* Compute the ARM Core clock frequency                 */

    return (clk_freq);
}
跟踪到nsel = (CPU_INT32U)((PLLSTAT >>   16) & 0x0F) + 1;这一行时候,发现nsel为unavailable,即使在这之前已经给nsel取了0作为初值。在这一行再往下跟,就飞了。

相关帖子

沙发
ZorroCN|  楼主 | 2009-4-16 11:30 | 只看该作者

补充

nsel = (CPU_INT32U)((PLLSTAT >>   16) & 0x0F) + 1;这一行之前加入nsel=0;,结果发现nsel=0好像没有运行一样,F10直接就跳过去了,结果还是和上面的一样

使用特权

评论回复
板凳
ZorroCN|  楼主 | 2009-4-16 11:41 | 只看该作者

继续补充

优化选项关闭,nsel赋初值0有效了,但是还是死在这里:
pll_clk_feq = (2 * msel * (fin / nsel));
其中,msel=12,fin=12000000,nsel=1,几个都是合法值

使用特权

评论回复
地板
ZorroCN|  楼主 | 2009-4-16 13:57 | 只看该作者

没人回答?

老实说,我都有些开始怀疑是不是仿真器的问题了。因为BSP_CPU_ClkFreq这个函数在跑飞之前,已经执行过两次,前两次都是没有出事的。再者,也没有出现那些所谓的数据非法什么的。
还有,发现全速运行到这里,和先运行到前面某个地方,再F11单步跟进来,结果可能有区别(飞掉的位置可能是不同的)。
难道仿真器真的不够问题?

使用特权

评论回复
5
ictty| | 2009-5-14 13:37 | 只看该作者

IAR,说实话没有用过。不过听说还好,挺好用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

84

帖子

0

粉丝