基于SYS/BIOS的C6678工程中的数组某一行值跳变如图所示:
该数组变量是动态分配的二维数组,起始地址为0x80000C58。在运行工程过程中,有时这个数组的nav_rover_raw[7]这整个一行出现了跳变。这种问题很难去从程序上调试,因为当单步调试的时候它基本上不会出错。实际上这个数组经过两次赋值,根据目前的情况可以判断是在两次赋值之后才发生跳变。请问一下TI专家,这种情况的Bug有什么好的建议?(CCS版本:CCS5.5)
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
基于SYS/BIOS的C6678工程中的数组某一行值跳变如图所示:
该数组变量是动态分配的二维数组,起始地址为0x80000C58。在运行工程过程中,有时这个数组的nav_rover_raw[7]这整个一行出现了跳变。这种问题很难去从程序上调试,因为当单步调试的时候它基本上不会出错。实际上这个数组经过两次赋值,根据目前的情况可以判断是在两次赋值之后才发生跳变。请问一下TI专家,这种情况的Bug有什么好的建议?(CCS版本:CCS5.5)
具体问题描述如下:
//将函数gnss_attitude_epoch_solution中形参nav_base_epoch[15][25]、nav_rover_epoch[15][25]、obs_base_epoch[8][7]、obs_rover_epoch[6][7]数据来源数组
void gnss_attitude_epoch_solution(double epoch_week,double epoch_seconds,double nav_base_epoch[][25],double nav_rover_epoch[][25],int nav_count,double obs_base_epoch[][7],double obs_base_count,double obs_rover_epoch[][7],int obs_rover_count,double pos_base_epoch[],double heading_base_epoch[])
{
//进入这个函数nav_base_epoch[15][25]、nav_rover_epoch[15][25]、obs_base_epoch[8][7]、obs_rover_epoch[6][7]正确无误
//nav_count = 15;obs_base_count=8;obs_rover_count=6;
//动态分配与形参nav_base_epoch[15][25]、nav_rover_epoch[15][25]、obs_base_epoch[8][7]、obs_rover_epoch[6][7]相同维数的二维数组nav_base_epoch_1[15][25]、nav_rover_epoch_1[15][25]、obs_base_epoch_1[8][7]、obs_rover_epoch_1[6][7]
nav_base_epoch_1 = (double **)malloc(sizeof(double *)*nav_count);
nav_base_epoch_1[0] = (double *)malloc(sizeof(double)*nav_count*25);
for(i = 1 ; i < nav_count;i++)
{
nav_base_epoch_1[i] = nav_base_epoch_1[i - 1] + 25;
}
nav_rover_epoch_1 = (double **)malloc(sizeof(double *)*nav_count);
nav_rover_epoch_1[0] = (double *)malloc(sizeof(double)*nav_count*25);
for(i = 1 ; i < nav_count;i++)
{
nav_rover_epoch_1[i] = nav_rover_epoch_1[i - 1] + 25;
}
obs_base_epoch_1 = (double **)malloc(sizeof(double *)*obs_base_count);
obs_base_epoch_1[0] = (double *)malloc(sizeof(double)*obs_base_count*7);
for(i = 1 ; i < obs_base_count;i++)
{
obs_base_epoch_1[i] = obs_base_epoch_1[i - 1] + 7;
}
obs_rover_epoch_1 = (double **)malloc(sizeof(double *)*obs_rover_count);
obs_rover_epoch_1[0] = (double *)malloc(sizeof(double)*obs_rover_count*7);
for(i = 1 ; i < obs_rover_count;i++)
{
obs_rover_epoch_1[i] = obs_rover_epoch_1[i - 1] + 7;
}
//将形参nav_base_epoch[15][25]、nav_rover_epoch[15][25]、obs_base_epoch[8][7]、obs_rover_epoch[6][7]的值全部对应的赋给动态分配的数组
for(i = 0 ; i < nav_count;i++)
{
for(j = 0 ; j < 25 ; j++)
{
nav_base_epoch_1[i][j] = nav_base_epoch[i][j];
nav_rover_epoch_1[i][j] = nav_rover_epoch[i][j];
}
}
for(i = 0 ; i < obs_base_count;i++)
{
for(j = 0 ; j < 7;j++)
{
obs_base_epoch_1[i][j] = obs_base_epoch[i][j];
}
}
for(i = 0 ; i < obs_rover_count;i++)
{
for(j = 0 ; j < 7;j++)
{
obs_rover_epoch_1[i][j] = obs_rover_epoch[i][j];
}
}
time = epoch_seconds;//time = 275868;
//修改nav_base_epoch_1[15][25]、nav_rover_epoch_1[15][25]、obs_base_epoch_1[8][7]、obs_rover_epoch_1[6][7]每行的前两列
for(i = 0;i < nav_count ; i++)
{
nav_base_epoch_1[i][0] = time;
nav_base_epoch_1[i][1] = 1;
nav_rover_epoch_1[i][0] = time;
nav_rover_epoch_1[i][1] = 2;
}
for(i = 0;i < obs_base_count ; i++)
{
obs_base_epoch_1[i][0] = time;
obs_base_epoch_1[i][1] = 1;
}
for(i = 0;i < obs_rover_count;i++)
{
obs_rover_epoch_1[i][0] = time;
obs_rover_epoch_1[i][1] = 2;
}
//到这一步,DSP都很准确,没有任何问题,也没有出现值的跳变
//这里执行F5进入进入attitude_solution函数后nav_rover_epoch_1[7]这一行的值发生跳变,而且每次跳变的值都一样,变成了e-190级别的数字
attitude_solution(time,nav_base_epoch_1,nav_count,obs_base_epoch_1,obs_base_count,nav_rover_epoch_1,obs_rover_epoch_1,obs_rover_count,&yaw_raw,&pitch_raw,&yaw_raw_one,&pitch_raw_one);
}
我用的EVM板,这些函数都是放在MSMCSRAM中,那些数据都是被动态分配,在heap中。cfg文件配置如下:
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams = new HeapMem.Params();
heapMemParams.size = 0x400000 + 0x100000 + 0x100000 + 0x100000 + 0x100000 + 0x40000 + 0x50000;
heapMemParams.sectionName = "systemHeap";
Program.global.heap0 = HeapMem.create(heapMemParams);
/* This is the default memory heap. */
Memory.defaultHeapInstance = Program.global.heap0;
Program.sectMap["sharedL2"] = "DDR3";
Program.sectMap["systemHeap"] = "DDR3";
Program.sectMap[".sysmem"] = "DDR3";
Program.sectMap[".args"] = {loadSegment:"L2SRAM",loadAlign:8};
Program.sectMap[".far"] = "DDR3";
Program.sectMap[".rodata"] = "L2SRAM";
Program.sectMap[".neardata"] = "L2SRAM";
Program.sectMap[".init_array"] = "DDR3";
Program.sectMap[".cppi"] = {loadSegment: "L2SRAM", loadAlign:16};
Program.sectMap[".qmss"] = {loadSegment: "L2SRAM", loadAlign:16};
Program.sectMap[".cinit"] = "MSMCSRAM";
Program.sectMap[".bss"] = "L2SRAM";
Program.sectMap[".const"] = "MSMCSRAM";
Program.sectMap[".text"] = "MSMCSRAM";
Program.sectMap[".code"] = "L2SRAM";
Program.sectMap[".switch"] = "L2SRAM";
Program.sectMap[".data"] = "L2SRAM";
Program.sectMap[".fardata"] = "L2SRAM";
Program.sectMap[".cio"] = {loadSegment:"L2SRAM",loadAlign:8};
Program.sectMap[".vecs"] = "DDR3";
Program.sectMap["platform_lib"] = "DDR3";
Program.sectMap[".far:taskStackSection"] = "L2SRAM";
Program.sectMap[".stack"] = "L2SRAM";
Program.sectMap[".nimu_eth_ll2"] = "L2SRAM";
Program.sectMap[".resmgr_memregion"] = {loadSegment: "L2SRAM", loadAlign:128}; /* QMSS descriptors region */
Program.sectMap[".resmgr_handles"] = {loadSegment: "L2SRAM", loadAlign:16}; /* CPPI/QMSS/PA Handles */
Program.sectMap[".resmgr_pa"] = {loadSegment: "L2SRAM", loadAlign:8}; /* PA Memory */
Program.sectMap[".far:IMAGEDATA"] = {loadSegment: "L2SRAM", loadAlign: 8};
Program.sectMap[".far:NDK_OBJMEM"] = {loadSegment: "MSMCSRAM", loadAlign: 8};
Program.sectMap[".far:NDK_PACKETMEM"] = {loadSegment: "MSMCSRAM", loadAlign: 128};