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/MSP430FR2355:使用调试初始化脚本中的 dis430.exe 工具?

Guru**** 2952510 points

Other Parts Discussed in Thread: CCSTUDIO

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/960931/ccs-msp430fr2355-use-dis430-exe-tool-from-a-debug-initialization-script

器件型号:MSP430FR2355
Thread 中讨论的其他器件:CCStudio

工具/软件:Code Composer Studio

您好!  

是否可以调用 调试初始化脚本中 C:\ti\ccs1000\ccs\tools\compiler\ti-cgt-smsp430_20.2.0.LTS \bin 中的反汇编工具(dis430.exe)?  

在 调试初始化脚本中、您会遇到类似> dis430.exe myprogram.out > disassembly.txt 的情况吗?  

我目前使用初始化脚本中的命令保存程序二进制文件。 请参见下面的

debugSession.memory.SaveData (page_program、0x8000、"C:\\Users\\Blake\\VHD_MEMORY_JS\\hex_output.txt"、0x800、IOMEMORY_HEX、false);

这将生成以下输出保存到满足我目前需求的文本文件中。  

1651 1 8000 0 800 0
0x4031
0x3000
0x40B2
0x5A80
0x01CC
0x4014

我最近从一个论坛帖子中发现了 dis430.exe 工具、该工具为我的目的提供了更具描述性和实用性的输出。 请参阅下面的 POST 和输出。 感谢你的帮助。  

ASM_AddrMode4_symboline.out 的反汇编:

