在 VxWorks 中如何配置和读取该寄存器?也就是说,它在什么地址,我写什么地址来配置它的递增率。
我们没有使用 RTP,所以不存在内核空间问题。只需要将速率写入某个控制地址,然后定期读取 64 位无符号整数定时器。
在我们的应用中,我们需要一个高分辨率的 64 位定时器,软件将使用它来进行一般的定时测量。
示例代码会很好。
这取决于您的应用程序想要对计时器做什么以及它将发生的环境。我没有使用那个特定的芯片,所以我不能告诉你如何使用寄存器。
如果您想要的是类似时间戳的功能,您可以在操作之前和之后读取计数器并在两者之间进行区分,那么 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 的中高级技能。
要访问时基寄存器,您可以编写一些汇编代码来访问它:
.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);
然后调用这两个函数并连接从函数返回的变量。