gpt4 book ai didi

c - 程序调用延迟 - C 和 Linux

转载 作者:太空狗 更新时间:2023-10-29 11:14:06 25 4
gpt4 key购买 nike

我正在研究用于事件假肢的新硬件。我的系统有一个 BeagleBone Black RevC 嵌入式计算机和一些定制板。 BeagleBone Black (BBB) 运行 Debian Linux。

我编写了一个 C 控制台应用程序来与 Linux 中的其他开发板通信。我可以从终端发送类似“./plan execute_1 set_pid_gains 10 50 0”的命令来更改在我的电机驱动器上运行的控制回路的增益。 “计划”函数是用 C 语言编写的。它通过 SPI 发送消息。

程序本身运行良好,我可以发送我想要的所有命令。然而,当我们开始从 Python 测试它(使用 Popen 调用 C 程序)时,我们意识到它的执行速度没有我们想要的那么快。

为了复制和隔离问题,我编写了一个 shell 脚本 (fxa_test_z_1),它在我的网络上发送 3 个命令:

#!/bin/bash
# Places FlexSEA in Impedance control mode
# Use with care!

# Set control mode to 'z' (4)
./plan execute_1 set_control 4

# Current loop gains:
./plan execute_1 set_current_gains 10 50 0

# Choose from one of these:
./plan execute_1 set_z_gains 1 0 0
echo "FlexSEA in Stiffness mode"

每个功能之间有 14 毫秒的延迟(用示波器测量)。我进行了许多小实验来隔离问题。打开和关闭 SPI 端口、发送 SPI 命令和解析 agv[] 都不是问题。如果我在同一个程序调用中多次调用它们,则每个串行数据包之间的延迟约为 700us。

调用“nice -n -19 ./fxa_test_z_1”没有任何改变。

==

我该怎么做才能使这些函数调用发生得更快?有没有希望我能让他们去sub-ms?

现在我正在努力避免对我的代码进行重大修改,因为我们要在明天测试我们的控制循环。

谢谢!

杰夫

最佳答案

您可以通过让 plan 在必须再次运行之前做更多的工作来使其更快。启动流程需要大量工作,因此您不希望过于频繁地执行此流程。

要让 plan 做更多的工作,您可以在 stdin 上或从文件中为其提供命令列表。棘手的部分是解析每一行以提取单独的命令和参数。由于您现有的代码已经从 argv 读取命令,因此使用 strtok 可以很容易地将命令解析为类似 argv 的数组:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_COMMAND_LEN 256
#define MAX_ARGS 64
char *fake_argv[MAX_ARGS]; /* For compatibility with existing parser. */
const char *delims = " \n";

int main(int argc, char *argv[])
{
char command[MAX_COMMAND_LEN];

while( fgets(command, sizeof(command), stdin) )
{
int fake_argc = 0;
fake_argv[fake_argc] = strtok(command, delims);
while( fake_argv[fake_argc] != NULL )
{
fake_argv[++fake_argc] = strtok(NULL, delims);
}

{ int i; /* debug print... you can remove this block */
printf("Handling command: [%s], argc %d\n", command, fake_argc);
for( i = 0; i < fake_argc; ++i ) { printf(" arg: [%s]\n", fake_argv[i]); }
}
/* ... do the stuff you were already doing except now with fake_argv */
}

return 0;
}

然后你的 bash 脚本可以只是一组你提供给你的程序的行:

./plan << END_COMMAND_LIST
execute_1 set_control 4
execute_1 set_current_gains 10 50 0
execute_1 set_z_gains 1 0 0
END_COMMAND_LIST

现在 plan 进程被创建一次,并在退出前运行 3 个命令。

关于c - 程序调用延迟 - C 和 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25275941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com