各位朋友看看这吧:绝对有挑战性的问题
有点长,不过这个问题真的很奇怪,有兴趣的朋友可以耐心看看主文件如下:
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了
谢谢 找出问题所在,但是不知如何解决。
问题在于:
在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使用起来还蛮多问题咧 涉及到的问题大多了,不能从你所帖的程序片断中就可以看出来的!
你还是认真看下程序吧. 在sdt下啥问题都没有,而在ads下却老不稳定,同样的代码生成的bin,有时正常工作,有时确出问题,但这些问题都是涉及到中断的代码,奇怪。 是不是ADS无设置好啊? 应该不会吧,该设置的我都设置了,如robase,rwbase,entry point都设置好了的 你的中断处理入口函数,保存处理器现场的工作都正确处理了么? 这些工作编译器会自动处理吧?编译器文档上说,为了方便使用高级语言编写异常处理函数,ARM编译器对异常处理函数作了特定扩展,只要使用关键字__irq,这样编译出来的函数就满足异常响应对现场保护和恢复的需要。
经21ic上一位大侠指点,现在已经解决了,只要加一个__rt_lib_init()函数就可以。
页:
[1]