2

ATXmega128A4U 用の独自のブートローダーを作成しています。ブートローダを使用するには、ファームウェアの ELF ファイルを ATXmega で使用されるメモリ マップに変換したいと考えています。そのために、私は python とモジュール "pyelftools" を使用します。ドキュメントが貧弱なので、問題が発生しました。セクションのデータからアドレス、オフセットなどを取得するために使用できる情報がわかりません。私の目標は、バイト配列を作成し、データ/コードをそこにコピーして、ブートローダーに転送することです。以下は私のコードです:

import sys

# If pyelftools is not installed, the example can also run from the root or
# examples/ dir of the source distribution.
sys.path[0:0] = ['.', '..']

from elftools.common.py3compat import bytes2str
from elftools.elf.elffile import ELFFile

# 128k flash for the ATXmega128a4u
flashsize = 128 * 1024


def process_file(filename):
    with open(filename, 'rb') as f:
        # get the data
        elffile = ELFFile(f)
        dataSec = elffile.get_section_by_name(b'.data')        
        textSec = elffile.get_section_by_name(b'.text')
        # prepare the memory
        flashMemory = bytearray(flashsize)
        # the data section
        startAddr = dataSec.header.sh_offset
        am = dataSec.header.sh_size
        i = 0
        while i < am:
            val = dataSec.stream.read(1)
            flashMemory[startAddr] = val[0]
            startAddr += 1
            i += 1
        # the text section
        startAddr = textSec.header.sh_offset
        am = textSec.header.sh_size
        i = 0
        while i < am:
            print(str(startAddr) + ' : ' + str(i))
            val = textSec.stream.read(1)
            flashMemory[startAddr] = val[0]
            startAddr += 1
            i += 1
    print('finished')

if __name__ == '__main__':
    process_file('firmware.elf')

誰かがこの問題を解決する方法を教えてくれることを願っています。

4

1 に答える 1