打印
[菜农助学交流]

CN(菜鸟)之250助学板TIMR的技巧--->>测程序运行时间!!

[复制链接]
2890|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chinacn1989|  楼主 | 2011-9-8 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, gp, IO, pi, GPIO
本帖最后由 chinacn1989 于 2011-9-9 09:38 编辑

助学第二帖:
      首先祝大家中秋快乐哈!
      因为周末中秋回家所以先把帖子上传了。这片贴子不是讲定时器的应用。而是和大家分享下一点小技巧:
      主要是通过定时器来测定程序的运行时间,道理其实很简单。可能大家很多人都知道。给那些没有用过这种方法的人哈。而且我也不知道这种方法的准确度怎么样。我觉得应该比较准确吧!
      我还是先讲讲原理吧,
      首先把你的程序放在while循环里面,你只需保证while循环的最后一句是i++就可以了。然后就是利用定时器定时1s,1ms,或者一段时间内看看你i变成了多少就可以看出你的程序在1s,1ms,或者在你规定的时间内执行了多少次。然后用你的时间除以i就得到了你的程序运行时间。(运用定时器中断来dis_i,单次模式下只会有一个中断。所以i就是程序运行的次数)
      我先这样写的,后来发现有点问题。因为发现i++;也会算到时间里面,so...这样的算法也不是怎么准,所以我们可以分两步来计算程序运行时间。
     第一步,将while中指有i++,算算在你规定的时间内是多少次。算出每一次大概的时间T1。
     第二步,将你的要计算时间的程序段加入到while中,然后看看运行多少次。算出运行一次需要的时间T2。
     最后将第二次运算的时间减去第一次运行的时间T=T2-T1。
得到了你需要计算程序的时间。
大概思路是这样的。不知道有没有什么问题,给大家分享下。顺便看看前辈们有什么看法对于这种想法。

下面是我的程序例子,和一些说明:
 
#include"nuc1xx.h"
#include"drvtimer.h"
#include"drvsys.h"
#include"drvgpio.h"
#define w GPIOA->DOUT
#define da GPIOB->DOUT
void display(float x);
void delay(int i);
int num;
int ling,jisuan,n,i;
long temp;
double v[];
void Timer0_Callback(void)
    {
while(1)
{
  display(num);
}
}
void delay(int i)              //延时函数
{
   int j,k;
  for(j=0;j<i;j++)
   for(k=0;k<255;k++);
}
void display(float x)             //显示函数
{
   unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //定义共阴极数码管字形编码0-9
unsigned char num1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //定义共阴极数码管字型编码0.-9.
int a,b,c,d,e,f,g;long m;
  
*((volatile unsigned int *)((uint32_t)&GPIOB->MD)) &=0Xff5555ff;  //定义PB0-PB7为输出模式
GPIOA->MD.PMD8=1;            //PB8-11为输出模式
GPIOA->MD.PMD9=1;
GPIOA->MD.PMD10=1;
GPIOA->MD.PMD11=1;
outpw(&SYS->GPAMFP, 0);
*((volatile unsigned int *)((uint32_t)&SYS->GPBMFP))= (*((volatile unsigned int *)((uint32_t)&SYS->GPBMFP))) & 0X00; //GPB为IO口
m=1000*x;
m=(long)m;                //将要显示的数据分离成单独的位
     a=m/1000000;
  b=m%1000000/100000;
  c=m%100000/10000;
  d=m%10000/1000;
  e=m%1000/100;
  f=m%100/10;
  g=m%10;
   
   if(x<10)
  {
     w&=0xf7ff; da|=num[g]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0Xfbff; da|=num[f]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfdff; da|=num[e]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfeff; da|=num1[d]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  }
   else if(x>=10 && x<100)
        {
     w&=0Xf7ff; da|=num[f]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfbff; da|=num[e]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfdff; da|=num1[d]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfeff; da|=num[c]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  }
else if(x>=100 && x<1000)
        {
     w&=0Xf7ff; da|=num[e]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfbff; //da|=num1[d]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfdff; //da|=num[c]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfeff; //da|=num<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  }
else
        {
     w&=0Xf7ff; da|=num1[d]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfbff; da|=num[c]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfdff; da|=num<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  w&=0xfeff; da|=num[a]<<4; delay(10);
  w|=0x0f00; da&=0xf00f;
  }
   }

int main()
{  num=0;

  DrvTIMER_Init();
/*定时器初始化函数*/
DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,7);
/*TIMER0 时钟源选择:000 =外部12MHz 晶振 、001 =外部 32KHz 晶振 、010 = HCLK 、011 = 外部触发时钟 、1xx =内部 22MHz 振荡器 */
DrvTIMER_Open(E_TMR0,1,E_ONESHOT_MODE);
/*设定定时器 tick 周期并且启动定时器:定时器通道 TMR0 每秒1次 周期模式*/
DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);
/* 隔1个tick执行事件,parameter3-事件处理函数指针,4-传递参数*/
DrvTIMER_EnableInt(E_TMR0); //使能定时器中断
DrvTIMER_Start(E_TMR0); //启动定时器
while(1)
{
// display(123);
//  UNLOCKREG();
//  DrvWDT_Ioctl(E_WDT_IOC_RESET_TIMER,0);
//  LOCKREG();
//  i=1;
//  GPIOA->MD.PMD2=0;         //配置ADC5和ADC6为输入引脚,
//     GPIOA->MD.PMD3=0;
//  SYS->GPAMFP.ADC4_AD9=1;          //PA.5&A.6作为AD输入
//  SYS->GPAMFP.ADC5_AD8=1;     
//     ADC->ADCR.ADST=1;                   //开始AD转换
//  ADC->ADCR.ADST=0;
//  ADC->ADSR.ADF=1;
//  temp=ADC->ADDR[5].RSLT;
// if(2556>2554&&-3<956)
//    {
//    ling++;
//    if(ling%2==0)
//      {
//   jisuan=1;
//   n=i;i=0;ling=0;
//   }
//  else
//   v=temp;
//  }
// else
//  v=temp;
  num++;
}


  

}

程序中有个显示函数,中断函数,延时函数和main函数!
但是显示是while外不会占时间。
while循环中的注释部分就是我需要测时间的程序,如果值需要大概时间就可以不用计算单独执行while
i++的时间。
可能计算的程序当中会有些不相关的参数,这些完全可以在前面定义不会占用while的时间。而且有些变量是变化的你可以取一个变化范围内的量来写入程序中。那样就能看到你运行的程序具体需要多少时间了....



谢谢....
完了!!!
下次见.....

相关帖子

沙发
lixiaoxu2meng| | 2011-9-9 07:42 | 只看该作者
顶 有时间看看

使用特权

评论回复
板凳
chinacn1989|  楼主 | 2011-9-9 08:27 | 只看该作者
谢谢支持!
:D

使用特权

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

本版积分规则

6

主题

272

帖子

0

粉丝