# Asserts the autobaud loader's measured unit is the first RAM object: the # host tool reads the bit period from ram_start (--info's measured clock), so # the unit's address is wire contract. Run as # cmake -DOBJDUMP=... -DELF=... -DRAM_START= -P check_unit.cmake execute_process(COMMAND ${OBJDUMP} -t ${ELF} OUTPUT_VARIABLE _syms RESULT_VARIABLE _res) if(NOT _res EQUAL 0) message(FATAL_ERROR "${OBJDUMP} -t ${ELF} failed") endif() # The symbol line: "00800100 l O .noinit 00000002 unit_E". string(REGEX MATCH "\n0*([0-9a-f]+)[^\n]+[ \t][^ \t\n]*unit_[^ \t\n]*\n" _line "${_syms}") if(NOT _line) message(FATAL_ERROR "no unit_ symbol in ${ELF} — is this the autobaud loader?") endif() # AVR data-space symbols carry the 0x800000 VMA offset. math(EXPR _want "0x800000 + ${RAM_START}" OUTPUT_FORMAT HEXADECIMAL) math(EXPR _have "0x${CMAKE_MATCH_1}" OUTPUT_FORMAT HEXADECIMAL) if(NOT _have STREQUAL _want) message(FATAL_ERROR "unit_ sits at ${_have}, ram_start is ${_want} — the host peeks ram_start") endif() message(STATUS "unit_ at ${_have} == ram_start")