【转帖】怎样使用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中的相应内容

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
01 #define ALT_MODULE_CLASS_timestamp_timer altera_avalon_timer

02 #define TIMESTAMP_TIMER_ALWAYS_RUN 1

03 #define TIMESTAMP_TIMER_BASE 0x1002020

04 #define TIMESTAMP_TIMER_COUNTER_SIZE 32

05 #define TIMESTAMP_TIMER_FIXED_PERIOD 0

06 #define TIMESTAMP_TIMER_FREQ 125000000u

07 #define TIMESTAMP_TIMER_IRQ 3

08 #define TIMESTAMP_TIMER_IRQ_INTERRUPT_CONTROLLER_ID 0

09 #define TIMESTAMP_TIMER_LOAD_VALUE 124ULL

10 #define TIMESTAMP_TIMER_MULT 1.0E-6

11 #define TIMESTAMP_TIMER_NAME "/dev/timestamp_timer"

12 #define TIMESTAMP_TIMER_PERIOD 1

13 #define TIMESTAMP_TIMER_PERIOD_UNITS "us"

14 #define TIMESTAMP_TIMER_RESET_OUTPUT 0

15 #define TIMESTAMP_TIMER_SNAPSHOT 1

16 #define TIMESTAMP_TIMER_SPAN 32

17 #define TIMESTAMP_TIMER_TICKS_PER_SEC 1000000u

18 #define TIMESTAMP_TIMER_TIMEOUT_PULSE_OUTPUT 0

19 #define TIMESTAMP_TIMER_TYPE "altera_avalon_timer"

 

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

3. 示范程序

 
ContractedBlock.gif ExpandedBlockStart.gif 代码
 
      
01 #include " system.h "

02 #include " sys/alt_timestamp.h " // Interval Timer核的驱动头文件

03 #include " alt_types.h "

04 #include < UNISTD.H >

05 #include < STDIO.H >

06

07 int main()

08 {

09 alt_u32 t0, t1;

10

11 alt_timestamp_start(); // 开启时间戳服务

12

13 t0 = alt_timestamp(); // 测量时间戳t0

14 usleep( 1 * 1000 * 1000 );

15 t1 = alt_timestamp(); // 测量时间戳1

16

17 printf( " 时间戳t0 = %ld \n " , t0);

18 printf( " 时间戳t1 = %ld \n " , t1);

19 printf( " 时间戳(t1-t0) = %ld \n " , (t1 - t0));

20 printf( " \n " );

21 printf( " 系统时钟频率是 %ld Hz\n " , alt_timestamp_freq());

22 printf( " 时间戳(t1-t0)花费 %f 秒\n " ,

23 ( double )(t1 - t0) / alt_timestamp_freq());

24

25 return 0 ;

26 }

 

注:</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

 

本文转帖张亚峰的博客:http://www.cnblogs.com/yuphone/archive/2010/04/18/1714628.html

转载于:https://www.cnblogs.com/menjr/archive/2010/07/16/1778824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值