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.

[参考译文] 编译器/IWR6843:编译器为何将相同的堆栈地址分配给任务中的两个临时变量

Guru**** 2569935 points
Other Parts Discussed in Thread: IWR6843, MATHLIB

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/873148/compiler-iwr6843-why-compiler-allocate-same-stack-address-to-two-temporary-variable-in-a-task

器件型号:IWR6843
主题中讨论的其他器件: MATHLIB

工具/软件:TI C/C++编译器

你好、冠军、
   我正在 IWR6843内的 R4F 上调试一个程序。 工具版本为 TI v18.1.3.LTS 编译器和 SYS BIOS 6.73.01.01。 我正在使用 CCS 8.2.0。
我发现代码始终输入断言、其条件根本不应发生。 当我检查堆栈中的变量时、我发现一些异常变量值会导致异常。 变量窗口为附加的快照。 我无法理解为什么两个变量 udPtIdx 和 udTgtIdx 始终位于堆栈地址0x0800586C 中。 这些变量不是相互引用的、因此它们应该相互独立。 我检查了代码逻辑、但找不到任何问题。 堆栈不溢出。  
 您能提供一些意见吗? 此文件的生成控制台输出如下所示:

"C:\\ccs_8_2\\ccsv8\\utils\\bin\\gmake"-k -j 8 all -O
 
rm -f"C:/Users/a0286234/workspace_v8/3D_people_count_68xx_mss/3D_people_count_68xx_demo.bin "
Makefile:206:目标"预编译"的配方失败
Process_begin:CreateProcess (NULL、rm -f C:/Users/a0286234/workspace_v8/3D_people_count_68xx_mss/3D_people_count_68xx_demo.bin、...) 失败。
 
gmaking[1]:[预编译]错误2 (忽略)
 
编译文件:"c:/ti/mmwave_industrial_toolbox_4_1_0/labs/people_counting/68xx_3D_people_counting/src/mss/mss_main.c
调用:ARM 编译器
"c:/ccs_8_2/ccsv8/tools/compiler/ti-cgt-cgt-arm_18.1.3.sps/bin/armcl"-mv7R4 --code_state=16 --float_support=VFPv3D16 -me /Users/a0286234/workspace_v8/3D_people_count_68xx_mss -include_path="ccs_cn_cn/spr-ctrlsdore-ctrack=/Users/a0286234/workspace_v8/3D_people_count_68xx_mss/common -ctrack_cs_include_ctrack_track_track_include"-/Users/a0286234/workspace_v8/3D_people_count_68xx_mss/mss /ti/mmwave_sdk_03_03_00_03/packages -ctrackn_sv-ctrackn_sv-ctrack_code.c /ti/mmwave_sdk_03_03_00_03/packages/ti/demo/utils:/ti/dsplib_c64Px_3_4_0_0/packages/ti/dsplib/src/DSP_fft32x32/c64P -ccs_include_ctrack_trackn_sv-ctrack_include"-ctrack_track_trackn_sine-ctrack_track_include"--ctrackn_sine_be.c /ti/mathlib_c674x_3_1_2_1/packages:ctrackn_sefine-ctrack_ctrack_ctrack_code.c:-ccs_ccs_code.c:-ccs_code.c:cn=ccs_ccs_cs_track_ctrack_/ti/mmwave_industrial_toolbox_4_1_0/labs /ti/dsplib_c64Px_3_4_0_0/packages/ti/dsplib/src/DSP_fft16x16_imre/c64P /ti/dsplib_c64Px_3_4_0_0/packages <'C:/ti/mmwave_industrial_toolbox_4_1_0/labs/people_counting/68xx_3D_people_counting/src/common/pcount3D_hwres.h'>'-g -gcc --diag_warning=225 --diag_wrap=off --display_error_number --gen_func_subsections=on --enum_type=int --abi=eabi --obj_extension=.oer4f --predirectory_with_compile --preMSS_dependency="opt/proc-proc/proc-proc-proc/proc/proc-proc-proc-prob_file.d"/ti/mmwave_industrial_toolbox_4_1_0/labs/people_counting/68xx_3D_people_counting/src/mss/mss_main.c
"C:/ti/mmwave_industrial_toolbox_4_1_0/labs/people_counting/68xx_3D_people_counting/src/mss/mss_main.c "、第1197行:警告#515-D:无法将类型为"float *"的值分配给类型为"PNCnt3DDemo_PointCloud_笛 卡尔坐标*"的实体
"C:/ti/mmwave_industrial_toolbox_4_1_0/labs/people_counting/68xx_3D_people_counting/src/mss/mss_main.c、第1883行:警告#225-D:隐式声明的函数"gtrack_球 形2笛卡尔坐标"
完工:"c:/ti/mmwave_industrial_toolbox_4_1_0/labs/people_counting/68xx_3D_people_counting/src/mss/mss_main.c
 
构建目标:"3D_peoer_count_68xx_MSS.xer4f"

谢谢、
Adam

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

    如果变量不相互干扰、优化器可能会执行此操作:

    一个哑铃示例:

    for (int i=0;i<100;i++)/*执行某些操作*/;

    for (int j=0;i<100;j++)/*执行其他操作*/;

    I 和 j 可以在堆栈上共享相同的位置。

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

    当局部变量不同时处于活动状态时、它们可能共享寄存器或存储器位置。  相对于存储器位置、这种行为对于寄存器更常见。  在您显示的屏幕截图中、寄存器 R0在4个局部变量之间共享。

    [引用 user="Adam Yao94020"]我发现代码始终输入断言,其条件根本不应发生。

    我不知道是什么导致了这个问题。 但它不太可能与这些变量相关、它们在堆栈上共享一个位置。  要检查的一件事... 确保在使用所有局部变量之前对其进行初始化。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

       明白了。

    非常感谢、
    Adam