场景:
节点1(发送方)具有本地时钟(40.000 MHz),并通过串行(即光纤)链路将此时钟信号作为连续的比特流(01010101 ...)发送到节点2(接收方)。
节点2具有自己的(本地或全局,例如41.000 MHz)时钟,并且必须使用从节点1接收到的(时钟)数据来确定节点1本地时钟相对于其自身时钟的相位和频率。
或者,我可以想到节点1向节点2发送单个消息,但以明确定义的40.000 MHz频率向节点2发送。同样,节点2(具有自己的本地或全局41.000 MHz时钟)必须确定相位节点1从节点1接收到的消息的到达时间,将节点1的本地时钟相对于其自身时钟的频率和频率
问题:我该如何在OMNet ++中实现这两种情况?
答案 0 :(得分:0)
我不了解OMNet ++,但如果您同时拥有两个时钟的滴答声,会
the_other_clocks_freq = the_other_clocks_ticks*your_own_freq/your_own_ticks
获得工作频率?示例:
#include <iostream>
class Clock {
uint64_t m_freq;
uint64_t m_ticks;
public:
Clock(uint64_t Base) : m_freq(Base), m_ticks(0) {}
void tick() { ++m_ticks; }
operator double () const { return static_cast<double>(m_ticks)/static_cast<double>(m_freq); }
uint64_t getTicks() const { return m_ticks; }
uint64_t getOtherClockFreq(uint64_t other_ticks) {
return (other_ticks*m_freq)/m_ticks;
}
};
int main() {
Clock Node1(40000000);
Clock Node2(41000000);
// simulate 0.00075s
for(int i=0; i<40000*75/100; ++i) Node1.tick();
for(int i=0; i<41000*75/100; ++i) Node2.tick();
std::cout << Node1 << "s\n"; // 0.00075s
std::cout << Node2 << "s\n"; // 0.00075s
// calculate the base freq of the other clock
std::cout << Node1.getOtherClockFreq(Node2.getTicks()) << " Node2 base\n";
std::cout << Node2.getOtherClockFreq(Node1.getTicks()) << " Node1 base\n";
}
输出
0.00075s
0.00075s
41000000 Node2 base
40000000 Node1 base
以这种速度,您可能需要比uint64_t
大的东西来存储刻度线,但是我不知道在这种情况下是什么阶段。