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.

AWR1642BOOST: 在mmwave sdk中编写并调用自己的函数,运行出错。

Part Number: AWR1642BOOST


我在mmwave sdk中原有的函数中创建一个局部变量并使用,或新建一个函数(仅返回一个整形值),都可以。但是,我把自己的代码放在函数uint32_t range_cfar(const uint16_t inp[], uint16_t out[], uint32_t len);中,然后注释掉mmwavelib_cfarCadB_SOGO(const uint16_t inp[restrict],uint16_t out[restrict], uint32_t len,uint16_t cfartype,uint32_t const1, uint32_t const2,uint32_t guardLen, uint32_t noiseLen)中原有的代码,并调用range_cfar函数。目的是用自己的函数替换函数原来的功能。但是运行却出错了。如下图:

左图是执行mmwavelib_cfarCadB_SOGO函数原有代码时的正常情况,右图是替换后运行出错的一些变量的状态。在调用range_cfar函数前,我先将Inp中的值赋值给selfinp数组,然后调用 range_cfar(selfinp, selfout, len),之后再把selfout数组中的值赋值给out。

出于一些原因, range_cfar函数也调用了自己编写的在同一个文件中的其他函数,逻辑上应该没有问题,之前在matlab上仿真是正常的。但不知道这对在AWR1642BOOST上运行有没有影响。

