Loading script/cat.py 0 → 100755 +108 −0 Original line number Diff line number Diff line #!/usr/bin/env python3 import re import serial import serial.threaded import sys import time cpu_freq = None timer_overflow = None class SerialReader(serial.threaded.Protocol): """ Character- to line-wise data buffer for serial interfaces. Reads in new data whenever it becomes available and exposes a line-based interface to applications. """ def __init__(self, callback): """Create a new SerialReader object.""" self.callback = callback self.recv_buf = "" def __call__(self): return self def data_received(self, data): """Append newly received serial data to the line buffer.""" try: str_data = data.decode("UTF-8") self.recv_buf += str_data # We may get anything between \r\n, \n\r and simple \n newlines. # We assume that \n is always present and use str.strip to remove leading/trailing \r symbols # Note: Do not call str.strip on lines[-1]! Otherwise, lines may be mangled lines = self.recv_buf.split("\n") if len(lines) > 1: self.recv_buf = lines[-1] for line in lines[:-1]: self.callback(str.strip(line)) except UnicodeDecodeError: pass # sys.stderr.write('UART output contains garbage: {data}\n'.format(data = data)) class SerialMonitor: """SerialMonitor captures serial output for a specific amount of time.""" def __init__(self, port: str, baud: int, callback): """ Create a new SerialMonitor connected to port at the specified baud rate. Communication uses no parity, no flow control, and one stop bit. Data collection starts immediately. """ self.ser = serial.serial_for_url(port, do_not_open=True) self.ser.baudrate = baud self.ser.parity = "N" self.ser.rtscts = False self.ser.xonxoff = False try: self.ser.open() except serial.SerialException as e: sys.stderr.write( "Could not open serial port {}: {}\n".format(self.ser.name, e) ) sys.exit(1) self.reader = SerialReader(callback=callback) self.worker = serial.threaded.ReaderThread(self.ser, self.reader) self.worker.start() def close(self): """Close serial connection.""" self.worker.stop() self.ser.close() def handle_line(line): if cpu_freq is not None: print_line = line for match in re.finditer("(\d+)/(\d+) cycles", line): cycles = int(match.group(1)) overflows = int(match.group(2)) ms = (cycles + timer_overflow * overflows) * 1000 / cpu_freq match_line = f"{cycles}/{overflows} cycles" new_line = f"{ms} ms ({cycles}/{overflows} cycles)" print_line = re.sub(match_line, new_line, print_line) print(print_line) else: print(line) if __name__ == "__main__": tty = sys.argv[1] baud = int(sys.argv[2]) if len(sys.argv) > 4: cpu_freq = int(sys.argv[3]) timer_overflow = int(sys.argv[4]) monitor = SerialMonitor(tty, baud, handle_line) time.sleep(5) monitor.close() src/app/countertest/main.cc +9 −9 Original line number Diff line number Diff line Loading @@ -12,47 +12,47 @@ void loop(void) { counter.start(); counter.stop(); kout << "nop: " << counter.value << "/" << counter.overflow << endl; kout << "nop: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_us(10); counter.stop(); kout << "10us: " << counter.value << "/" << counter.overflow << endl; kout << "10us: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_us(20); counter.stop(); kout << "20us: " << counter.value << "/" << counter.overflow << endl; kout << "20us: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(1); counter.stop(); kout << "1ms: " << counter.value << "/" << counter.overflow << endl; kout << "1ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(2); counter.stop(); kout << "2ms: " << counter.value << "/" << counter.overflow << endl; kout << "2ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(4); counter.stop(); kout << "4ms: " << counter.value << "/" << counter.overflow << endl; kout << "4ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(8); counter.stop(); kout << "8ms: " << counter.value << "/" << counter.overflow << endl; kout << "8ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(16); counter.stop(); kout << "16ms: " << counter.value << "/" << counter.overflow << endl; kout << "16ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(32); counter.stop(); kout << "32ms: " << counter.value << "/" << counter.overflow << endl; kout << "32ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; } int main(void) Loading src/arch/msp430fr5994lp/Makefile.inc +5 −2 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ build/system.elf: ${OBJECTS} -Wl,--library-path=/opt/msp430/ti/msp430-gcc-full-linux-5.1.2.0/include/ \ -Wl,--gc-sections \ -o $@ ${OBJECTS} ${QUIET}${SIZE} build/system.elf | tail -n1 | awk '{ print " ROM: " int(($$1+$$2)*100/49152) "% RAM: " int(($$2+$$3)*100/4096) "%" }' ${QUIET}${SIZE} build/system.elf | tail -n1 | awk '{ print " ROM: " ($$1+$$2) " (" int(($$1+$$2)*100/49152) "%) RAM: " ($$2 + $$3) " (" int(($$2+$$3)*100/4096) "%)" }' build/system.hex: build/system.elf ${QUIET}${OBJCOPY} -O ihex ${@:.hex=.elf} $@ Loading @@ -183,6 +183,9 @@ program: build/system.hex arch_clean: ${QUIET}rm -f ${OBJECTS} build/system.hex cat: ${QUIET}script/cat.py /dev/${SERIAL_PORT} ${uart_freq} ${cpu_freq} 65536 monitor: ${QUIET}screen /dev/${SERIAL_PORT} ${uart_freq} Loading Loading @@ -217,4 +220,4 @@ attributes: build/system.elf ${QUIET}script/size.py ${SIZE} text,data data,bss endif .PHONY: arch_clean arch_help arch_info attributes monitor program .PHONY: arch_clean arch_help arch_info attributes cat monitor program Loading
script/cat.py 0 → 100755 +108 −0 Original line number Diff line number Diff line #!/usr/bin/env python3 import re import serial import serial.threaded import sys import time cpu_freq = None timer_overflow = None class SerialReader(serial.threaded.Protocol): """ Character- to line-wise data buffer for serial interfaces. Reads in new data whenever it becomes available and exposes a line-based interface to applications. """ def __init__(self, callback): """Create a new SerialReader object.""" self.callback = callback self.recv_buf = "" def __call__(self): return self def data_received(self, data): """Append newly received serial data to the line buffer.""" try: str_data = data.decode("UTF-8") self.recv_buf += str_data # We may get anything between \r\n, \n\r and simple \n newlines. # We assume that \n is always present and use str.strip to remove leading/trailing \r symbols # Note: Do not call str.strip on lines[-1]! Otherwise, lines may be mangled lines = self.recv_buf.split("\n") if len(lines) > 1: self.recv_buf = lines[-1] for line in lines[:-1]: self.callback(str.strip(line)) except UnicodeDecodeError: pass # sys.stderr.write('UART output contains garbage: {data}\n'.format(data = data)) class SerialMonitor: """SerialMonitor captures serial output for a specific amount of time.""" def __init__(self, port: str, baud: int, callback): """ Create a new SerialMonitor connected to port at the specified baud rate. Communication uses no parity, no flow control, and one stop bit. Data collection starts immediately. """ self.ser = serial.serial_for_url(port, do_not_open=True) self.ser.baudrate = baud self.ser.parity = "N" self.ser.rtscts = False self.ser.xonxoff = False try: self.ser.open() except serial.SerialException as e: sys.stderr.write( "Could not open serial port {}: {}\n".format(self.ser.name, e) ) sys.exit(1) self.reader = SerialReader(callback=callback) self.worker = serial.threaded.ReaderThread(self.ser, self.reader) self.worker.start() def close(self): """Close serial connection.""" self.worker.stop() self.ser.close() def handle_line(line): if cpu_freq is not None: print_line = line for match in re.finditer("(\d+)/(\d+) cycles", line): cycles = int(match.group(1)) overflows = int(match.group(2)) ms = (cycles + timer_overflow * overflows) * 1000 / cpu_freq match_line = f"{cycles}/{overflows} cycles" new_line = f"{ms} ms ({cycles}/{overflows} cycles)" print_line = re.sub(match_line, new_line, print_line) print(print_line) else: print(line) if __name__ == "__main__": tty = sys.argv[1] baud = int(sys.argv[2]) if len(sys.argv) > 4: cpu_freq = int(sys.argv[3]) timer_overflow = int(sys.argv[4]) monitor = SerialMonitor(tty, baud, handle_line) time.sleep(5) monitor.close()
src/app/countertest/main.cc +9 −9 Original line number Diff line number Diff line Loading @@ -12,47 +12,47 @@ void loop(void) { counter.start(); counter.stop(); kout << "nop: " << counter.value << "/" << counter.overflow << endl; kout << "nop: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_us(10); counter.stop(); kout << "10us: " << counter.value << "/" << counter.overflow << endl; kout << "10us: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_us(20); counter.stop(); kout << "20us: " << counter.value << "/" << counter.overflow << endl; kout << "20us: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(1); counter.stop(); kout << "1ms: " << counter.value << "/" << counter.overflow << endl; kout << "1ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(2); counter.stop(); kout << "2ms: " << counter.value << "/" << counter.overflow << endl; kout << "2ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(4); counter.stop(); kout << "4ms: " << counter.value << "/" << counter.overflow << endl; kout << "4ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(8); counter.stop(); kout << "8ms: " << counter.value << "/" << counter.overflow << endl; kout << "8ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(16); counter.stop(); kout << "16ms: " << counter.value << "/" << counter.overflow << endl; kout << "16ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; counter.start(); arch.delay_ms(32); counter.stop(); kout << "32ms: " << counter.value << "/" << counter.overflow << endl; kout << "32ms: " << counter.value << "/" << counter.overflow << " cycles" << endl; } int main(void) Loading
src/arch/msp430fr5994lp/Makefile.inc +5 −2 Original line number Diff line number Diff line Loading @@ -169,7 +169,7 @@ build/system.elf: ${OBJECTS} -Wl,--library-path=/opt/msp430/ti/msp430-gcc-full-linux-5.1.2.0/include/ \ -Wl,--gc-sections \ -o $@ ${OBJECTS} ${QUIET}${SIZE} build/system.elf | tail -n1 | awk '{ print " ROM: " int(($$1+$$2)*100/49152) "% RAM: " int(($$2+$$3)*100/4096) "%" }' ${QUIET}${SIZE} build/system.elf | tail -n1 | awk '{ print " ROM: " ($$1+$$2) " (" int(($$1+$$2)*100/49152) "%) RAM: " ($$2 + $$3) " (" int(($$2+$$3)*100/4096) "%)" }' build/system.hex: build/system.elf ${QUIET}${OBJCOPY} -O ihex ${@:.hex=.elf} $@ Loading @@ -183,6 +183,9 @@ program: build/system.hex arch_clean: ${QUIET}rm -f ${OBJECTS} build/system.hex cat: ${QUIET}script/cat.py /dev/${SERIAL_PORT} ${uart_freq} ${cpu_freq} 65536 monitor: ${QUIET}screen /dev/${SERIAL_PORT} ${uart_freq} Loading Loading @@ -217,4 +220,4 @@ attributes: build/system.elf ${QUIET}script/size.py ${SIZE} text,data data,bss endif .PHONY: arch_clean arch_help arch_info attributes monitor program .PHONY: arch_clean arch_help arch_info attributes cat monitor program