公司硬體開發,使用全志R16芯片,作業系統是基于Openwrt系統的。
python開發的高效性,但是公司專案代碼過去是用C語言寫的,于是決定將老版代碼編譯成so庫,然后Python來呼叫。
為此特地寫了一套python和c的測驗代碼,驗證一下python呼叫C的可行性。
測驗代碼中:Python會將一些功能函式設定為C語言中的回呼函式,讓C代碼中可以方便呼叫。
步驟:
1,C代碼利用GCC編譯成so檔案;
2,Python利用ctypes庫,呼叫so檔案。
開始運行,在PC(x86架構)上,在Windows和Linux系統中都順利運行了。
結論:代碼沒有語法問題,記憶體、指標的管理都正確
于是我就換成交叉編譯器,將C代碼編譯成Openwrt的ARM內核硬體可以跑的so檔案
然后同樣運行python 代碼,結果只要運行到C語言中呼叫python回呼函式的地方,就會報Segmentation fault.
哪位大神有這方面經驗,還望指點指點。
附上python代碼:
import ctypes
from ctypes import *
def PyCoreCB( a ):
print('CallBack Core - {}'.format(a))
return 5
#-----------------------------------------------
def BeginTry():
ll = ctypes.cdll.LoadLibrary
lib = ll("./PyObjArm.so")
#lib = ll("./PyObj.so")
CMPCORE = CFUNCTYPE(c_int,c_int)
cCoreFunc = CMPCORE(PyCoreCB)
try:
lib.ZExeCB.restype = c_int
lib.ZExeCB( cCoreFunc)
except Exception as e:
print('Error: {}'.format( repr(e) ))
print('---------Print Test--------')
BeginTry()
附上C代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int (*cb_core)(int a);
int ZExeCB( cb_core df )
{
if(df!=NULL)
{
printf("%s","Exec Main CB2 \r\n");
df(2);
}
return 5;
}
uj5u.com熱心網友回復:
https://stackoverflow.com/questions/37953055/segmentation-fault-when-using-ctypes-and-threading轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/173508.html
下一篇:帶哥們,sumo用random.trip生成隨機車流,為啥輸入命令后會變成這樣,而且也沒有生成trip檔案,有沒有帶哥知道啊?
