简介
使用 Keil debug 很方便,把内存中的一段区域 dump 出来也很方便,例如使用命令 SAVE filepath startAddr, endAddr, typeCode
。但是要查看 dump 出来的内容却很不方便。因为 dump 出来的格式是 INTEL hex386 格式的,这个格式是给机器读的而不是给人读的。
例如下面是一个完成的 INTEL HEX386 格式的文件,你能看懂是什么意思吗?
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF
把 hex386 格式的文件翻译成人能看到的格式是很有必要的,我参考 keil 官方资料 编写了一个 Python 脚本,输入的文件必须是 SAVE filepath startAddr, endAddr, 0x04
产生出来的文件,其中的 typeCode=0x04
表示目标地址时 32bit 对齐的。
脚本所做的事情就是读取输入文件(例如 abc.hex
)处理之后把寄存器的地址-值
对写到输出文件(和输入文件名相同,后缀名为 txt)。
Python 脚本
脚本内容如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 18 09:46:05 2019
@author: LinTeX9527
@version: v0.1-20190718
@desc: convert HEX386 file to txt file.
"""
import os.path
class RegAddrCls:
"""
an entity represents register addr-value pair.
"""
def __init__(self, addr, value):
#super(RegAddrCls, self).__init()
# default value
self.__addr = 0
self.__value = 0
self.__valid = False
self.regAddr = addr
self.regValue = value
@property
def regAddr(self):
return self.__addr
@regAddr.setter
def regAddr(self, addr):
if isinstance(addr, int):
self.__addr = addr
else:
raise TypeError("@addr must be a number")