工具/软件:Code Composer Studio
您好!
我遇到了一个问题、程序计数器跳转到全局变量的地址而不是下一个函数的地址、有人以前是否遇到过此问题?
这是我以前得到的结果
这就使 Sene 成为了一个合适的功能
这就是我在转到下一行时得到的结果:
它适合全局数组
问题出在哪呢? 请帮助!
谢谢、
Keren
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.
工具/软件:Code Composer Studio
您好!
我遇到了一个问题、程序计数器跳转到全局变量的地址而不是下一个函数的地址、有人以前是否遇到过此问题?
这是我以前得到的结果
这就使 Sene 成为了一个合适的功能
这就是我在转到下一行时得到的结果:
它适合全局数组
问题出在哪呢? 请帮助!
谢谢、
Keren
您好!
感谢您的回答。
其他一些详细信息:
我保存了一些程序流的屏幕截图、包括堆栈的存储器数据。 我想检查函数返回地址是否已运行、似乎它确实已运行。 但是、我不理解原因。
我要检查的代码部分包括 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、
您使用的 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