在C和时序要求中调度例程

时间:2014-09-17 07:13:12

标签: c multithreading timing

我正在开发一个C程序,通过USB3传输样本一段时间(1-10 us),然后接收100-1000 us的样本。我有一个基本的pthread实现,其中TX和RX例程都作为线程处理。原因是为了测试实际的TX例程,RX需要在激活发射器之前运行和采样。

请注意,我在嵌入式应用程序之外的C经验非常少,这是我第一次涉足pthread。

我的问题是,因为我确切地知道需要发送和接收的样本数量,我该怎么做呢? TX线程执行完毕后启动RX线程,反之亦然?如何确保时序保持一致?采样频率为10 MHz会导致一些严格的时序要求。

谢谢!

编辑:

为了提供更多细节,我的设备是bladeRF x40 SDR,与设备的通信由FX3微控制器处理,该微控制器通过USB3连接进行。我正在运行Xubuntu 14.04。然而,处理,调度和配置由在PC上运行的C程序处理。

2 个答案:

答案 0 :(得分:2)

除了支持pthread之外,您没有对您的平台说任何

因此,假设Linux,您将不得不意识到,通常Linux不是一个实时操作系统,而您所做的确实听起来好像有实时时序要求。

有Linux的实时变体,我不确定它们如何满足您的需求。您可能也可以通过在内核驱动程序中完成工作来获得更好的性能,但是您将无法访问pthread,因此您将不得不更低级别

答案 1 :(得分:0)

以为我会发布我的解决方案。

虽然bladeRF固件和FPGA映像的下一个版本将包含向同步接口添加元数据(时间戳)的选项,但直到那时我才能知道在哪个时刻发生某些事件。

我所知道的是我的采样率,以及我需要相对于彼此传输和接收的样本数量。因此,通过使用条件变量(使用pthread),我可以发信号通知我的接收器在所需的瞬间开始接收样本。由于TX和RX操作以非常特定的顺序发生,我可以通过计算采样数并乘以采样率来计算延迟,已经证明其准确度在95-98%之内。

这显然意味着由于我的TX和RX线程同时运行,所接收的样本集中的数据块将是无用的,我还有另一个例程来丢弃这些样本。