文本段.text、0x20字节、位于0x00008000
008000:复位:
008000:3140 MOV.W #0x3000、SP
008002:0030
008004:StopWDT:
008004:B240 MOV.W #0x5a80、&WDTCTL_L
008006:805A
008008:cc01
00800a:主要:
00800a:1440 MOV.W Const1、R4
00800c:F49F
00800e:8044 MOV.W R4、VAR1
008010:F49F
008012:1540 MOV.W Const2、R5

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

       

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

    您好、Blake、

    [引用 user="Blake Stanger">是否需要 在调试初始化脚本中使用 dis430.exe myprogram.out > disassembly.txt 之类的内容?  [/报价]

    我假设您希望通过 DSS 脚本调用 dis430.exe 可执行文件。 如果是这样,这确实是可能的。 请参阅:

    https://e2e.ti.com/support/tools/ccs/f/81/t/210657

    谢谢

    Ki

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

    您好 Ki、

    感谢您一如既往的帮助。 这看起来正是我想要做的。 您能再多帮助一下语法吗? 我按照您链接中的说明进行了操作、但未能取得任何进展。 当我使用您建议的添加内容运行脚本时、不会发生任何情况。  

    这是我的脚本中的相关代码。 如果需要、我还附加了整个文件。   

    load("./0407.Runtimejava.js");

    RET_VALUE = RT.RunSynch ("CD C:\\Users\\Blake\\VHD_MEMORY_JS");
    RET_VALUE = RT.RunSynch ("dis430.exe ASM_AddrMode4_symbolic.out>disasm_addrMode4_symbolic.txt");

    我只想完成两件事情、即将当前工作目录更改为我的文件的位置、然后在文件上运行 dis430.exe、如下所示。  

    下面是完整的 DDS 脚本


    //将 DSS 软件包导入我们的命名空间,以便在键入时保存
    importPackage (Packages.com.ti.debug.engine.scripting)
    importPackage (Packages.com.ti.ccstudio.scripting.environment)
    importPackage (Packages.java.lang)
    importPackage (Packages.java.io.*)
    load("./0407.Runtimejava.js");

    //创建我们的脚本环境对象-这是任何脚本和的主要入口点
    //创建其他可脚本化程序和会话的工厂
    VAR 脚本= ScriptingEnvironment.instance ()

    //在当前目录中创建日志文件以记录脚本执行
    script.traceBegin ("test_scriptTestLog.xml"、"DefaultStylesheet.xsl")
    script.traceBegin ("real_testscript.xml")
    //记录所有内容
    script.traceSetConsoleLevel (TraceLevel.all)
    script.traceSetFileLevel (TraceLevel。所有)

    //获取调试服务器并启动调试会话
    debugServer = script.getServer ("DebugServer.1")

    //将配置设置为 NewTargetConfiguration
    debugServer.setConfig("./NewTargetConfiguration.ccxml");

    debugServer.setConfig("C:/Users/blake/ti/CCSTargetConfigurations/NewTargetConfiguration.ccxml");
    debugSession=debugServer.openSession()


    debugSession.target.connect();

    //设置超时
    script.setScriptTimeout(15000)

    //加载程序
    //(ScriptingEnvironment 具有一个工作文件夹的概念以及所有需要的 API
    //路径名作为参数,您可以传递相对路径或绝对路径)

    //创建一个新的运行时,从命令行调用 dis430.exe
    VAR RT =新运行时();

    // cmd 启动命令行,
    RET_VALUE = RT.RunSynch ("cmd CD C:\\Users\\Blake\\VHD_MEMORY_JS");
    RET_VALUE = RT.RunSynch ("dis430.exe ASM_AddrMode4_symbolic.out>disasm_addrMode4_symbolic.txt");

    ////////// 库尔特将.out 文件放在这里
    debugSession.memory.loadProgram ("ASM_AddrMode4_symbolic.out");//C:\\Users\Blake\\workspace_v10\\ASM_AddrMode4_symbolic\\Debug\\Debug

    //debugSession.memory.loadProgram ("C:\\Users\Blake\\VHD_MEMORY_JS\\work_input.out");

    //SaveData //Coulter 将 hex.output.txt 放在这里
    debugSession.memory.SaveData (page_program、0x8000、"C:\\Users\\Blake\\VHD_MEMORY_JS\\hex_output.txt"、0x800、IOMEMORY_HEX、false);


    /var commandToRun ="C:\\ti\\ccs1000\\ccs\\tools\compiler\\ti-cgt-smsp430_20.2.0.LTS \\bin\\dis430.exe asm_AddrMode4_symbolicone.out>ds_output.txt "
    //oShell.ShellExecute (commandToRun,);
    //debugSession.memory.SaveData (page_program、0x8000、"C:\\users\\Blake\\VHD_MEMORY_JS\\hex_output.txt"、0x800、IOMEMORY_HEX、false);


    var start_memory_dec = 32768;
    VAR 为_IT_FIRST = 0;
    //Coulter 将 VHD 存储器放在这里
    VAR FW = new java.io.FileWriter ("C:\\Users\\Blake\\VHD_MEMORY_JS\\program_memory.vhd");
    var writer = new java.io.BufferedWriter (FW);

    writer.write ("library IEEE;\n");
    writer.write ("use IEEE-std_logic_1164.all;\n");
    writer.write (“使用 IEEE.numeral_std.all;\n");
    writer.write ("\n");
    writer.write ("\n");
    writer.write ("entity program_memory is\n");
    writer.write ("端口(clock\t:in\tstd_logic;\n");
    writer.write ("\t mAB\t\t\t:in\tstd_logic_vector (15下载到0);\n");
    writer.write ("\t MDB_in \t:out\tstd_logic_vector (15下载到0);\n");
    writer.write ("\t MDB_out \t:in\tstd_logic_vector (15下载到0);\n");
    writer.write ("\t write\t:in\tstd_logic);\n");
    writer.write ("end entity;\n");
    writer.write ("\n");
    writer.write ("program_memory 的 architure program_memory_arch"为\n");
    writer.write ("\n");
    writer.write ("type rom_type 是 std_logic_vector 的数组(32768至65535)(7减至0);--这是 MAB:x8000至 xFFFFFFF\n");
    writer.write ("\n");
    writer.write("constant ROM:rom_type :=(");

    // var dict ={
    // 4031:
    //}


    VAR FR = new java.io.FileReader ("C:\\users\\Blake\\VHD_MEMORY_JS\\hex_output.txt");
    VAR Reader = new java.io.BufferedReader (FR);
    var line = reader.readline();

    while (line!= null){
    if (line.compareTo("0xFFFF")!= 0){
    //writer.write (line +"\n");
    //writer.write ("compare FFFF results =");
    //writer.write ((line.compareTo("0xFFFF")!= 0)+"\n"\};

    开关(IT_FIRST){

    //忽略第一行
    情况0:
    //writer.write ("忽略! "+行);
    为_IT_FIRST = 1;
    中断;

    //特殊情况第一行需要唯一的间距
    案例1:
    // writer.write ("第一行!"+line+"\n");
    // writer.write (line.charAt(0));
    // writer.write (line.charAt(1));
    // writer.write (line.charAt(2));
    // writer.write (line.charAt(3));
    // writer.write (line.charAt(4));
    // writer.write (line.charAt(5));

    为_IT_FIRST = 2;
    Line = line.replace ("\n"、"");
    writer.write (start_memory_dec +"=> x"+"\");
    writer.write (line.charAt(4));
    writer.write (line.charAt(5));
    writer.write ("\"+"、"+"\n");

    start_memory_dec++;

    writer.write("");

    writer.write (start_memory_dec +"=> x\");
    writer.write (line.charAt(2));
    writer.write (line.charAt(3));
    writer.write ("\");
    writer.write ('、');
    writer.write ('\n');

    start_memory_dec++;
    中断;

    //所有其他情况都属于此类别。
    案例2:
    //writer.write ("第二行! "+行);
    Line = line.replace ("\n"、"");

    writer.write("");
    writer.write (start_memory_dec +"=> x\");
    writer.write (line.charAt(4));
    writer.write (line.charAt(5));
    writer.write ("\"+"、"+"\n");

    start_memory_dec++;
    writer.write("");
    writer.write (start_memory_dec +"=> x\");
    writer.write (line.charAt(2));
    writer.write (line.charAt(3));
    writer.write ("\"+"、"+"\n");

    start_memory_dec++;

    中断;

    默认值:
    抛出新的 IllegalStateException ("意外值:"+ is_it_first);

    }
    Line = reader.readline();
    }否则中断;


    }

    writer.write("--IRQ Vectors\n");
    writer.write (" 65534 => x\"00\",--重置向量= xFFFE:xFFFFFFFFF\n");
    writer.write (" 65535 => x\"80\",--启动值= X8000\n");
    writer.write ("\n");
    writer.write (" others => x\"00\");\t\n");
    writer.write ("\n");
    writer.write("信号 EN:std_logic;\n");
    writer.write ("\n");
    writer.write (" begin\n");
    writer.write("--注1:总线系统使用16位地址(MAB)\n");
    writer.write("--此地址大小可以访问 x0000到 xFFFFF\n");
    writer.write("--但我们的数组只能从 X8000到 xFFFF 和\n");
    writer.write("--如果我们尝试使用任何其他地址访问它,它将崩溃。\n");
    writer.write("--所以 我们首先需要做的是创建一个本地启用项,\n");
    writer.write("--仅当 MAB 在 X8000到 xFFFF 范围内时才会生效。\n");
    writer.write("\n");
    writer.write(" local_EN:进程(MAB)\n");
    writer.write (" begin\n");
    writer.write (" if ((TO_integer (unsigned (MAB))>= 32768)和(TO_integer (unsigned (MAB))<= 65535))则\n");
    writer.write (" EN <='1';\n");
    writer.write (" else \n");
    writer.write (" EN <='0';\n");
    writer.write (" end if;\n");
    writer.write("结束进程;\n");
    writer.write ("\n");
    writer.write ("\n");
    writer.write("--注2:总线系统使用16位地址(MAB)\n");
    writer.write ("-- MDB_OUT 也作为16位字提供\n");
    writer.write("--但是,内存阵列实际上是作为8位字节构建的。\n");
    writer.write ("--因此对于给定的16位 MAB,我们给出 MDB_OUT = HB:lb\n");
    writer.write("--or =rom(MAB);1): rom(MAB)\n");
    writer.write ("\n");
    writer.write(" memory_rom:进程(时钟)\n");
    writer.write (" begin\n");
    writer.write (" if (rising_edge (clock)) then \n");
    writer.write (" if (EN='1'和 write='0') then \n");
    writer.write (" MDB_in <= ROM (TO_INTEGER (UNSIGNAL (MAB)));1)& ROM (TO_INTEGER (UNSIGNAL (MAB)));\n");
    writer.write (" end if;\n");
    writer.write (" end if;\n");
    writer.write("结束进程;\n");
    writer.write ("\n");
    writer.write ("\n");
    writer.write ("end architecture;");
    //

    writer.flush();
    writer.close();
    reader.close();


    //}catch (IOException e){
    //
    // e.printStackTrace();

    //停止记录并退出。
    script.traceEnd()

    函数 addHex (C1、C2){
    VAR hexStr =(parseInt (C1、16)+ parseInt (C2、16)).toString (16);
    while (hexStr.length < 6){hexStr ='0'+ hexStr;}//零焊盘。
    返回 hexStr;
    }

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

    [引用 user="Blake Stanger"] ret_value = RT.RunSynch ("CD C:\\Users\\Blake\\VHD_MEMORY_JS");[/引用]

    这实际上不会产生任何影响。 这是因为您没有真正更改脚本的当前工作目录。 没有一种简单的方法来实现这一点。

    因此、对于:

    [引用 USER="Blake Stanger"] ret_value = RT.RunSynch ("dis430.exe ASM_AddrMode4_symbolicone.out>disasm_addrMode4_symbolic.txt");[/引用]

    如果 exe 和 Out 文件与脚本不在同一目录中,则需要将绝对路径传递给所有文件。 此外、调用前面带有"cmd /c"的命令

    例如:

    RET_VALUE = RT.RunSynch ("cmd /c:/path/dis430.exe C:/path/Asm_AddrMode4_Symbolic.out > c:/path/disAsm_addrMode4_Symbolic.txt);

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

    Ki、

    感谢您的患者详细解释、他们总是非常有帮助。

    我作出了建议的更改,但没有效果。 当我在此脚本中指定了其他绝对文件路径时、我必须使用\\而不是/  

    我已经尝试了这两种方法(见下文)、并从 C:\ti\ccs1000\ccs\tools\compiler\ti-cgt-smsp430_20.2.0.LTS \bin 执行命令、我怀疑在这里调用了 DSS 脚本。 非常感谢您提供的任何帮助。  

    RET_VALUE = RT.RunSynch (" cmd /c C:/Users/blake/VHD_MEMORY_JS/dis430.exe C:/Users/blake/VHD_MEMORY_JS/Asm_AddrMode4_Symbolic.out > C:/Users/blake/VHD_MEMORY_JS/dis_Asm_addrMode4_Symbolic.txt)


    RET_VALUE = RT.RunSynch ("cmd \c C:Users\\Blake\\VHD_MEMORY_JS\\dis430.exe C:\\Users\\Blake\\VHD_MEMORY_JS\\ASM_AddrMode4_symbolic.out > C:\\Users\\Blake\\VHD_MEMORY_JS_JS\\ASM_Addr4_MODET.out > C:\\VHD_ADDRESD\\VDE_ADDR_4_diK_4)

    我相信您已经知道这一点、但我的成功衡量标准如下。 我需要与此命令提示符命令相同的脚本行为。   

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

    [引用 user="Blake Stanger"] ret_value = rt.RunSynch (" cmd /c C:/Users/blake/VHD_MEMORY_JS/dis430.exe C:/Users/blake/VHD_MEMORY_JS/Asm_AddrMode4_Symbolic.out > C:/Users/blake/VHD_MEMORY_JS/dis_Asm_addrMode4_Symbolic.txt)

    以上语法对我来说是正确的。 我看不到它有任何问题。  

    我创建了一个如下所示的简单脚本:

    //将 DSS 软件包导入我们的命名空间,以便在键入时保存
    load("Runtimejava.js");

    //创建一个新的运行时,从命令行调用 dis430.exe
    VAR RT =新运行时();

    // cmd 启动命令行,
    RET_VALUE = rt.runSynch("cmd /c C:/ti/ccs1011/ccs/tools/compiler/ti-cgt-msp430_20.2.1.LTS/bin/dis430.exe C:/Temp/runsynchtest/files/2013.out > C:/Temp/runsynchtest/dis.txt);

    当我运行它时、它会创建如下所示的文本文件(已附加)

    /cfs-file/__key/communityserver-discussions-components-files/81/dis.txt

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

    Ki、  

    这解决了问题! 我还发现我需要将绝对文件路径与一起使用  

    load("Runtimejava.js");

    更改为  

    load ("C:/PATH/RuntimeJava.js);

    感谢您的所有帮助!

    Blake

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

    是的、如果 include js 文件与主脚本不在同一目录中、则需要该完整路径

    很高兴听到一切都在正常工作。

    Ki