珊瑚虫 发表于 2005-7-20 21:07:45

各位朋友看看这吧:绝对有挑战性的问题

有点长,不过这个问题真的很奇怪,有兴趣的朋友可以耐心看看

主文件如下:

void * test_function[]=    /* 二维指针数组,存放待测试的几个项目 */
{
    (void *)Test_Led,    "LED test      ",
    (void *)Test_KeyBoard,    "keyboard      ",
    (void *)Timer_Pwm,"Test PWM and pwm timer   ",
    (void *)Test_Rtc,    "RTC test    ",
    (void *)Test_Adc,    "ADC sampling test      ",
    (void *)Test_Printf,"Test Printf   ",
      0,    0
};

////////////////////////////////////////////////////////////////////////////

void Main(void)
{
    U32 i;

    rSYSCFG = SYSCFG_8KB;   

#if (PLLON == 1)   
    ChangePllValue(PLL_M,PLL_P,PLL_S);
   
#endif

    Port_Init();
   
    Isr_Init();/* 中断初始化,使能IRQ,禁止FIQ,使用非矢量中断 */
   
    Uart_Init(0,115200);/* 串口初始化,设置串口0波特率:115200bps */
   
   Delay(0);/* 校准延时时间 */
   
    while(1)
    {
       i = 0;
       Uart_Printf("\n\n\n            Welcome to SW44B0 test!             \n");
       Uart_Printf("            Now,let's start.                  \n\n");
   
      while(1)
      {   
            Uart_Printf("%2d:%s",i+1,test_function);
            i++;
            if((int)(test_function) == 0)
            {
                Uart_Printf("\n");
                break;/* 退出循环 */
            }
            if((i%4) == 0)
            Uart_Printf("\n");
      }

      Uart_Printf("\nPlease select which peripheral you want to test:");
      
      i = Uart_GetIntNum();/* 获取输入的数字 */
      
      i--;/* i自减 */
      
      Uart_Printf("\n");
      
      if((i < (sizeof(test_function)/8)) )/* 无符号整型总是大于或等于0 */
            ( (void (*)(void)) (test_function) )();
    }
}


显示主界面如下:

            Welcome to SW44B0 test!
            Now,let's start.

1:LED test      2:keyboard      3:Test PWM and pwm timer    4:RTC test
5:ADC sampling test       6:Test Printf

Please select which peripheral you want to test:

其中,2,3,4中都涉及到中断处理,比如,keyboard我使用的是中断请求的方法,四个按键分别接EINT4~EINT7中断。
现在的问题是,当我在主界面输入1或者5,即选择没涉及中断的测试项目时,程序就能正常运行,所谓正常运行,在这里
就是指i = Uart_GetIntNum();这句话返回后,i确实为1。但是当我选择2,3或者4即选择涉及到中断的选项时,i = Uart_GetIntNum();返回的
i是0而不是2,3或者4,这样i--后,i为0xffffffff,自然,不会进入相应的处理函数了。
我是用单步调试观察i值的,进入Uart_GetIntNum()函数后,确实很奇怪,i=1或者5都很正常返回,可是i=2,3,4时却返回0,真的是百思不得其解。
我用sdt生成的bin文件没有这些问题的。
兄弟们帮帮忙,课题很急,如果再解决不了的话,我可能又要重新用sdt了
谢谢

珊瑚虫 发表于 2005-7-20 21:53:04

找出问题所在,但是不知如何解决。
问题在于:
  在Uart_GetIntNum()中有一个result=atoi(string);
语句,当在主界面上输入1或者5(不涉及中断)时,string确实为1或者5,atoi也能正确转换,result为1或者5。
但是当在主界面上输入2,3或者4(涉及中断)时,string也没错,但是atoi转换出错,result还是0没有转化为2,3或者4,我单步跟踪进
atoi,发现却是汇编语句,看起来挺费劲,郁闷
不知道怎么改,痛苦啊,怎么ads使用起来还蛮多问题咧

Anomymous 发表于 2005-7-21 09:08:51

涉及到的问题大多了,不能从你所帖的程序片断中就可以看出来的!
你还是认真看下程序吧.

珊瑚虫 发表于 2005-7-21 09:21:17

在sdt下啥问题都没有,而在ads下却老不稳定,同样的代码生成的bin,有时正常工作,有时确出问题,但这些问题都是涉及到中断的代码,奇怪。

jackaly 发表于 2005-7-21 10:09:17

是不是ADS无设置好啊?

珊瑚虫 发表于 2005-7-21 10:50:40

应该不会吧,该设置的我都设置了,如robase,rwbase,entry point都设置好了的

limingth 发表于 2005-7-23 09:54:08

你的中断处理入口函数,保存处理器现场的工作都正确处理了么?

珊瑚虫 发表于 2005-7-23 10:27:12

这些工作编译器会自动处理吧?编译器文档上说,为了方便使用高级语言编写异常处理函数,ARM编译器对异常处理函数作了特定扩展,只要使用关键字__irq,这样编译出来的函数就满足异常响应对现场保护和恢复的需要。

经21ic上一位大侠指点,现在已经解决了,只要加一个__rt_lib_init()函数就可以。
页: [1]
查看完整版本: 各位朋友看看这吧:绝对有挑战性的问题