在VxWorks中,该寄存器如何配置然后读取? 也就是说,它是什么地址,以及我用什么地址来配置它的增量率。
我们没有使用RTP,因此没有内核空间问题。只需要将速率写入某个控制地址,然后定期读取64位无符号整数计时器。
在我们的应用中,我们需要一个高分辨率的64位定时器,软件将用它来进行一般定时测量。
示例代码会很好。
答案 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);
然后调用这两个函数并连接从函数返回的变量。