python - struct.pack 的任何替代品?

标签 python cpu-registers

我正在尝试编写一个 python 程序来从/向硬件读取和写入寄存器。我的读写很好,但我的写不起作用。我认为问题出在我执行 struct.pack 时。你们谁能告诉我为什么。如果您可以分享是否有更好的方法通过设备描述符写入寄存器,那将是很棒的。我已经尝试过(ctypes)并且我更喜欢使用 native python 代码来进行读/写。谢谢你的时间..

#!/usr/bin/python
import os
from struct import *
from fcntl import *


SIOCDEVPRIVATE = 35312
NF10_IOCTL_CMD_READ_STAT = SIOCDEVPRIVATE + 0
NF10_IOCTL_CMD_WRITE_REG = SIOCDEVPRIVATE + 1
NF10_IOCTL_CMD_READ_REG = SIOCDEVPRIVATE + 2

addr= '0x7d400000'
value= '0x1234'
# Function for writing

f = open("/dev/nf10", "w")
arg = (int(addr, 16) << 32) + int(value, 16)
arg = pack("q",arg)
ioctl(f, NF10_IOCTL_CMD_WRITE_REG, arg)
f.close()

# Function for reading
f = open("/dev/nf10", "r+")
arg = pack("q",int(addr, 16))
value = ioctl(f, NF10_IOCTL_CMD_READ_REG, arg)
value = unpack("q", value)
value = value[0]
value = hex(value & int("0xffffffff", 16))
print value
f.close()

最佳答案

使用 struct.pack('q') 看起来有点危险,因为实际结构 (netfpga_register_t) 有两个 32 位字段,所以 pack('II') 会更合适。

此外,在 netfpga_register_t 中,字段按以下顺序排列:reg_id 和 reg_val。如果平台是 little-endian,您的值将进入前 4 个字节,而不是最后一个。使用 struct.pack('II', addr, value) 的另一个好理由。

关于python - struct.pack 的任何替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17475975/

相关文章:

c - AVR-C : USB connection can be detected successfully, 不是 USB 断开连接

c - ppc64 的汇编代码

linux - 在 ARM Linux 中记录 CPU 寄存器更改

python - 直接从 CPU 读取 TEMPERATURE_TARGET

c - AT&T 汇编中的算术运算(添加内存和寄存器)

python - 在 Python 中使用某些文本抓取 HTML 表格

python - 我如何编写一个 SQLAlchemy 查询来返回图中某个节点的所有后代?

python - 如何使 Pyre-check 库与 numpy 一起工作?

c++ - 来自内置类型的 python 转换器

python - 访问值 boto3 字典响应