【问题标题】:any replacement for struct.pack?struct.pack 的任何替代品?
【发布时间】:2013-07-02 19:04:40
【问题描述】:

我正在尝试编写一个 python 程序来读写硬件中的寄存器。我的阅读写得很好,但我的写作不起作用。我认为问题出在我执行 struct.pack 时。你们谁能告诉我为什么。如果有更好的方法通过设备描述符写入寄存器,如果您可以分享,那将是非常棒的。我已经尝试过(ctypes)并且我更喜欢使用本机 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()

【问题讨论】:

  • 这不是您之前提出的问题的重复:stackoverflow.com/q/17426932/1980029?如果是这样,最好用更多信息编辑现有问题,而不是打开一个新问题。
  • 这不是同一个。在这里我不调用函数,而是想知道是否有 struct.pack 的替代方案,如果没有,其他替代方案是什么。
  • addr= '0x7d400000' .. int(addr, 16) -- 你可以简单地将 0x7d400000 写成 python 中的整数常量 - 无需创建字符串并解析它
  • 什么是arg?它应该是什么?
  • 你可能想试试 Cython;或cffi.readthedocs.org.

标签: python cpu-registers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多