如何在VxWorks中访问飞思卡尔P2020的备用时基寄存器64位定时器寄存器

时间:2012-08-24 16:59:45

标签: timer embedded vxworks powerpc

在VxWorks中,该寄存器如何配置然后读取? 也就是说,它是什么地址,以及我用什么地址来配置它的增量率。

我们没有使用RTP,因此没有内核空间问题。只需要将速率写入某个控制地址,然后定期读取64位无符号整数计时器。

在我们的应用中,我们需要一个高分辨率的64位定时器,软件将用它来进行一般定时测量。

示例代码会很好。

2 个答案:

答案 0 :(得分:0)

这取决于您的应用程序想要对计时器及其发生的环境做些什么。我没有使用那个特定的芯片,所以我不能告诉你如何使用寄存器。

如果您想要的是类似时间戳的功能,您可以在操作之前和之后读取计数器并在两者之间进行区分,那么VxWorks板支持包通过sysTimestamp系列函数提供该功能。请参阅文档。

但是,如果sysTimestamp不符合您的要求,但您仍想访问该寄存器以读取当前时间您的代码在内核空间中运行(与用户空间AKA RTP相比)那么你只需要定义一个将返回时间戳的函数......

uint64 myTimestamp() {
   uint64 ts;
   ts = *read & massage the register*
     *deal with overflows, etc... *

   return ts;
}

另一方面,如果您的应用程序在RTP环境中运行,事情变得更加复杂,因为RTP(与Windows中的进程非常相似)无法直接访问硬件功能。

一种可能性是将物理内核内存页面映射到RTP,以便它可以直接访问寄存器。非常沮丧,因为你在系统的保护机制中打开了一个洞。您还可以专门实现自定义系统调用以读取时间戳寄存器。

这两种解决方案都需要中级 - 高级技能与vxWorks。

答案 1 :(得分:0)

要访问时基寄存器,您可以编写一些汇编代码来访问它:

.global TBL_get
.global TBU_get
TBL_get:
    mfspr   r3, 268
    blr
TBU_get:
    mfspr   r3, 269
    blr

这访问低位然后是时基寄存器的高位并返回一个参数。

不要忘记在.h文件中定义这样的功能:

uint32 TBL_get (void);
uint32 TBU_get (void);

然后调用这两个函数并连接从函数返回的变量。