zoukankan      html  css  js  c++  java
  • [笔记].怎样使用Nios II中的timestamp_timer?

    本文简单描述如何使用timestamp_timer服务,来测试usleep(1*1000*1000)到底用了多长时间。

    使用环境:Altera Quartus 9.1 SP1 + Nios II  9.1 Software Build Tools for Eclipse SP1

    步骤1 在SOPC Builder中例化Interval Timer核:

    1. 在SOPC Builder中例化Interval Timer核,命名为timestamp_timer。

    图1 添加Interval Timer核

    图1 例化Interval Timer核

    注意:命名为timestamp_timer只是为了和BSP中timestamp_timer一致,也可以命名为其他名称。

    图2 BSP中的相关设置

    图2 BSP中的相关设置

    2. 配置Interval Timer核

    图3 配置Interval Timer核

    图3 配置Interval Timer核

    注意:Timeout period随便设,不影响时间戳服务。但是Writable period和Readable snapshot要勾上,因为要用到。

    表1 寄存器选项

    表1 寄存器选项

    步骤2 NIOS II EDS中编写相应的C程序

    1. 在BSP中选择timestamp_timer,如图2所示。

    2. 查看system.h中的相应内容

    #define ALT_MODULE_CLASS_timestamp_timer altera_avalon_timer
    #define TIMESTAMP_TIMER_ALWAYS_RUN 1
    #define TIMESTAMP_TIMER_BASE 0x1002020
    #define TIMESTAMP_TIMER_COUNTER_SIZE 32
    #define TIMESTAMP_TIMER_FIXED_PERIOD 0
    #define TIMESTAMP_TIMER_FREQ 125000000u
    #define TIMESTAMP_TIMER_IRQ 3
    #define TIMESTAMP_TIMER_IRQ_INTERRUPT_CONTROLLER_ID 0
    #define TIMESTAMP_TIMER_LOAD_VALUE 124ULL
    #define TIMESTAMP_TIMER_MULT 1.0E-6
    #define TIMESTAMP_TIMER_NAME "/dev/timestamp_timer"
    #define TIMESTAMP_TIMER_PERIOD 1
    #define TIMESTAMP_TIMER_PERIOD_UNITS "us"
    #define TIMESTAMP_TIMER_RESET_OUTPUT 0
    #define TIMESTAMP_TIMER_SNAPSHOT 1
    #define TIMESTAMP_TIMER_SPAN 32
    #define TIMESTAMP_TIMER_TICKS_PER_SEC 1000000u
    #define TIMESTAMP_TIMER_TIMEOUT_PULSE_OUTPUT 0
    #define TIMESTAMP_TIMER_TYPE "altera_avalon_timer"

    第6行,Nios II软核的输入时钟频率,此处为125MHz。

    3. 示范程序

    #include "system.h"
    #include "sys/alt_timestamp.h"          // Interval Timer核的驱动头文件
    #include "alt_types.h"
    #include 
    #include 
    
    int main()
    {
      alt_u32 t0, t1;
    
      alt_timestamp_start();                // 开启时间戳服务
    
      t0 = alt_timestamp();                 // 测量时间戳t0
      usleep(1*1000*1000);
      t1 = alt_timestamp();                 // 测量时间戳1
    
      printf("时间戳t0 = %ld \n", t0);
      printf("时间戳t1 = %ld \n", t1);
      printf("时间戳(t1-t0) = %ld \n", (t1-t0));
      printf("\n");
      printf("系统时钟频率是 %ld Hz\n", alt_timestamp_freq());
      printf("时间戳(t1-t0)花费 %f 秒\n",
              (double)(t1-t0)/alt_timestamp_freq());
    
      return 0;
    }

    注:</stdio.h></unistd.h>是发博客发出来的,不属于该代码。

    时间戳服务就是将每1秒等分为系统时钟频率大小的个数。然后已经两个时间戳大小,相减再除以系统时钟频率数,就可以得到两个时间戳之间花费的时间了。

    4. 运行结果

    图4 运行结果

    图4 运行结果

    参考资料

    1. Volume5: Embedded Peripherals, QuartusII  Handbook Version 9.1

    http://www.altera.com/literature/hb/nios2/n2cpu_nii5v3.pdf

  • 相关阅读:
    CAS 5.X 安装
    《从0到1》开启商业和未来的秘密
    阿里Java开发规约插件使用
    【Effective Java】阅读
    Java8 流的使用示例
    我对线程安全的理解
    APP微信支付实现
    如何将微信上传AMR格式语音转化为MP3格式
    如何在下载文件前确定文件名
    寻找水王1
  • 原文地址:https://www.cnblogs.com/yuphone/p/1714628.html
Copyright © 2011-2022 走看看