⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 download.py

📁 eCos操作系统源码
💻 PY
字号:
#! /usr/bin/env python## Copyright (C) 2003, MLB Associates## This program is used to read a Motorola S-record file and# download it using the GDB protocol.import os, string, sys, timetrace = open("/tmp/download.trace", "w")## Use up some time#def spin():    j = 0    for i in range(0,200):        j = j + 1## Compute the checksum for a string#def cksum(str):#    sys.stderr.write("cksum %s\n" % str)    sum = 0    cs = str[1:]    while cs:        sum = sum + ord(cs[:1])        cs = cs[1:]    return sum & 0xFF## Send a string via the GDB protocol.  Note: this routine# computes and adds the checksum before starting.#def send(str):    str = str + "#%02x" % cksum(str)#    trace.write("ready to send: %s\n" % str)#    trace.flush()    while 1:        s = str        while s:            os.write(1, s[:1])            spin()            # time.sleep(0.001)            s = s[1:]        c = os.read(0, 1)        if c <> '+':            trace.write("~ACK: %c\n" % c)            trace.write("sent: %s\n" % str)            trace.flush()            continue        res = ''        while 1:            c = os.read(0, 1)            if c == '#': break            res = res + c            # trace.write("ACK: %c, res: %s\n" % (c, res))            # trace.flush()        # trace.write("res = %s\n" % res)        # trace.flush()        csum = cksum(res)        cs = os.read(0, 1)        cs = cs + os.read(0, 1)        sum = string.atoi(cs, 16)        if csum <> sum:            os.write(1, '-')            trace.write("RES = %s, sum: %x/%x\n" % (res, csum, sum))            trace.write("sent: %s\n" % str)            trace.flush()            continue        os.write(1, '+')        trace.flush()        return## Process a stream of S-records, supplied by 'readline()'#def download(readline):    # send("$Hc-1")    # send("$Hg0")    last_addr = 0    while 1:        line = readline()        if not line: break        if line[0] <> 'S':            raise ("Invalid input:" + line)        if line[1] in "123":            len = string.atoi(line[2:4],16)            an = ord(line[1]) - ord('1') + 2            ae = 4 + (an*2)            addr = string.atoi(line[4:ae],16)            #print "len = %d, addr = 0x%x " % (len, addr)            len = len - (an+1)            line = line[ae:]            out = "$M%x,%x:" % (addr, len)            for i in range(0,len):                val = string.atoi(line[:2],16)                #print "val = 0x%x" % val                line = line[2:]                out = out + "%02x" % val            if (addr - last_addr) >= 0x400:                last_addr = addr                sys.stderr.write("0x%x\n" % addr)            send(out)        elif line[1] in "789":            len = string.atoi(line[2:4],16)            eos = 10            if line[1] == '7':                eos = 12            addr = string.atoi(line[4:12],16)            #print "len = %d, addr = 0x%x " % (len, addr)            len = len - 4            line = line[eos:]            out = "$P40=%08x" % addr            sys.stderr.write("Set PC = 0x%x\n" % addr)            send(out)    # This command starts the program    send("$c#63")        if __name__ == '__main__':                     # testing    import sys    if len(sys.argv) > 1: download(open(sys.argv[1]).readline)    else: download(sys.stdin.readline)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -