使程序从单核变为多核

时间:2018-07-19 04:51:43

标签: c++ linux multithreading

我正在考虑一个编程项目。将在小型主板上的Ubuntu或其他Linux操作系统下运行。四核x86-N系列奔腾。该软件产生8个快速信号;方波脉冲序列,用于4轴步进电机运动控制。步进信号最大为50-100 KHz,但通常较慢。想要避免这些步进信号中的抖动(称其为保真度),以便每个线程循环周期大约1-2us是一个不错的目标。该程序执行其他类型的任务,例如读/写硬盘驱动器,以太网,继续在图形显示器,键盘上更新。现有的单核程序只是不能以这种时序处理运动信号,而需要外部硬件/技术来实现。

我在这里一直在阅读其他文章,例如在运行选定核心的线程上连续阅读。这些帖子的确切含义是“输”,不确定是什么意思。连续可能意味着每分钟或?????

所以,我可能会罗word,但我希望这会清楚。所考虑的程序包括所有线程,例程,内存,共享内存。我不认为该程序会启动另一个程序或服务。其他线程将写入此程序,并在程序启动时启动。我将此信号生成线程称为快速读取

快速读取将在其他“免费”内核中启动。它必须是在内核上运行的唯一线程。希望该内核上的OS线程调度程序组件可以“关闭”,以便它甚至不中断该内核来决定下一步运行什么线程。在查看处理器手册时,每个内核都有一个计数器计时器芯片。那么是否可以使用它提供连续的中断序列,然后将其插入“锁定”的快速线程中以进行计时?这是大约1-2 us的范围。如果不是,则只需读取该CTC上的一个频道即可提供软件同步。因此,该快速线程将不会遇到(体验)其他内核和关联的多核架构中发出的中断的任何延迟。此快速读取在运行时将继续运行,直到程序关闭。这可能是几个小时。

用于驱动此快速读取的输入数据将是程序中定义的公用共享内存。还有用于运动限制的硬件信号(来自GPIO或SDI端口)。如果有的话,则强制编程停止所有运动。它不需要1〜2us的响应。可能会导致运动循环变慢。

啊,输出:

一些运动数据被写回到共享存储器中(为此目的而分配)。像当前位置和当前循环号一样,

需要输出一些信号(8个输出)。有许多免费的GPIO。不确定获取信号的GPIO引脚以更改输出的路径。对Linux的系统调用会启动针脚更改事件。还有一个可用的SDI端口,最高可运行25Mhz时钟。似乎这些端口(GPIO,UART,USB,SDI)存在于不在任何特定内核上的结构中。我不确定在程序中发出这些信号之前的等待时间,直到相关的外部引脚实际显示该信号为止。在快速线程中,即使它总是相同的延迟,即使10us也可以!我知道不会那样,会有抖动。我需要考虑这个规格。

可能会有第二个专用内核(与上面类似)用于慢动作计划。剩下的两个核心。从那时起,其他所有项目(SATA,视频屏幕,键盘...)都已经可以在单个内核中工作,那么剩下的两个内核应该很棒。

在程序结束时,快速读取将CTC和其核心上的任何其他设备恢复为“原样”,从而使该核心中的OS组件重新启用,使其能够更正常地运行。线程结束。

结论:我已经描述了整个程序,以便让您了解运行此快速阅读的过程,需要如何响应,并且它必须不受干扰!!该处理器在1.5〜2.0 GHz范围内运行。当然,它可以在所需的时间范围内进行重复计算。

期望::我不知道允许我以这种方式使用选定的x86内核的系统调用。任何指针都会有所帮助。描述这些调用/过程的任何手册或文档。

在Windows 7,10中也可以使用内核吗?

感谢阅读以及您拥有的所有指针。

斯坦

0 个答案:

没有答案