我有一个包含C函数的DLL,其原型如下:
int c_read_block(uint32 addr, uint32 *buf, uint32 num);
我想用ctypes从Python中调用它.该函数需要一个指向一块内存的指针,它将写入结果.我不知道如何构造和传递这么一块内存.ctypes文档没有多大帮助.
构造一个数组并将其传递给"byref",如下所示:
cresult = (c_ulong * num)() err = self.c_read_block(addr, byref(cresult), num)
给出此错误消息:
ArgumentError: argument 3: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of pointer to c_ulong_Array_2
我想这是因为Python ulong数组与ac uint32数组完全不同.我应该用吗create_char_string
?如果是这样,我如何说服Python将该缓冲区"转换"为LP_c_ulong?
根据维基百科的说法,一个"令人尴尬的并行"问题是很难或根本不需要将问题分成许多并行任务.通常引用光线追踪作为示例,因为原则上每条光线可以并行处理.
显然,一些问题要难以并行化.有些甚至可能是不可能的.我想知道使用什么术语以及这些更难的案例的标准示例是什么.
我可以提出"令人讨厌的顺序"作为可能的名称吗?
parallel-processing concurrency multithreading multicore terminology
首先,我对USB知之甚少,所以如果我的问题出错,请提前道歉.
在USB 2.0中,轮询间隔为0.125ms,因此主机从设备读取某些数据的最佳可能延迟为0.125ms.我希望减少USB 3.0设备的延迟,但我发现很难了解最小延迟是什么.USB 3.0规范称,"USB 2.0样式轮询已被异步通知取代",这意味着0.125ms轮询间隔可能不再是限制.
我找到了一些USB 3.0固态硬盘的基准测试,看起来数据可以在略低于0.125ms的时间内从设备读取,其中包括在主机操作系统和设备的闪存控制器上花费的所有时间.
http://www.guru3d.com/articles_pages/ocz_enyo_usb_3_portable_ssd_review,8.html
有人能告诉我最低延迟是什么吗?理论上的答案很好.答案包括各种版本的Linux和Windows USB堆栈的实际限制将是非常棒的.
为了阻止"告诉我你想要实现的目标"的问题,我正在为我公司设计的ASIC创建调试接口.即PC通过调试加密狗连接到我们的ASIC之一.一个可能的用例是当ASIC硬件仅实现简单断点时实现条件断点.为此,我需要确定何时命中一个简单的断点,评估条件,如果为false则设置处理器再次运行.在条件成立之前,简单断点可能会被击中数百万次.我们可以在FPGA或现成的USB 3.0微控制器上实现调试加密狗.
我发现很难看到我正在研究的内核模式驱动程序的调试输出.
我是司机发展的新手.我正在尝试在Windows XP上调试USB驱动程序.我已经安装了DDK,并构建了我的驱动程序的"检查模式"版本.我已经安装了驱动程序,如果我使用十六进制编辑器来查看我在Windows /驱动程序中的驱动程序的.sys文件,我可以看到我的调试输出字符串的文本.
如果我运行在Visual Studio下使用我的驱动程序的应用程序,我的调试输出不会出现在输出窗口中,因为应用程序自己的调试输出会出现.在网上搜索,我发现许多关于如何显示来自内核的调试输出的不同声明.对于一般的内核调试,人们似乎要么通过NULL调制解调器电缆(Crikey,它是2012)进行远程调试,要么使用虚拟机和虚拟COM端口.为了能够看到调试输出,这两种方法似乎都是大量的工作.还有其他选择吗?
我尝试在"本地"内核调试模式下使用WinDbg,但它没有显示任何内容.它警告我应该启用"/ debug"重新启动Windows.我这样做了,但没有用.
还有其他想法吗?还是我要求不可能的?
我有一个最近的12核Intel CPU(Haswell架构),它有4个内存通道.机器可以并行执行多少次DRAM内存访问?
例如,如果我有一个使用12个线程的程序,这些线程位于紧密循环中,从一个范围太大而无法容纳缓存的随机存储器地址读取单个字节.我希望所有12个线程将花费几乎所有时间等待内存提取.
线程是否必须轮流使用DRAM总线?
注意:假设我使用的是1 GB的VM页面大小,因此没有TLB缓存未命中.
template<typename T>\ncv::Mat_<T> const bilinear_interpolation(cv::Mat_<T> const &src, cv::Size dsize,\n float dx, float dy)\n{\n cv::Mat_<T> dst = dsize.area() == 0 ? cv::Mat_<T>(src.rows * dy, src.cols * dx) :\n cv::Mat_<T>(dsize);\n \n float const x_ratio = static_cast<float>((src.cols - 1)) / dst.cols;\n float const y_ratio = static_cast<float>((src.rows - 1)) / dst.rows;\n for(int row = 0; row != dst.rows; ++row)\n {\n int y = static_cast<int>(row * y_ratio);\n float const y_diff = (row * y_ratio) - y; //distance of the nearest pixel(y axis)\n float const y_diff_2 = …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种编程方式来获取驱动程序的版本号。我想要设备管理器在设备的驱动程序属性中显示的相同数字。
背景:我有一个与一些自定义硬件对话的应用程序。自定义硬件的设备驱动程序在特定版本号之前已存在已知错误。我希望应用程序检查驱动程序版本并警告用户是否需要更新。该应用程序在 Windows XP 和 7 上运行,并用 C++ 编写。
我之前使用的方法是直接从 system32/drivers 读取 .sys 文件并直接搜索“FileVersion”。出于多种原因,这很糟糕。特别是它似乎需要 Windows 7 上的管理员权限。
我知道类 GUID 和硬件 ID(即“USB\VID_1234&PID_5678”)。
应用程序当前使用SetupDiGetClassDevs、SetupDiEnumDeviceInterfaces 和SetupDiGetDeviceInterfaceDetail 来获取“DevicePath”。然后,它使用该路径调用 CreateFile 来与驱动程序对话。
看起来我需要从某个地方获取 SP_DRVINFO_DATA 结构。我尝试了 setupapi.h 中的各种函数,例如 SetupDiGetDeviceInterfaceDetail。这是我尝试过但失败的一些代码:
int main(void)
{
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_USBSPI, NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
SP_INTERFACE_DEVICE_DATA InterfaceDeviceData;
InterfaceDeviceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
// Cycle through all devices.
for (int i = 0; i < 32; i++)
{
if (!SetupDiEnumDeviceInterfaces(DeviceInfoSet, 0, (LPGUID)&GUID_DEVINTERFACE_USBSPI, i, &InterfaceDeviceData))
break;
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
DWORD RequiredSize;
SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, &InterfaceDeviceData, NULL, 0, &RequiredSize, …
Run Code Online (Sandbox Code Playgroud) 我对在Windows和Linux上用C或C ++实现音频编辑器感兴趣。我无法弄清楚如何在完全缩小的视图中足够快地显示波形。我不是在寻找有关快速帧缓冲技术的信息。这是关于有效确定显示内容的算法和数据结构的问题。
假设我希望能够编辑2小时长的5通道,48 KHz,24位声音。这是5 GB的样本数据。我希望能够一直缩小到每个样本一个像素,直到一次可以看到所有样本数据。我希望应用程序即使在速度较慢的计算机上也能感觉到响应,例如,出于论证的原因,它是1 GHz Atom。当我说“响应”时,我希望GUI更新通常在用户输入的1/30秒之内进行。
天真的实现将在确定要完全缩小的视图呈现什么内容时扫描整个波形中的每个样本-它需要找到显示的每个像素宽度“覆盖”的所有样本的最大和最小样本值。我写了一个简单的应用程序来测试这种方法的速度。我在2015年的3.5 GHz Xeon上测试了一个1小时长的单声道16位44.1 KHz样本。花费0.12秒。这太慢了数百倍。
您可以想象维护一个缩小数据的缓存,但是我看不出如何避免在大多数插入或删除操作后必须重新计算整个缓存。感觉必须有更好的方法。
这是显示我想要实现的图:
这就是大多数当前可用的音频编辑器中的显示方式。用户可能会期望这种行为。我使用Audacity进行了测试,并且它以这种方式工作(尽管它也以较浅的颜色显示了样本均值)。它可以立即处理大型声音中的任意插入内容。我不会阅读75 MB的源代码来了解它是如何做到的。
编辑:
各种各样的人提出了一些方案,这些方案在显示缩小视图时只考虑样本的子集。我得出的结论是,我不想这样做,因为它会丢失太多有用的信息。例如,如果您要寻找声音中的毛刺(例如单击黑胶转换中的声音),则包括所有样本非常重要。在最坏的情况下,如果毛刺只有一个样本长,我仍然希望保证它可以在完全缩小的视图中显示。
我正在制作一个程序,它以固定的间隔向服务器发送UDP数据包,如下所示:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
Run Code Online (Sandbox Code Playgroud)
然而,由于send
是阻塞呼叫(例如,当fixedInterval
是20ms,并且呼叫send
是> 20ms),因此不能保证周期性.你知道我怎么能把它send
变成一个非阻塞的操作吗?
我有一个四端口 Intel 1G 网卡。我正在使用 DPDK 在一个物理端口上发送数据并在另一个物理端口上接收数据。
我在 DPDK 代码中看到了一些示例,但无法使其工作。如果有人知道如何做到这一点,请给我发送简单的说明,以便我可以遵循和理解。我为大页面正确设置我的电脑,加载驱动程序,并分配网络端口以使用 dpdk 驱动程序等...我可以从 DPDK 运行 helloworld,所以系统设置对我来说看起来没问题。
提前致谢。温度5556
我试图以编程方式获取驱动程序的版本号.似乎是通过使用SetupDiEnumDriverInfo
获取SP_DRVINFO_DATA
结构并检查它来完成的DriverVersion field
.
以下代码有效,但为同一驱动程序返回两个不同的版本.我的设备是一个自定义USB设备,带有一个.sys文件.我的机器只连接了一台设备.我指定DIGCF_PRESENT
只查询当前连接的设备的驱动程序.
int main(void)
{
// Get the "device info set" for our driver GUID
HDEVINFO devInfoSet = SetupDiGetClassDevs(
&GUID_DEVINTERFACE_USBSPI, NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
// Cycle through all devices currently present
for (int i = 0; ; i++)
{
// Get the device info for this device
SP_DEVINFO_DATA devInfo;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiEnumDeviceInfo(devInfoSet, i, &devInfo))
break;
// Build a list of driver info items that we will retrieve below …
Run Code Online (Sandbox Code Playgroud) 我一直在通过C/C++阅读Windows的书.在第215页的第8章中,作者比较了各种同步机制的性能.我发现互斥量表现不佳.当4个线程同时运行时,它会花费超过23秒来进行互斥锁同步.
为什么Win32互斥锁如此耗时?我们什么时候可以使用互斥锁?
PS:我在GitHub上发布了测试代码:https://gist.github.com/985198
谢谢你的回复.
非阻塞套接字是我们调用fcntl()方法并将O_NONBLOCK标志与其关联的套接字.任何人都可以告诉我将普通TCP_IP套接字转换为非阻塞套接字还需要什么?
如果非阻塞套接字可以与Windows服务器一起使用,可能会出现什么问题?