TI中文支持网
TI专业的中文技术问题搜集分享网站

基于SYS/BIOS的C6678工程中的数组某一行的值发生跳变的问题

基于SYS/BIOS的C6678工程中的数组某一行值跳变如图所示:

该数组变量是动态分配的二维数组,起始地址为0x80000C58。在运行工程过程中,有时这个数组的nav_rover_raw[7]这整个一行出现了跳变。这种问题很难去从程序上调试,因为当单步调试的时候它基本上不会出错。实际上这个数组经过两次赋值,根据目前的情况可以判断是在两次赋值之后才发生跳变。请问一下TI专家,这种情况的Bug有什么好的建议?(CCS版本:CCS5.5)

noaming:

你好,单步时,不会出错;而全速运行时,数值会发生跳变?

能具体表述一下这个错误吗,是什么程序

Gangping Li:

回复 noaming:

具体问题描述如下:

//将函数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);}

noaming:

回复 Gangping Li:

执行F5进入进入attitude_solution函数后nav_rover_epoch_1[7]这一行的值发生跳变,

对执行attitude_solution()产生了影响,

导致最后结果出现错误,对吗

Gangping Li:

回复 noaming:

因为要在attitude_solution()函数内部要用到nav_rover_epoch_1数组的值,所以肯定对结果产生了影响。因为后期要做实时系统肯定需要所有的都稳定。但是有时候nav_rover_epoch_1数组的值是正确的,没有发生跳变。请问一下Titan您遇到了这个问题吗?,还有就是我觉得我那种动态分配二维数组是不是会有bug么?关于我这种情况,您有什么好的建议么?谢谢您!

noaming:

回复 Gangping Li:

您好,不用这么客气,我们不做工程,这种情况很少遇到。但这种只在全速运行时的数值跳变还是很奇怪的现象,你使用的EVM板,还是自己制作的板子。数据都可以放在芯片内的L2 RAM中做测试吗?

Gangping Li:

回复 noaming:

我用的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};

赞(0)
未经允许不得转载:TI中文支持网 » 基于SYS/BIOS的C6678工程中的数组某一行的值发生跳变的问题
分享到: 更多 (0)