小编use*_*290的帖子

使用 python mmap 强制 32 位访问?

我在 64 位 Arm 处理器上运行 64 位 python。该处理器的 AXI 总线上的一个连接到 FPGA(FPGA 将总线和时钟域更改为 32 位宽总线)。这个硬件不喜欢 64 位访问......

我正在尝试通过 python mmap 访问该 FPGA,如下所示(在一个类中):

def __init__(self, base, len):
    self.base = base
    self.fd = open("/dev/mem", "r+")
    self.lw = mmap.mmap(self.fd.fileno(),
                        len,
                        mmap.MAP_SHARED,
                        mmap.PROT_READ | mmap.PROT_WRITE,
                        offset=base)

def get_U32(self, offset):
    s = self.lw[offset:offset+4]
    return struct.unpack("<I", s)[0]
Run Code Online (Sandbox Code Playgroud)

这个想法是get_U32()从总线读取一个 32 位字(因此偏移量为 offset+4 读取)。遗憾的是,看起来 mmap 无论如何都会执行对总线的 64 位访问(我假设是某种用于性能优化的缓存),然后执行 32 位“转换”。底层FPGA不高兴了……

在C程序中,我简单地写:

data = *((uint32_t *) address);
Run Code Online (Sandbox Code Playgroud)

...并且CPU似乎在其AXI总线上温和地执行32位访问,这是底层硬件更喜欢的...(所以现在,我有一个(缓慢的)解决方法,其中python需要一个C程序来连接硬件,通过管道)

有没有办法强制 64 位 python 执行 32 位访问,就像前面的 C 行显然成功了一样?

这里写的问题是关于读32位的,但是当然,写32位也是需要的......

python mmap 32bit-64bit

5
推荐指数
1
解决办法
1154
查看次数

Qt小部件(带布局)空间.它是什么?怎么删除?

我编写了一个程序,它使用小部件作为容器(用于其他小部件).由于容器的内容随着程序生命周期而变化,因此容器窗口小部件具有与之关联的布局,因此它可以正确调整大小.问题是容器似乎消耗了一些空间.

在下面的程序中,我重现了这个问题:我有一个带有几个标签的组,其中一个包含在一个容器中(小部件w-和它的布局t-包括标签"什么是额外的空间?" ).我的目标是使所有标签之间的间距相同,无论它们是否在容器中.(容器不应占用空间)

我也尝试着色小部件的不同部分.我的填充在哪里?小部件之间的额外空间是什么(蓝色之间).我该如何删除它?

 #include <QApplication>
 #include <QtCore>
 #include <QMainWindow>
 #include <QGroupBox>
 #include <QHBoxLayout>
 #include <QLabel>
 #include <QMdiArea>
 #include <QMdiSubWindow>

 #include <stdlib.h>

 QMdiArea* g1;
 QGroupBox* g1a;

 int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);
    QMainWindow* main_window = new(QMainWindow);
    main_window->resize(200, 200);
    main_window->setWindowTitle("Hello");

    g1a = new QGroupBox("G1A", g1);
    QVBoxLayout *g1a_l = new QVBoxLayout(g1a);
    g1a_l->setSpacing(0);
    main_window->setCentralWidget(g1a);

    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label1"));
    g1a_l->addWidget((QLabel*)new QLabel(" Nice Label2"));
    QWidget* w=new QWidget(0);
    w->setStyleSheet( "border: 2 solid blue; padding: 2 solid yellow;" );
    QVBoxLayout* t=new QVBoxLayout(w);
    t->setSpacing(0);
    t->addWidget(new …
Run Code Online (Sandbox Code Playgroud)

c++ layout qt widget spacing

4
推荐指数
1
解决办法
6152
查看次数

创建一个行为类似于任何变量但在更改/读取时具有回调的类

我想创建一个行为python变量的类,但在更改/读取"变量"时调用一些回调函数.

换句话说,我希望能够如下使用该类:

x=myClass(change_callback, read_callback)
Run Code Online (Sandbox Code Playgroud)

将x定义为myclass的一个实例.构造函数(INIT)将2个函数作为参数:每次x更改时调用的函数,以及每次x"读取"时调用的函数

以下声明:

x=1
Run Code Online (Sandbox Code Playgroud)

将"保存"1并触发change_callback(1)可以执行任何操作的呼叫.

以下声明:

a=x
Run Code Online (Sandbox Code Playgroud)

将检索存储的值并调用read_callback()可能会更改存储的值并执行其他操作.

我希望这适用于任何类型,例如,以便能够编写如下内容:

x=[1 2 3] 哪会触发 change_callback([1 2 3])

x.append(4)会触发change_callback([1 2 3 4])(也可能是read_callback()之前的调用)

x={'a':1} 会触发 change_callback({'a':1})

print(x) 当然,会触发对read_callback()的调用...并返回最后存储的值进行打印.

这个想法是可以记录对变量的任何访问,或者无缝地生成其他计算.

我觉得这应该是可能的,但我并没有真正看到我的对象应该继承的内容......如果我必须将我限制为一种类型,例如列表,是否有任何方法可以重新定义所有赋值运算符(包括"one go"中的append()...等方法,保持原始行为(基类方法)并添加回调...

或者是否有更合适的方法(模块......)来实现相同的目标......?

提前致谢,

python class callback descriptor variable-assignment

4
推荐指数
1
解决办法
1674
查看次数

dlopen()设置errno吗?

一切都在标题中.手册页没有说什么.一些谷歌报告有些人在dlopen之后检查errno,但只是少数并且有各种结果.该函数确实返回成功/非成功值,但应该如何找出失败的原因.

所以dlopen()设置errno?在哪里定义了不同的errno值?如果没有,应该用什么来检查导致失败的原因?

c linux dlopen

0
推荐指数
1
解决办法
777
查看次数