运行环境:pikapython+rtthread,keil5.38,测试目的:串口1接收数据后送去做CRC验证。
运行pikaRTFunctionModule.DEVICE.CRCCheck模块后,总是报硬件错误,跟踪调试发现,经过pika预编译后,args的值总会被莫名改变,请大神赐教。
py代码如下:
num_list = PikaStdData.List()
list1 = PikaStdData.List()
while True:
time_out = pikaRTFunctionModule.INTTIME.timer_check_flag() # 定时2S
if time_out == 1:
time_out = 0
com1_comd = pikaRTFunctionModule.DEVICE.SerialOut('com1',cmd1) #发送串口查询命令
del com1_comd
list1 = pikaRTFunctionModule.DEVICE.SerialIn('com1',13,num_list) # 串口接收,接收数据存到list1列表里边
if len(list1) >0 :
num_list = []
crc_data = pikaRTFunctionModule.DEVICE.CRCCheck(list1) #将list1数据送去做CRC校验
print(crc_data)
if crc_data == list1[-1]+(list1[-2]*256):
print('ok')
thread.mdelay(100)
C程序代码如下:
#ifndef PIKA_MODULE_PIKARTFUNCTIONMODULE_DISABLE
void pikaRTFunctionModule_DEVICE_CRCCheckMethod(PikaObj *self, Args *args){
PikaObj* da = args_getPtr(args, "da"); // 刚进入时,args=0x20004248,args->firstNode =0x20004390
int res = pikaRTFunctionModule_DEVICE_CRCCheck(self, da); // 该条执行结束时,args=0x3aa58503,args->firstNode =0xaaaaaaaa
method_returnInt(args, res); // 出现错误报警 hard fault on thread: main
}
method_typedef(
pikaRTFunctionModule_DEVICE_CRCCheck,
"CRCCheck", "da"
);
当全速运行metho_returnInt(args,res);后,出现报错:
psr: 0x21000000
pc: 0x000201ec
lr: 0x00014d2b
r12: 0x00000003
r03: 0x00000074
r02: 0x0b87d24b
r01: 0x20004494
r00: 0x3aa58503
hard fault on thread: main
根据lr查找程序代码,发现发生错误前入口函数是
PIKA_RES args_pushArg(Args* self, Arg* arg) {
Arg* new_arg = NULL;
if (!arg_isSerialized(arg)) {
new_arg = arg_copy(arg);
arg_deinit(arg);
} else {
new_arg = arg;
}
link_addNode(self, new_arg);
return PIKA_RES_OK; // 发生报错前地址
}
请各位高手指教,该问题是如何导致的,如何排查,多谢。
离线
看起来pikaRTFunctionModule_DEVICE_CRCCheck有可能把内存搞坏了,建议调试时,把pikaRTFunctionModule_DEVICE_CRCCheck的内部操作留空,试试还会不会有这样的现象
离线
看起来pikaRTFunctionModule_DEVICE_CRCCheck有可能把内存搞坏了,建议调试时,把pikaRTFunctionModule_DEVICE_CRCCheck的内部操作留空,试试还会不会有这样的现象
谢谢,问题已经找到,确实出现在pikaRTFunctionModule_DEVICE_CRCCheck里边,是一个数组越界了,没影响到CRC的计算,却影响了皮卡的指针。
另外如何在pikapython里边添加Python库?比如我想实现四字节数据转换成一个int数据,用struct库,那如何去添加这个库?有没有相关例程呢
离线
@耳东陈
struct库目前已经在开发了,还没有完成,完成会作为标准库放出来,暂时的解决方案是自己做一个简易的c模块,例如 bytes2int4(b: bytes) -> int
离线