我在 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位也是需要的......
我编写了一个程序,它使用小部件作为容器(用于其他小部件).由于容器的内容随着程序生命周期而变化,因此容器窗口小部件具有与之关联的布局,因此它可以正确调整大小.问题是容器似乎消耗了一些空间.
在下面的程序中,我重现了这个问题:我有一个带有几个标签的组,其中一个包含在一个容器中(小部件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) 我想创建一个行为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()...等方法,保持原始行为(基类方法)并添加回调...
或者是否有更合适的方法(模块......)来实现相同的目标......?
提前致谢,
一切都在标题中.手册页没有说什么.一些谷歌报告有些人在dlopen之后检查errno,但只是少数并且有各种结果.该函数确实返回成功/非成功值,但应该如何找出失败的原因.
所以dlopen()设置errno?在哪里定义了不同的errno值?如果没有,应该用什么来检查导致失败的原因?