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
您好!
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
您好!
这与您在这里观察到的问题不同。 实际上,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