QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2300|回复: 7

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

[复制链接]
发表于 2005-7-20 21:07:45 | 显示全部楼层 |阅读模式
有点长,不过这个问题真的很奇怪,有兴趣的朋友可以耐心看看

主文件如下:

void * test_function[][2]=    /* 二维指针数组,存放待测试的几个项目 */
{
    (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[1]);
            i++;
            if((int)(test_function[0]) == 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)/) )/* 无符号整型总是大于或等于0 */
            ( (void (*)(void)) (test_function[0]) )();
    }
}


显示主界面如下:

            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使用起来还蛮多问题咧
回复

使用道具 举报

发表于 2005-7-21 09:08:51 | 显示全部楼层
涉及到的问题大多了,不能从你所帖的程序片断中就可以看出来的!
你还是认真看下程序吧.
回复

使用道具 举报

 楼主| 发表于 2005-7-21 09:21:17 | 显示全部楼层
在sdt下啥问题都没有,而在ads下却老不稳定,同样的代码生成的bin,有时正常工作,有时确出问题,但这些问题都是涉及到中断的代码,奇怪。
回复

使用道具 举报

发表于 2005-7-21 10:09:17 | 显示全部楼层
是不是ADS无设置好啊?
回复

使用道具 举报

 楼主| 发表于 2005-7-21 10:50:40 | 显示全部楼层
应该不会吧,该设置的我都设置了,如robase,rwbase,entry point都设置好了的
回复

使用道具 举报

发表于 2005-7-23 09:54:08 | 显示全部楼层
你的中断处理入口函数,保存处理器现场的工作都正确处理了么?
回复

使用道具 举报

 楼主| 发表于 2005-7-23 10:27:12 | 显示全部楼层
这些工作编译器会自动处理吧?编译器文档上说,为了方便使用高级语言编写异常处理函数,ARM编译器对异常处理函数作了特定扩展,只要使用关键字__irq,这样编译出来的函数就满足异常响应对现场保护和恢复的需要。

经21ic上一位大侠指点,现在已经解决了,只要加一个__rt_lib_init()函数就可以。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-21 20:27 , Processed in 0.077875 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表