首页 > 编程语言 >通过Python+CRemoteAPI控制Trace32进行调试

通过Python+CRemoteAPI控制Trace32进行调试

时间:2023-03-16 17:57:19浏览次数:38  
标签:Python T32EXTERN void CRemoteAPI char int Trace32 T32 uint32

关键词:Python、C Remote API、Trace32等等。

当需要对Trace32调试进行自动化,或者提高效率时,可以通过Remote Control API进行。

基本的调试流程如下:

Python、C等语言可以通过调用C Remote API库文件,和Trace32 PowerView基于Socket通信,进行Trace32调试工作。模拟了Trace32 PowerView下的操作。

1 配置Trace32支持Socket Remote Control

1. 修改C:\T32\config.t32文件,增加两个空白行。

2. 在Trace32 Start中找到一个连接,选择PowerView Instance->Advanced Settings->Interfaces->API Port->Use Port选择Yes。

3. 在T32的temp指定目录里,查看T32_xxxxxx.t32,出现了API访问相关配置:

参考《API for Remote Control and JTAG Access》的Preparing Trace32 Software。

2 Remote Control API

2.1 API内容

API包含两个C文件,一个头文件:

  • hlinknet.c-处理跟Trace32调试软件的Socket接口工作。
  • hremote.c-API接口函数的实现。
  • t32.h-API文件件。

2.2 编写基于Remote Control API接口的C程序

包含头文件t32.h,将库连接到可执行文件中即可。

如果需要记录API函数调用轨迹,在编译时需要打开ENABLE_APILOG,增加

-DENABLE_APILOG

在运行时,增加环境变量:

set T32APILOGFILE=C:\temp\t32apilog.txt

则会将调用函数轨迹输出到log文件中。

更多参考:C:\T32\demo\api\capi\test。

2.3 API列表

t32.h中包含了所有API函数:

T32EXTERN int  T32_Errno;
T32EXTERN int  T32_Config(const char *String1, const char *String2);
T32EXTERN int  T32_Init(void);
T32EXTERN int  T32_Attach(int DeviceSpecifier);
T32EXTERN int  T32_Terminate(int ShellReturnValue);
T32EXTERN int  T32_Exit(void);
T32EXTERN int  T32_Ping(void);
T32EXTERN int  T32_Nop(void);
T32EXTERN int  T32_NopEx(int length, int options);
T32EXTERN int  T32_NopFail(void);
T32EXTERN int  T32_Cmd(const char *Command);
T32EXTERN int  T32_Cmd_f(const char *command, ...) ATTRIBUTE_PRINTF(1, 2);
T32EXTERN int  T32_CmdWin(uint32_t WindowHandle, const char *Command);
T32EXTERN int  T32_Printf(const char *str, ...) ATTRIBUTE_PRINTF(1, 2);
T32EXTERN int  T32_Stop(void);
T32EXTERN int  T32_GetPracticeState(int *pPracticeState);
T32EXTERN int  T32_EvalGet(uint32_t *pEvaluationResult);
T32EXTERN int  T32_EvalGetString(char *EvaluationString);
T32EXTERN int  T32_GetMessage(char *AreaMessage, uint16_t *pMessageType);
T32EXTERN int  T32_GetTriggerMessage(char *TriggerMessage);
T32EXTERN int  T32_GetChannelSize(void);
T32EXTERN void T32_GetChannelDefaults(void *ParametersOut);
T32EXTERN void T32_SetChannel(void *ParametersIn);
T32EXTERN int  T32_APILock(int nTimeoutMS);                                                                                               /* preliminary*/
T32EXTERN int  T32_APIUnlock(void);
T32EXTERN int  T32_GetApiRevision(uint32_t* pRevNum);
T32EXTERN void T32_GetSocketHandle(int *t32soc);

