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.

[参考译文] CCS/TMS320C6455:程序计数器(PC)退出同步、跳转至错误的地址

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/611899/ccs-tms320c6455-program-counter-pc-getting-out-of-sync-jumps-to-a-wrong-address

器件型号:TMS320C6455

工具/软件:Code Composer Studio

您好!

我遇到了一个问题、程序计数器跳转到全局变量的地址而不是下一个函数的地址、有人以前是否遇到过此问题?

这是我以前得到的结果  

这就使 Sene 成为了一个合适的功能

这就是我在转到下一行时得到的结果:

 

它适合全局数组

问题出在哪呢? 请帮助!

谢谢、

Keren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果没有有关代码和调试环境的更多详细信息、很难判断可能发生了什么情况或可能出现了什么问题。  
    如果在 CCS 中打开反汇编视图、则可以在 单步执行代码时观察汇编指令。 这可能会让您更深入地了解哪些指令会跳转到错误的地址、并可能帮助您进一步缩小问题范围。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回答。

    其他一些详细信息:

    我保存了一些程序流的屏幕截图、包括堆栈的存储器数据。 我想检查函数返回地址是否已运行、似乎它确实已运行。 但是、我不理解原因。

    我要检查的代码部分包括 send_balbum_window --> PrepareWinHeader --> get_length 函数流。

    首先、进入 send_album_window 并保存该函数的返回地址:

    然后进入 PrepareWinHeader 并 保存该函数的返回地址(我们可以看到 从 SEND_ALBUGER_WINDOW 返回的地址保持不变、位于相同的存储器地址):

    现在、我们刚刚进入 get_length。 该屏幕截图发生在运行之前的一步:

    当退出 PrepareWinHeader 内部的 if-else 时、可以看到用于从 PrepareWinHeader 返回的地址 已运行( send_bed_window 中的返回地址保持不变、位于同一存储器地址):

    之后、分步移动(F10)、我完成该函数并右移到反汇编窗口(现在 、SEND_ALBUG_WINDOW 的返回地址也已更改):

    之后、我得到一个例外:

    我要添加以下代码:

     

    void send_album_window (int ALB_DSP_n)

    int an、thesOffset、queHdrLength;
    Int numOfPixels、DIMEX、DIMEY;
    INT_ALB_Buf;
    int noDebugInfo、i;
    短凸轮;

    DIMEX = DIMEY = 100;
    numOfPixels = DIMEX * DIDY;

    //循环显示窗口数
    对于(AN = 0;AN < ALB_DSP_n;AN++)

    nCam = ALBUGE_WINDOW [AN].nCam - 1;

    if ((nCam =SelvageCameras.CameraForSearchLeftSelvage)||(TwoLinesOneXInterface &&(nCam ==SelvageCameras.CameraForCopyLeftSelvage)))

    //B U G I N F I R S T C A M E R A S H O U L D B F I X E D!!!
    ALB_y0 = ALBUK_WINDOW_[AN].nPositionY[1];
    ALB_y0 |=(ALBUK_WINDOW_AN].nPositionY[0]<<16);
    if ((balbum_window[an].nPositionX >1200)||(ALB_y0 >980)

    if (!(badde_window[an].nDefectFlags & 0x80))

    继续;




    ALB_Buf =(int*) MsgDebugWindow;
    ALB_x0 = ALBUK_WINDOW_[AN].nPositionX;

    如果(ALB_x0 > 1240)

    继续;

    ////// Omer -调试代码、无调试信息问题!!!!
    noDebugInfo = 1;
    对于(I = 0;I < 32;I++)

    if ((alble_window[an].arrayDefects[i].nFactorL!= 0)||(alble_window[an].arrayDefects[i].nFactorH!= 0)||(alble_window[an].arrayDefects[i].nFactorD!= 0))

    noDebugInfo = 0;
    中断;

    IF (noDebugInfo)

    ERR_SendMsg (ERR_CODE_NO_DEBUG_INFO、ERR_FORMAT_DEC、nCam+1、an、1、ALB_DSP_n);

    ALB_y0 = ALBUK_WINDOW_[AN].nPositionY[1];
    ALB_y0 |=(ALBUK_WINDOW_AN].nPositionY[0]<<16);
    ALB_sze = ALBUGE_WINDOW_[AN].nWindowSize;

    queHdrLength = sizeof (strMessAlbomWindow)+ numOfPixels + sizeof (strMessAWPicture);
    QueSetMsgHdr (ALB_Buf、1、1、queHdrLength);
    ALB_Buf +=(sizeof (que_MsgHdr)>>2);

    PrepareWinHeader (An、ALB_Buf、nCam);
    ALB_Buf +=(sizeof (strMessAlbomWindow)>>2);

    SetHdrPicture (ALB_Buf、dimX、dimY);
    ALB_Buf +=(sizeof (strMessAWPicture)>>2);

    SendWindow (AN、ALB_BUf、ALB_sze、theOffset);
    ImageNr++;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    空 PrepareWinHeader (int an、int* ALB_Buf、short nCam)

    Int LMW;
    int ALB_x0_mm、ALB_Y_IN_FRAME;

    //从字段中清除 DFI 编号,以免干扰 PC:
    ALBUK_WINDOW_[AN].nWindowNumber &= 0xFFFF;
    ALB_x0_mm =传输到_mm (ALB_x0、nCam);
    如果(ALB_x0_mm < 0)

    ALB_x0_mm = 0;


    ALBUGK_WINDOW[AN].nPositionX = ALB_x0_MM + CamLeftMM[ALBUGK_WINDOW[AN].nDsp]- CamLeftMM[SelvageCameres.CameraForSearchSelvage];
    if (style_par->m_sDebug_0.nSpare1 = 0x5)

    ERR_SendMsg (ERR_CODE_X_POSITION_DATA、ERR_FORMAT_DEC、LeftCamMM[SelvageCameres.CameraForSearchLeftSelvage]、nCam+1、an、ALB_x0);
    ERR_SendMsg (ERR_CODE_X_POSITION_DATA、ERR_FORMAT_DEC、ALB_x0_mm、CamLeftMM[ALBUGE_WINDOW[AN].nDsp]、ALBUG_WINDOW[AN].nDsp、ALBUG_WINDOW[AN].nPositionX);

    ALBUGK_WINDOW[AN].nPositionX -= TRANSION_TO_MM (CamVarArray[SelvageCamers.CameraForSearchLeftSelvage].AOI_P_LEFT - SELV_INT_LEFT、nCam);

    if (style_par->m_sDebug_0.nSpare1 = 0x5)

    ERR_SendMsg (ERR_CODE_X_POSITION 数据、ERR_FORMAT_DEC、TRANSFORT_TO_MM (CamVarArray[SelvageCamers.CameraSearchForingLeftSelvage].AOI_P_LEFT - SELV_INT_LEFT、nCam)、
    CamVarArray[SelvageCameras.CameraForSearchLeftSelvage].AOI_P_LEFT、SELV_INT_LEFT、ALBUG_WINDOW[AN].nPositionX);

    ALBUK_WINDOW_[AN].nDsp = 0;

    ALBUK_WINDOW_[AN].nStartCCL_Y[0]= xy_res[nCam]>> 4;
    ALBUK_WINDOW_[AN].nStartCCL_Y[1]= xy_res[nCam]>> 4;

    ALB_sze = ALBUGE_WINDOW_[AN].nWindowSize;

    //保护坐标不在框架内:
    ALB_y_in_frame = dist_far_start ((ALB_y0 + 32)、1、nCam);
    ALB_y_in_frame-= 32;

    if (style_par->m_sYRes.nCode!= CAM_LM)

    Hwi_disable();

    mmw = get_length (start_frm_process + ALB_y_in_frame、nCam)+ length_meter + lum_def->camDef[nCam].NY - get_length (512、nCam);

    Hwi_enable();


    其他

    LMW = PlaceDef + INLOE_def->camDef[nCam].NY;

    ALBUK_WINDOW_[AN].nPositionY[0]= LMW >> 16;
    ALBUK_WINDOW_[AN].nPositionY[1]= LMW & 0xFFFF;

    if (style_par->m_sDebug_0.nSpare1 = 0x5)

    ERR_SendMsg (ERR_CODE_Y_POSITION 数据、ERR_FORMAT_DEC、LMW、PlaceDef、(int)(lurn_def->camDef[nCam].NY)、(int) nCam);

    /*
    如果(zoom_flg = 1)

    ALBUK_WINDOW_[an].nWindowSize <<= 1;

    *
    设置 Album_X0_Y0 (nCam);

    ALBUK_WINDOW_[AN].nPixelX0 = ALB_x0 <<2;//向 PC 发送 X0位置
    ALBUK_WINDOW_[AN].nPixelY0 = ALB_Y0 & 0x7f;//向 PC 发送 Y0位置

    memcpy ((unsigned int *) ALB_Buf、(unsigned int*)&badde_window[an]、sizeof (strMessAlbomWindow));

    ////////////////////////////////////////////////////////////////////////////////////////////

    int get_length (int line_n、short nCam)

    int lines _lsb、lines _msb、tot_lngth;
    int part_a、part_b;
    int line_nn;
    int yy_res;

    如果(LINE_n < 0)

    返回0;

    LINE_nn = LINE_n;
    YY_res =(int) xy_res[nCam];
    LINE_lsb = LINE_nn 和0xFFFF;
    part_a =(LINES_lsb * yy_res)>> 14;// 1024:>>10;
    LINE_MSB =(LINE_nn >> 16)& 0xFFFF;
    part_b =(LINES_MSB * yy_res)<<2;// 1024:>>6;
    tot_lngth = part_a + part_b;
    返回 t_lngth;

    /////////////////////////////////////////////////////

    任何帮助都将不胜感激!!

    非常感谢、

    Keren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为我的堆栈损坏是由中断造成的。 我可以看到这个问题在启用硬件中断后立即发生。 当我进入中断内部时、就在中断的入口、存储器被过度写入。 很难理解导致问题的原因、是否有人有工作方法来解决问题?

    非常感谢、
    Keren
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Keren、

    您使用的 CCS 3.3非常旧、不再受支持。 该版本 CCS 附带的编译器工具也很旧、因此如果您发现的问题是由于编译器错误而导致的、那么除了建议您升级到更新的工具之外、我们还可以做很多其他事情。

    话虽如此、如果您认为此问题是由堆栈溢出引起的、这些页面可能有助于为您指明正确的方向以帮助进行调试。

    http://processors.wiki.ti.com/index.php/Stack_and_Heap_size_requirements

    http://processors.wiki.ti.com/index.php/Checking_for_Stack_Overflow