不知道问题出在哪了,请大佬指教!

  • 我把自己的代码放在函数uint32_t range_cfar(const uint16_t inp[], uint16_t out[], uint32_t len);中

    请问具体是什么代码?有没有尝试逐一添加,看添加哪些代码的时候出错了?

  • 我在一个函数中定义了一个数组,我发现这个数组的长度为6时运行是正常的,但是长度设为12时运行就出错了(前6个元素与后6个元素值相同)。但编译时也没提示内存不够。请问这可能是什么原因?

  • 看一下.map文件内存分配情况,如果内存不够的,各个Section段需要做调整。

  • 是.cmd文件吗?我没找.map文件。在例程和C:\ti\mmwave_sdk_02_00_00_04\packages\ti文件夹下有多个文件夹都有.cmd文件,应该调整哪些呢?

  • ccs打开工程,应该能看到工程里用了哪个cmd文件。

    map文件可以到工程属性->Build->C6000 Linker->Basic Optiions->--map_file,m

  • 我在debug文件夹下找到了map文件,找到了

    MEMORY CONFIGURATION

    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    PAGE 0:
    L2SRAM_UMAP1 007e0000 00020000 0001e1e0 00001e20 RWIX
    L2SRAM_UMAP0 00800000 00060000 00010fed 0004f013 RWIX
    L1PSRAM 00e00000 00004000 00000000 00004000 RWIX
    L1DSRAM 00f00000 00004000 00004000 00000000 RWIX
    L3SRAM 20000000 000c0000 00000680 000bf980 RWIX
    HSRAM 21080000 00008000 00008000 00000000 RWIX

    PAGE 1:
    L3SRAM 20000000 000c0000 000c0000 00000000 RWIX

    然后我增加了L1DSRAM、HSRAM和L3SRAM的length,但重新运行后,再次打开map文件,发现L1DSRAM、HSRAM和L3SRAM已使用的空间并没有变化。

    在代码中,我调用了下面这个函数,(函数中其他代码已经全部注释,不会影响运行)

    double isClutter_AC(uint16_t exp_noise[], uint32_t N, uint32_t *numJump){
    double VI = 0; 
    // double selfT[]={9, 198, 61.633, 36, 26.5479, 21.8495,
    // 19.0932, 17.2982, 16.043, 15.1189, 14.4114, 13.8532,
    // 13.4019, 13.0298, 12.7177,12.4525,12.2242,12.0258,
    // 11.8518, 11.6979, 11.5608, 11.4380, 11.3274, 11.2272};
    double selfT[]={11.8518};
    VI=selfT[0];
    return VI;
    }

    如果用第二个selfT,则程序正常运行。但用第一个,console会多两行提示:

    Debug: Frames are already stopped [21]
    Debug: MMWDemoDSS Data Path stop succeeded stop0,frames:0

    我没有找到任何关于这两行提示的资料,请问这是什么情况?

  • 能否发一个测试工程给我们?

  • 可以,但这个回复插入不了文件,只能插入文件的代码。我把修改的文件发给你吧,我修改的文件地址是C:\ti\mmwave_sdk_02_00_00_04\packages\ti\alg\mmwavelib\src\detection\mmwavelib_cfarca_sogo.c。我测试的例程是mmwave_automotive_toolbox_3_0_0\labs\lab0006_nonos_oob_16xx。

    uint32_t mmwavelib_cfarCadB_SOGO(const uint16_t inp[restrict],
                                uint16_t out[restrict], uint32_t len,
                                uint16_t cfartype,
                                uint32_t const1, uint32_t const2,
                                uint32_t guardLen, uint32_t noiseLen)
    {
         uint32_t i, outIdx;
         uint16_t selfinp[300],selfout[300];
         for(i=0;i<len;i++){
             selfinp[i]=inp[i];
         }
         outIdx = range_cfar(selfinp, selfout, len);
         for(i=0;i<outIdx;i++){
             out[i]=selfout[i];
         }
         return (outIdx);
    
    }  /* mmwavelib_cfarCadB_SOGO */
    
    /*
     * ���ܣ��ھ���ά�Ͻ���CFAR����wrap
     * ������inp����������
     *       out���������
     *       len���������鳤��
     *       guardlen��������Ԫ����
     *       noiselen���ο���Ԫ����
     *       cfar��ʹ�õ�CFAR�����1ΪMS-CFAR��2ΪAC-CFAR
     * ����ֵ���������ĸ�������⵽Ŀ��ķ�ֵ�ĸ�����
     */
    uint32_t range_cfar(const uint16_t inp[], uint16_t out[], uint32_t len)
    {
        uint32_t guardLen=4;
        uint32_t noiseLen=12;
        uint32_t cfar=1;
        uint32_t outIdx;
        uint32_t idxCUT, idxleft, idxright;
        uint16_t exp_noise[24];
        uint32_t isTarget;
    
        //��ʼ��
        outIdx = 0U;
        idxCUT = guardLen + noiseLen;//16
        idxleft = 0;
        idxright = noiseLen + 2 * guardLen + 1;//21
    
        //0 ~ len-guardLen-noiseLen-1
        for(; idxCUT < len - guardLen - noiseLen; idxCUT++){
            uint32_t j = 0;
            for(; j < noiseLen; j++){
                exp_noise[j] = inp[idxleft + j];//������ര��
                exp_noise[noiseLen + j] = inp[idxright + j];//�����Ҳര��
            }
            if(cfar==1){
                isTarget = MS_CFAR(inp[idxCUT], exp_noise, 2*noiseLen);
            }else if(cfar==2){
                ;
            }
            if (isTarget == 1){  //��Ŀ��
                out[outIdx] = (uint16_t)idxCUT;
                outIdx++;
            }
            idxleft++;
            idxright++;
        }
        return outIdx;
    }
    /*
     * ���ܣ������Ծ�㵽���һ���ο���Ԫ�ı���ָ��
     * ������exp_noise���ο���Ԫ����
     *       len:�ο���Ԫ����
     *       T:��ֵ����
     * ����ֵ������ָ��VI
     */
    double isClutter_MS(uint16_t exp_noise[], uint32_t len){
        uint32_t numJump = 0; //��Ծ��
        double VI = 0;         //����ָ��
        uint32_t y = 0;         //��ǰ�ο���Ԫ֮ǰ���Ӳο����IJ���ֵ֮��
        double yall = 0;
        uint32_t a = 0,b = 0;     //�ӽ�Ծ�㿪ʼ���Ӳο����IJ���ֵ��ƽ���ͣ��Լ�����ֵ֮��
        //double selfT[]={9999, 198, 61.633, 36, 26.5479, 21.8495, 19.0932, 17.2982, 16.0430, 15.1189, 14.4114, 13.8532, 13.4019, 13.0298, 12.7177, 12.4525, 12.2242, 12.0258, 11.8518, 11.6979, 11.5608, 11.4380, 11.3274, 11.2272};
        double selfT[]={19.0932, 17.2982, 16.0430, 15.1189, 14.4114, 13.8532};
        uint32_t j=0;
        //�����Ծ���λ��
        for(j=0; j<len-1; j++){
            y = y + exp_noise[j];
            yall = selfT[j] * (y / (j+1));
            if((double)exp_noise[j+1] >= yall){
                numJump = j + 1;
                break;
            }
        }
        //����ӽ�Ծ�㿪ʼ���Ӳο�����VI
        uint32_t i;
        if(numJump > 0){
            for(i=numJump; i<len; i++){
                a = a + exp_noise[i] * exp_noise[i];
                b = b + exp_noise[i];
            }
            VI = ((len-numJump+1)*a) / (b*b);
        }
        return VI;
    }
    
    /*
     * ���ܣ���MS-CFAR�ж�CUT���Ƿ���Ŀ��
     * ������cut�����ⵥԪ
     *       exp_noise���ο���Ԫ����
     *       len���ο���Ԫ����
     *       T����ֵ����
     * ����ֵ��1Ϊ��Ŀ�꣬0Ϊû��Ŀ��
     */
    uint32_t MS_CFAR(uint16_t cut, uint16_t exp_noise[], uint32_t len)
    {
        //MS-CFAR����
        double alpha = 0.5;
        double beta = 1.2;
        double TVI = 4.8;
        uint32_t NTI = 7;
    
        uint32_t n = len / 2;
        uint32_t suma = 0, sumb = 0;
        uint32_t sa = 0, sb = 0; //A,B�Ӳο�����С��CUT*alpha�IJο���Ԫ�ļ���
        uint32_t na = 0, nb = 0; //A,B�Ӳο�����С��CUT*alpha�IJο���Ԫ�ĸ���
    
        double VI = 0;
        double TD = 0;                //MS-CFAR�������
        uint32_t isTarget=0;       //���ⵥԪ�Ƿ����Ŀ��
    
        //��ȡ�Ӳο���A��С��CUT*alpha�IJο���Ԫ�ļ��Ϻ͸���
        uint32_t index = 0;
        for(; index < n; index++){
            suma = suma + exp_noise[index];
            if(exp_noise[index] < alpha * cut){
                sa = sa + exp_noise[index];
                na++;
            }
        }
        //��ȡ�Ӳο���B��С��CUT*alpha�IJο���Ԫ�ļ��Ϻ͸���
        for(; index < len; index++){
            sumb = sumb + exp_noise[index];
            if(exp_noise[index] < alpha * cut){
                sb = sb + exp_noise[index];
                nb++;
            }
        }
        //ѡ����ʵIJο���Ԫ������������
        if(na<=NTI && nb<=NTI){
            TD = (double)(beta * ((suma +sumb) / len));
        }else if(na>NTI && nb>NTI){
            TD = (double)(beta * ((sa + sb) / (na + nb)));
        }else if(na<=NTI && nb>NTI){
            VI = isClutter_MS(exp_noise,len);
            if(VI < TVI){
                TD = (double)(beta * (suma / n));
            }else{
                TD = (double)(beta * ((sa + sb) / (na + nb)));
            }
        }else{
            VI = isClutter_MS(exp_noise,len);
            if(VI < TVI){
                TD = (double)(beta * sumb / n);
            }else{
                TD = (double)(beta * (sa + sb) / (na + nb));
            }
        }
        //��ֵ1Ϊ��Ŀ�꣬��ֵ0Ϊ��Ŀ��
        if(cut > TD){
            isTarget = 1;
        }else{
            isTarget = 0;
        }
        return isTarget;
    }

  • 请看下面e2e工程师的回复。

    The debug message "Debug: Frames are already stopped [21]" is generated when the sensor is already stopped and the API "MmwaveLink_sensorStop()" is called.

    See

    C:\ti\mmwave_sdk_02_00_00_04\packages\ti\control\mmwavelink\test\common\link_test.c

    Customer needs to further debug to understand why the sensorStop command is called two times.

    I don't think this is related to CFAR algorithm

  • 收到,我再调试找找原因

  • 好的,后续这个问题没解决的话,可以回复这个帖子。

  • 在mmWave_Demo_Visualizer 2.1.0里提示“DSS Frame Processing Deadline Miss Exception.”这可能是哪些原因导致的?

    我将上面代码中87行处的代码改为

    if((double)exp_noise[j+1] >= yall){
    numJump = 0;
    break;
    }

    numJump = 0;和break;注释掉就可以正常运行,但取消注释就会出现这个问题。令人不解的是numJump 的初值就是0(在75行),这个if语句对整个程序没有影响才对。似乎这个if语句块中无法放入任何代码。

  • 这是新问题么?

    新问题的话,麻烦另起新帖,方便其他客户参考,谢谢!

  • 不是新问题

  • 还是关于selfT的问题?