程序员开发实例大全宝库

网站首页 > 编程文章 正文

在IAR中使用C-SPY宏进行调试(iar怎么调用函数)

zazugpt 2024-10-20 16:07:05 编程文章 269 ℃ 0 评论

  C-SPY是IAR Embedded Workbench的调试器,包含一个全面的宏观系统,可让您自动执行调试过程并模拟外围设备。宏可以与复杂断点和中断仿真一起使用,以执行各种任务,例如读取和写入目标存储器或写入主机PC上的文件,复位,字符串操作和JTAG命令。

在本文中,我们将描述宏的基础知识,然后向您展示如何使用宏的示例。

C-SPY宏语言语法

宏语言的语法实际上非常类似于C语言。有:

  • 宏语句,类似于C语句。

  • 宏函数,您可以使用或不使用参数和返回值来定义它们。

  • 预定义的内置系统宏,类似于C库函数,用于执行诸如打开和关闭文件,设置断点以及定义模拟中断等有用任务。

  • 宏变量,可以是全局变量或本地变量,可以在C-SPY表达式中使用。

  • 宏字符串,您可以使用预定义的系统宏来操作它。

使用宏

  可以在特定的时间调用C-SPY宏,或手动或通过断点执行。

安装宏

  设置宏是一个具有预定义名称的宏,该宏在调试的预定义阶段(例如每次目标被重置时)被调用。这些宏可用于在下一步调试之前准备设备,如在下载应用程序软件之前清除或填充内存区域。

  可能有用的一个示例示例是启动过程尚未开发的系统,但您需要具备一些特定数据才能使应用程序正常工作。与其等待开发人员在启动应用程序上工作,以便测试应用程序,只需在加载应用程序之前引入加载内存的宏(可能来自文件)并继续测试,而无需更改要测试的代码。

执行宏

  宏也可以在其他时候执行,无论是手动还是使用断点。该断点可以由另一个宏根据执行该宏时的条件来设置。在调试一个事件驱动系统时,这非常有用,您希望调试一系列嵌套的事件,但希望系统保持运行直到发生这种情况。作为一个例子,你可以有一个系统有两个定时器中断,一个在10s和一个在0.1s。想象一下,你想知道在较慢的事件触发两次之后,更快的事件第一次发生什么情况。您在缓慢事件中设置了一个断点。这个断点调用一个宏来检查它是否第二次被调用。如果是这样,宏在更快的事件中设置断点。

  以下是该宏的一种可能的解决方案。它包含一个作为宏变量的计数器,每次执行慢速计时器时都会递增。一旦该计数器为2,宏将在快速定时器中断处理程序的入口处设置一个代码断点:

SetBreakpoint(){
 if (SlowInterruptCount++ == 2)
 {
 brk = __setCodeBreak("Fast_Interrupt_Handler", 0, "1", "TRUE", ""); 
 } }

如何使用宏的示例

  在调试器会话中使用C-SPY宏之前,必须先注册它。最简单的方法是通过调试器项目选项添加带有C-SPY宏定义的文本文件:

一旦调试器启动,将执行以下设置宏函数,并将消息写入调试日志窗口,调用MySetupMacro并打开要写入的文件:

execUserSetup(){/* Write a message to the debug log */
__message "Debugger started\n";
MySetupMacro();

/* Opens a text file for ASCII writing */
_fileHandle = __openFile("$PROJ_DIR$\\Memory.txt", "w");
}

  您也可以使用此设置宏函数在应用程序实际加载之前执行一些硬件初始化。有些情况下,目标是复位被执行类似的设置宏函数(execUserExit) ,开始执行或停止(execUserStarted /停止),或在调试会话结束(execUserExit)。

  还可以从宏快速启动窗口手动调用C-SPY宏,或者与断点相关联。例如,当您点击代码断点时,您可能想要将某些内存转储到文件中:

WriteMemory2File(){
 __var byte,address,_fileHandle; 
 _fileHandle = __openFile("$PROJ_DIR$\\Memory.txt","w");
 for(address=0x20000000;address<0x2000FFFF;address++)
 {
   byte=__readMemoryByte(address,"Memory");
 __writeFile( _fileHandle,byte);
 }
 __closeFile( _fileHandle );
}

您可以将此宏作为操作表达式添加到代码断点:

  如果您希望目标不在断点处暂停,但在内存转储后立即继续运行,则可以将C-SPY宏调用为Condition而不是Action。

  最后,您可能希望在C-SPY调试器从命令行(CSPYBAT)运行而不是在IAR Embedded Workbench IDE中运行时执行此内存转储。但是,在这种情况下,您如何设置和编辑断点?这完全没有问题,因为C-SPY还提供了系统宏来设置断点:

execUserSetup(){
...
/* __setCodeBreak(location, count, condition, cond_type, action) */
 __setCodeBreak("{myfile.c}.82.1",0,"WriteMemory2File()","TRUE","");
     ...
}

结论

无论您是连接到目标硬件还是模拟您的嵌入式项目,C-SPY宏都提供了一种非常有用且灵活的方式来定制您的调试会话。可能的使用场景包括例如准备用于调试的硬件,在调试或模拟外设和中断时收集各种信息。您可以在IAR Embedded Workbench中的“C-SPY调试指南”中找到可用宏的完整概述。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表