T32EXTERN int  T32_Go(void);
T32EXTERN int  T32_Break(void);
T32EXTERN int  T32_Step(void);
T32EXTERN int  T32_StepMode(int Mode);
T32EXTERN int  T32_ResetCPU(void);
T32EXTERN int  T32_SetMode(int Mode);
T32EXTERN int  T32_GetCpuInfo(char **pCPUString, uint16_t *pFPUType, uint16_t *pEndianess, uint16_t *pReserved);
T32EXTERN int  T32_GetState(int *pSystemState);
T32EXTERN int  T32_ReadMemory     (uint32_t Address, int Access, uint8_t *pBuffer, int Size);
T32EXTERN int  T32_WriteMemory    (uint32_t Address, int Access, const uint8_t *pBuffer, int Size);
T32EXTERN int  T32_WriteMemoryPipe(uint32_t Address, int Access, const uint8_t *pBuffer, int Size);
T32EXTERN int  T32_ReadMemoryEx   (uint32_t Address, int Segment, int Access, int Attribute, uint8_t *pBuffer, int Size);                 /*undocumented*/
T32EXTERN int  T32_WriteMemoryEx  (uint32_t Address, int Segment, int Access, int Attribute, uint8_t *pBuffer, int Size);                 /*undocumented*/
T32EXTERN int  T32_SetMemoryAccessClass(const char* Access);
T32EXTERN int  T32_GetRam(uint32_t *pStartAddress, uint32_t *pEndAddress, uint16_t *pAccess);
T32EXTERN int  T32_GetSource(uint32_t Address, char *SourceFile, uint32_t *pSourceLine);
T32EXTERN int  T32_GetSelectedSource(          char *SourceFile, uint32_t *pSourceLine);
T32EXTERN int  T32_GetSymbol(const char *SymbolName, uint32_t *pAddress, uint32_t *pSize, uint32_t *pAccess);
T32EXTERN int  T32_GetSymbolFromAddress (char* SymbolName, uint32_t Address, int StringLength);
T32EXTERN int  T32_ReadVariableString(const char *VariableName, char *StringFromNumeric, int StringLength);
T32EXTERN int  T32_ReadVariableValue (const char *VariableName, uint32_t *pValueLower32Bit, uint32_t *pValueUpper32Bit);
T32EXTERN int  T32_WriteVariableValue (const char *VariableName, uint32_t ValueLower32Bit, uint32_t ValueUpper32Bit);
T32EXTERN int  T32_GetWindowContent(const char *command, char * buffer, uint32_t requested, uint32_t offset, uint32_t print_code);
T32EXTERN int  T32_ReadRegisterByName (const char *RegisterName, uint32_t *pValueLower32Bit, uint32_t *pValueUpper32Bit);
T32EXTERN int  T32_WriteRegisterByName(const char *RegisterName, uint32_t ValueLower32Bit, uint32_t ValueUpper32Bit);
T32EXTERN int  T32_ReadPP(uint32_t *pProgramCounter);
T32EXTERN int  T32_ReadRegister (uint32_t MaskLower32Bit, uint32_t MaskUpper32Bit, uint32_t *pBuffer);
T32EXTERN int  T32_WriteRegister(uint32_t MaskLower32Bit, uint32_t MaskUpper32Bit, uint32_t *pBuffer);
T32EXTERN int  T32_ReadBreakpoint (uint32_t Address, int Access, uint16_t *pBPConfiguration, int Size);
T32EXTERN int  T32_WriteBreakpoint(uint32_t Address, int Access, int        BPConfiguration, int Size);
T32EXTERN int  T32_GetBreakpointList(int *pNumberFetched, T32_Breakpoint *pBPSettings, int FetchLimit);
T32EXTERN int  T32_GetTraceState(int TraceType, int *pTraceState, int32_t *pTraceTotalRecords, int32_t *pCurrentRecordMin, int32_t *pCurrentRecordMax);
T32EXTERN int  T32_ReadTrace    (int TraceType, int32_t StartRecord, int NumberOfRecords, uint32_t Mask, uint8_t *pBuffer);
T32EXTERN int  T32_GetLastErrorMessage(char *ErrorMessage, uint32_t* pLastError, uint32_t* pInternal);
# ifdef ENABLE_NOTIFICATION
typedef void (*T32_NotificationCallback_t)();
T32EXTERN int T32_NotifyStateEnable(int EventNumber, T32_NotificationCallback_t pFunction);
T32EXTERN int T32_NotifyEventEnable(const char* event, T32_NotificationCallback_t pFunction);
T32EXTERN int T32_CheckStateNotify(unsigned ParameterOfCallbackFunction);

参考:API Functions,包括错误码、每个函数描述以及和多个Trace32联调。

3 Python+t32api.so/t32api.dll进行调试

在C:\T32\demo\api\python中提供了Python所需要使用的库,以及Python脚本。

其中库:

  • t32api.dll - 32/64位Windows适用。
  • t32api64.dll - 64位Windows适用。
  • t32api.so - 32/64位Linux适用。
  • t32api64.so - 64位Linux使用。

Python脚本:

  • t32api.py - 简单的使用Remote Control演示。
  • t32apicmd.py - 使用T32_Cmd()和T32_GetMessage()执行命令获取结果。
  • t32remotedo.py - 执行一个PRACTICE脚本。
  • t32apimenu.py -  较丰富的Remote Control API演示。

 

标签:Python,T32EXTERN,void,CRemoteAPI,char,int,Trace32,T32,uint32
From: https://www.cnblogs.com/arnoldlu/p/17223624.html

相关文章

  • python 类中的属性排序
    可以使用Python中的类(class)来定义一个包含姓名和年龄的类。以下是一个示例代码:classPerson:def__init__(self,name,age):self.name=namese......
  • python文件目录下的 __init__.py 文件说明(转摘)
    1、python中的项目结构是按照目录来组织的,每个python文件就是一个模块,将模块整合在一起就是包,也就是把服务于某个功能的一系列模块放在一个目录中,这样如果想要使用某个包......
  • 【python】combinations函数遍历列表内元素不同组合
    在参数调优的过程中,不同个体数的样本组合需要计算,但是一个一个用for来穷尽组合的可能显得太过笨拙,查到可以用itertools中的combinations模块来处理类似的问题:fromiterto......
  • python中的typing库
    typing的主要作用有:类型检查,防止运行时出现参数、返回值类型不符作为开发文档附加说明,方便使用者调用时传入和返回参数类型模块加入不会影响程序的运行不会报正式的错......
  • 20230314-python-字典与json
    1.字典的定义                      ......
  • 小白也能学会的精简版GA遗传算法(Python)
    今天无意中看到了一篇讲遗传算法的文章,文章内容很短,大部分都是代码,代码跟平时见到的遗传算法不同之所以要拿这篇文章来讲,主要是因为原文没有对代码进行解释,但是,这段......
  • python datetime模块常用功能
    时间的转换:时间戳转日期(datetime.date.fromtimestamp(1234567896)),返回日期年-月-日时间戳转年月日时分秒(datetime.datetime.fromtimestamp(123456789......
  • python 雪花算法demo
    importtimeimportloggingclassInvalidSystemClock(Exception):"""时钟回拨异常"""pass#64位ID的划分WORKER_ID_BITS=5DATACENTER_ID_B......
  • python工程打包成可执行文件
    1、将python打包成exe的方式python上常见的打包方式目是通过pyinstaller来实现的。pipinstallpyinstaller或者用镜像下载:#清华源pipinstallpyinstaller-i......
  • python选出一定数量的随机文件到某个文件夹
    importosimportrandomimportshutildefmove_file(target_path,save_path,number):file_list=os.listdir(target_path)random.shuffle(file_list)......