记录一下自己再从k66将代码移植到TC264遇到的一些问题。
图像错位问题
问题描述
用的是逐飞的库函数,采集图像的大小为120*188,但是车子运行的时候会出现图像错位的情况,最后发现是TC264的dma-list的问题(个人推测),应该是dma的目标地址多改变或者少改变了一次,即原本为搬运到了 mt9v03x_image[0][0]的数据被错误的搬运到了mt9v03x_image[60][0]最终导致采集回来的图像出现错位的情况。(下图为图像错位的示例)
解决方法
在逐飞科技的康哥的建议下,将原图像采集的数据大小改小,使其传输次数小于16384,这样就可以采用一次dma进行传输而不是用dma_list功能。
字节对齐相关问题
问题描述
在使用sd卡记录小车运行的图像以及数据时,传回上位机又发现了错位的问题还有指针操作可能会溢出的问题,但是用k66对以保存图像数据的sd卡进行传输进行却没有问题,所以将目光转移到了串口传输的问题上,经过一次次排查发现串口功能正常,再观察是否为自己写的串口dma的问题,发现也不是。所有有很长一段时间都是用TC264来运行代码,用一块K66来传输存储的图像,这种方法还是有利有弊的。
//传输结构体的示例
typedef struct
{
uint8 Verific[5];
uint8 Pixels_width;
uint8 Pixels_height;
uint8 Coefficient_Num;
uint8 Parameter_Num;
uint8 Data_Con[50*4*2];
uint8 Par_Con[1*8];
My_LCR Lcr[70];
uint8 Pixels[1629];
#endif
}My_Data_Type;
这个问题卡了很长的时间,有一次偶然想到是不是字节对齐的问题,于是通过sizeof获取My_Data_Type结构体的实际大小,发现与预计的字节数有一定的误差,但K66上运行发现两者是相同的,所以在K66结构体内部为单字节对齐(内存分布为连续的),而相同的结构体在TC264上却不是,所以导致一部分为内存为空,指针遍历的时候会出现栈溢出的问题。(这一段讲的可能有问题,欢迎斧正)。
关于更多字节对齐的问题可以参考其他的文章。
解决方法
由于对字节对齐的理解不够深刻,所以只能通过改变传输协议来实现指针的正确遍历,最后成功实现图像的传输,代码基本移植完毕。