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/TMS320VC5501:断开 DSS loadProgram() args 传递

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/673091/ccs-tms320vc5501-broken-dss-loadprogram-args-passing

器件型号:TMS320VC5501

工具/软件:Code Composer Studio

您好!

loadProgram()不能正确填充.args 段,因为它缺少*argv 的双字指针对齐。

以下是用于 main()的原型:

int main (int argc、char ** argv) 

此代码是使用--args=0x200生成的。

调试器从 Scripting Console 启动:

args=["foo"、"bar"];ccxmlFile=" /C5501_NoSDRAM.ccxml";app=" /test.out";core=".*";ds.setConfig(ccxmlFile);mySession=ds.openSession(core);mySession.target.connect();mySession.memory.loadProgram(app、args); 

argc 正确,但*argv 在预期位置之前加载一个字:

0x005A30 _c_args
0x005A30 0002 0000 5A37 0000 5A3B 0000 0066 006F 006F 0000 0062 0061 0072 0000

C:\ti\ccsv8\tools\compiler\c5500_4.4.1.1\lib\rtssrc.zip\args_main.c:_args_main()预计 argc 位于0x005A30 (正确)、而* argv 位于0x005A32:

typedef 结构{int argc;char * argv[1];}args;
extern args __c_args__;

extern int main (int argc、char * argv[]);

#define no_C_args (unsigned long)-1)

extern void _tdeh_init ();

_107 _args_ma_dig_main
()

寄存器 args *pargs =(args*)_symval (__c_args__);
#pragma diag_default 1107
寄存器 int argc = 0;
寄存器 char ** argv = 0;

/*--------------- 对于
那些支持表驱动异常处理的目标, //
//*在 main()准备之前在此处初始化全局数据结构 对于
第一个异常,特别是来自 new()的异常。 */
//*----------------------------------------------------------------------------------------------------- //
#if defined (__TI_table_drived_exceptions)
__tdeh_init();
#endif

如果(_symval (&_c_args__)!= no_C_args)
{ argc = pargs->argc;argv = pargs->argv;}

返回 main (argc、argv);
}

但是,loadProgram()在0x005A31处填充*argv,因此 main()获得指向0x5A370000而不是预期的0x00005A37的无效 argv[0]。 此外,argv[0]等指针必须位于双字对齐的地址,以便"MOV dbl (*AR3)、XAR3"等指令可以正常工作,因此无法通过从 main()中黑客入侵 argv 值或使 args 结构打包在 cargs.h 中来解决此问题 因此,问题实际上发生在 loadProgram()中。 如果不依赖 argv[argc]为 NULL、则以下变通办法有效:

memmove (argv、(void *)((uint32_t) argv - 1)、argc * sizeof (* argv)); 

是否有强制 loadProgram()正常工作的方法?

此致、
Benoît μ A

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

    您好!

    我执行了如下快速测试:

    我看到 argc 和 argv 的值都有问题。 如果我了解 argc、argv 的工作方式、那么:

    argc 应为"3"

    argv[0]应为"55.out"

    argv[1]应为"foo"

    argv[2]应为"bar"

    因此、在 argc、argv 支持方面、loadProgram 的工作方式似乎存在问题。 我相信我记得过去曾报告过这样一个问题。 我正在尝试找到该信息。

    Ki

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

    您好!

    这与您在这里观察到的问题不同。 实际上,loadProgram()执行低级 argv 赋值,将参数原样传递给 main()。 因此、如果您希望 argv[0]为"55.out"、则必须将 args 自身设置为["55.out"、"foo"、"bar"]。 为了自动填充"55.out"、可以在更高级别使用 loadti (即使它不是从同一上下文调用的脚本)。

    我看到您不会遇到我的问题、因为您的指针仅为16位宽、而我的指针为32位宽(仅使用24位)。 这是因为您使用的是小型内存模型。 为了解决我的问题、您必须使用大内存或大内存模型。 请参阅项目属性中的--memory_model={huge | large | small}。

    此致、
    Benoît μ A

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的澄清。 切换存储器模型实现了这一目的。 我为此问题提交了一个错误。 跟踪 ID:CCDSK-3115