嵌入式开发者社区

标题: 再次求教大神定时器不准确问题,付代码 [打印本页]

作者: wsbuaa    时间: 2016-6-9 14:41
标题: 再次求教大神定时器不准确问题,付代码
程序基本思路是在for()里通过串口接到上位机赋初值后,启动定时器,然后1秒结算1次,用的定时器1,然后在定时器中断里点灯,设置标识,在for里再用一个函数做些解算和通过串口传给上位机的功能,问题是感觉点灯时间要比1秒多,感觉要有两秒了,要是在for里不执行解算等功能函数,感觉点灯就1秒正常了,这是为什么?代码如下:
void  ISR_5ms()
{
        TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
        g_uiCntClock++;
    GPIOPinWrite(SOC_GPIO_0_REGS, 109, ucLED);
                ucLED=!ucLED;
                GPIOPinWrite(SOC_GPIO_0_REGS, 110, ucLED);
                OUT_Flag=1;
}

        for(;;)
        {        
                InportProc();
        //OutportProc();

}
如果不执行OutportProc()感觉定时器点灯正常,计时准确,如果执行了就要比1秒时间长,根绝计时就不准确了OutportProc();代码如下:
void OutportProc(void)

{
         if(1==OUT_Flag)
                                                                   {

                                                         for(i = 0; i < 20; i++)  //初始化数据变量
                                                         {
                                                          b = '\0';
                                                         }
                                                           i=0;

                                                                  sins(qnb,vn,pos,wm,vm,Ts);
                                                                                   vn[2] = 0;
                                                                                   pos[2] = pos0[2];         //限定高度发散

                                                                                   nav_err(qnb,vn,pos,qnb0,vn0,pos0);
                                                                              for( j=0; j<9 ; j++ )
                                                                              {
                                                                                      sprintf(b,"%le",vari_nav_err[j]);
                                                                                      strcat(b,"\t");
                                                                                                   printf("%s",b);
                                                                                               Send_Flag=1;
                                                                                            if(Send_Flag == 1)
                                                                                          {
                                                                                                // ScibRegs.SCITXBUF=b[0];
                                                                                                   while( b!= '\0')

                                                                                           {
                                                                                                        UARTCharPut(SOC_UART_1_REGS, b);
                                                                                                i++;
                                                                                          }

                                                                                                   i=0;
                                                                     }


                                                                                                                    Send_Flag=0;
                                                                              }
                                                                      printf("\n");
                                                                        UARTCharPut(SOC_UART_1_REGS,receive);
//
//                                        GPIOPinWrite(SOC_GPIO_0_REGS, 109, ucLED);
//                                        ucLED=!ucLED;
//                                        GPIOPinWrite(SOC_GPIO_0_REGS, 110, ucLED);
                                                                        OUT_Flag=0;


                                                                }


作者: 希望缄默    时间: 2016-6-9 14:58
排队等着进广东省博物馆 反正无聊顺带回答下你的问题  TI C6000 DSP 不允许系统的时候不支持中断嵌套 所以在中断服务函数执行时其它中断都会被忽略 你的 ISR 函数时间太长估计是丢了中断了
作者: wsbuaa    时间: 2016-6-9 15:51
没太懂,能说的详细点没,我的定时器中断里很简单呀,没几条语句呀
作者: wsbuaa    时间: 2016-6-9 16:30
我想1秒解算1次,然后把结果过串口1输出到上位机保存,如果不允许中断嵌套,该如何实现。
作者: 希望缄默    时间: 2016-6-9 16:53
在主函数做处理
作者: wsbuaa    时间: 2016-6-9 17:04
感谢你在假期给我的回答,我现在就是在主函数的for()里做的,我刚才又试了下,把OutportProc()里下面代码去掉
for( j=0; j<9 ; j++ )
                                                                              {
                                                                                      sprintf(b,"%le",vari_nav_err[j]);
                                                                                      strcat(b,"\t");
                                                                                                   printf("%s",b);
                                                                                               Send_Flag=1;
                                                                                            if(Send_Flag == 1)
                                                                                          {
                                                                                                // ScibRegs.SCITXBUF=b[0];
                                                                                                   while( b!= '\0')

                                                                                           {
                                                                                                        UARTCharPut(SOC_UART_1_REGS, b);
                                                                                                i++;
                                                                                          }

                                                                                                   i=0;
                                                                     }


                                                                                                                    Send_Flag=0;
                                                                              }
                                                                      printf("\n");
                                                                        UARTCharPut(SOC_UART_1_REGS,receive);
就正常了,加上就慢了,可是我肯定需要这些代码要往上位机传数据呀
作者: 希望缄默    时间: 2016-6-9 18:58
printf 这些函数很耗时的
作者: wsbuaa    时间: 2016-6-12 20:40
真是高手,就是printf的问题,谢谢




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4