我们有上的数据的缓冲的处理嵌入式系统。该处理是通过中断时的缓冲区填满触发。欲望是测试与模拟输入数据的算法。我们的数据科学小组使用Python和算法是用C开发的,所以我愿意为他们创造一个包装。
问题围绕着指针的缓冲区被传递到算法。
作为一个简单的例子,C函数看起来是这样的:
float FakeCalc( unsigned int *dataBuffer,
float *calcSpace,
int arg1,
float arg2,
int arg3,
int arg4,
int *intermediateResults
);
我创建了一个SWIG接口文件,如下所示:
%module fakeCalc
%include "typemaps.i"
%apply unsigned int * INPUT { unsigned int * dataBuffer };
%apply float * INOUT { float * calcSpace };
%apply int * OUTPUT { int * intermediateResults };
%{
extern float FakeCalc( unsigned int * dataBuffer,
float * calcSpace,
int winAvgSz,
float eleMulSign,
int denomWindNum,
int winSz,
int * intermediateResults
);
%}
extern float FakeCalc( unsigned int * dataBuffer,
float * calcSpace,
int winAvgSz,
float eleMulSign,
int denomWindNum,
int winSz,
int * intermediateResults
);
这将创建接口,所以我想我是好去。
在蟒蛇交给它关闭前一个简单的测试执行看起来是这样的:
#!/usr/bin/python
from numpy import zeros
from array import array
import sys
import fakeCalc
def printHelp():
print "testRun.py dataFile"
# Buffer to pass into method for scratch space
scratchBuf = zeros(10)
# Read in data to pass into method
if len(sys.argv) != 2:
printHelp()
exit()
dataFile = open(sys.argv[1], "r")
dataArr = array("I")
for dataPoint in dataFile:
dataArr.append(int(dataPoint[0:-1]))
# Run calculations
fakeCalc.FakeCalc(dataArr, scratchBuf, 10, 10.5, 10, 10)
几件事情要注意。我不能改变函数的参数,因为它是在几个代码库使用旧代码。缺乏缓冲区大小,而显然不够理想,也被处理时的硬件初始化缓冲区是固定的。
通过calcSpace传入的缓冲器由该算法用作暂存空间,所述intermediateResults含有的一些中间步骤的结果在内部,并且设置DataBuffer只是原始数据和不被改变。
目前,我得到类型错误:在方法“FakeCalc”,类型的参数1“无符号整型”
因此,概括地说了一个问题:是否有可能分配在Python这些缓冲区,并通过成C?
先谢谢您的帮助!
我找到了解决办法。
一个简单的手段来从蟒分配一个缓冲区,并传递它是使用由痛饮提供“carrays”。下面是一个例子:
%module processBuffer
%include "stdint.i"
%include "carrays.i"
%array_class(uint32_t, buffer);
%{
void processBuffer(unsigned int * buffer);
%}
void processBuffer(unsigned int * buffer);
在Python,创建缓冲和传递以如下方式将指针:
#!/usr/bin/python
import processBuffer
buffer = []
for x in range (0, 10):
buffer.append(x)
print buffer
test = processBuffer.buffer(10);
for x in range (0, 10):
test[x] = buffer[x]
processBuffer.processBuffer(test.cast())
到目前为止,这种方法没有任何问题。
对于一些背景对于那些有兴趣,看生成的代码原有的问题变得清晰。在一个指针SWIG通过使单个对象被传递的假设。这样做,是创建的临时对象,以避免类型不兼容。这打破了使用数组。还有更复杂的解决方案,也行创建自定义typemaps,但上述方案要简单得多。