【发布时间】:2020-05-26 19:39:19
【问题描述】:
首先,让我说我对编写驱动程序非常陌生,所以如果我的术语完全不正确,我深表歉意。
我正在尝试编写一个驱动程序来控制 LED 并读回我的 FPGA 开发板上的一些寄存器。 正如here 指出的那样,我知道我可以通过使用(在我的 C 程序中)提供我的二进制(或 C 程序)输入值:
int main(int argc, char *argv[]) { /* ... */ }
因此,例如,如果我在我的 Linux shell 中运行:
root@socfpga:~# ./LED_BLINK 182
我可以将输入整数 182 发送到在 linux shell 脚本中执行的二进制文件。就我而言,这会使我的 LED 闪烁 182 次(这部分有效)。所以我知道如何给程序输入,但是如何正确地从程序中提取输出呢?
我的主要问题如下:
1) 一般来说,假设我的二进制文件有我想作为输出返回的变量,我该怎么做?例如,如果我想让我的程序输出寄存器 5 的值,我在 shell 中输入:
root@socfpga:~# ./LED_BLINK 1 5
LED 会闪烁一次,然后我的 shell 将返回寄存器 5 的值(这个寄存器只是二进制程序中的一个变量)。
另一种描述我追求的方式,假设如果我有一个寄存器(假设它是一个 16 位值)并且我希望我的程序输出该值,我该如何正确地实现这一点?我可以将变量传递给我的二进制文件(例如指针吗?)并让我的程序写入该值?您能否提供一个示例或教程链接?
2) 与上面类似,如果我有一个寄存器列表(比如 20 个或更多 16 位值),我的二进制文件如何正确输出这些值(可能是指针数组)?
3) 我确信这个过程有一个技术名称。这个“技术上”叫什么(这样我就可以拥有更智能的谷歌搜索条目)?
感谢您的帮助, 詹姆斯
【问题讨论】:
-
一般来说,Unix 从程序返回数据的方式是简单地打印到
stdout。 -
您好,感谢您的回复。哦,哇,所以我可能真的想多了,哈哈。
-
打印到 stdout 或 stderr 是一种选择,但如果您正在编写 C 代码,则可以返回一个值。这就是为什么
main()是类型int而不是void。只需用return(value)结束您的主程序,您就可以返回一个值。通常命令行通常会将此视为退出状态,但您可以随意对待它。您可以在 bash 中使用echo $?访问它。 -
“我可以将输入整数 182 发送到我的二进制文件中……” -- 这不是 “整数”。程序的参数作为字符串传递(在这种情况下是由数字组成的字符串)。顺便说一句,您过度使用和滥用术语 “二进制”;如果您指的是您的程序(或其编译/可执行版本),请写“我的程序”而不是使用模棱两可的实体。