c++ - 将程序从单核适配到多核
问题描述
我正在考虑一个编程项目。将在小板上的 Ubuntu 或其他 Linux 操作系统下运行。四核 x86 - N 系列奔腾。软件生成8个快速信号;用于 4 轴步进电机运动控制的方波脉冲序列。步进信号最大为 50-100 KHz,但通常较慢。想要避免这些步进信号中的抖动(称之为良好保真度),因此每个线程循环周期大约 1-2us 将是一个不错的目标。该程序执行其他类型的任务,如读/写硬盘驱动器、以太网、继续更新图形显示器、键盘。现有的单核程序无法以这种时序处理运动信号,需要外部硬件/技术来实现。
我一直在这里阅读其他帖子,例如在运行选定核心的线程上,连续。这些帖子中的确切含义是“输”,不确定真正的含义。连续可能意味着每分钟测试一次或?????
所以,我可能会罗嗦,但我希望它会很清楚。所考虑的程序包含所有线程、例程、内存、共享内存。我不考虑这个程序启动另一个程序或服务。其他线程写在这个程序中,并在程序启动时启动。我将此信号生成线程称为FAST THREAD。
FAST THREAD将被启动到一个“免费”的核心。它必须是在核心上运行的唯一线程。希望该内核上的操作系统线程调度程序组件可以“关闭”,这样它甚至不会在该内核上中断来决定接下来运行哪个线程。在查看处理器手册时,每个内核都有一个计数器定时器芯片。那么我是否有可能使用它来提供连续的中断序列,然后进入我的“锁定”快速线程以用于计时目的?这是大约1-2 us的范围。如果没有,那么只需读取该 CTC 上的一个通道以提供软件同步。因此,这个快速线程将不会看到(体验)其他内核和相关多核结构中发出的中断造成的延迟。这个快速线程,运行时,会继续运行,直到程序关闭。这可能是几个小时。
驱动这个FAST THREAD的输入数据将是程序中定义的公共共享内存。还有用于运动限制的硬件信号(来自 GPIO 或 SDI 端口)。如果有任何结果为真,则强制程序停止所有运动。它不需要1~2us的响应。它可能会进入较慢的运动循环。
啊,输出:
一些运动数据被写回共享内存(为此目的分配)。像当前位置和当前循环编号一样,
需要输出一些信号(8 个输出)。有许多免费的 GPIO。不确定获取信号 GPIO 引脚以更改输出的路径。对 Linux 的系统调用会启动引脚更改事件。还有一个可用的 SDI 端口,运行频率高达 25Mhz。这些端口(GPIO、UART、USB、SDI)似乎存在于不在任何特定内核上的结构中。我不确定从程序中发出这些信号到相关的外部引脚实际呈现该信号的延迟。在快速线程中,即使 10us 也可以,如果它总是相同的延迟!我知道不会这样,会有抖动。我需要考虑这个规范。
可能会有第二个专用核心(类似于上面)用于较慢的运动规划。这为其他所有事情留下了两个核心。从那时起,其他所有项目(sata,视频屏幕,键盘......)都已经能够在一个核心中工作,那么剩下的两个核心应该很棒。
在程序结束时,FAST THREAD将 CTC 和其核心上的任何其他设备恢复为“原样”,重新启用该核心中的操作系统组件以使其更正常运行。线程结束。
结束语:我已经描述了整个程序,以便您了解我想用这个FAST THREAD运行做什么,它需要有多大的响应能力,以及它需要不受干扰!!该处理器在 1.5 ~ 2.0 GHz 范围内运行。它当然可以在所需的时间范围内进行重复计算。
期望:我不知道允许我以这种方式使用选定的 x86 内核的系统调用。任何指针都会有所帮助。描述这些调用/程序的任何手册或文档。
内核的这种使用也可以在 Windows 7,10 中完成)吗?
感谢您的阅读和您的任何指示。
斯坦
解决方案
推荐阅读
- javascript - 删除所有表行,除了具有给定类的行
- python - 如何在python中使用代理服务器和dokuwiki模块
- css - SCSS - 用 rem 计算字体大小
- asp.net-core - 如何从单个 Web api 项目访问多个表并为所有表使用通用方法
- javascript - 如何禁用调试器;JS中的命令?
- ruby - ConnectionPool 和 ConnectionPool::Wrapper 之间的 Ruby mperham/connection_pool 区别
- android-studio - 创建新项目时在 Android Studio 中禁用使用 androidx.* artifacts 选项
- arrays - Presto - 我如何过滤连续出现的数组值
- nrwl - How to use DataPersistence to use 2 States at the same time
- javascript - 从快速路由中的事件侦听器捕获异常