Преглед изворни кода

Merge branch 'feature/ulp_cmake_cleanups' into 'master'

ulp: CMake and python cleanups

See merge request espressif/esp-idf!19817
Ivan Grokhotkov пре 3 година
родитељ
комит
4d9018e925

+ 31 - 52
components/ulp/cmake/CMakeLists.txt

@@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.16)
 
 include(${IDF_PATH}/tools/cmake/utilities.cmake)
 project(${ULP_APP_NAME} ASM C)
+add_executable(${ULP_APP_NAME})
 
 option(ULP_COCPU_IS_RISCV "Use RISC-V based ULP" OFF)
 
@@ -19,26 +20,16 @@ set(as_version ${CMAKE_MATCH_1})
 
 message(STATUS "Building ULP app ${ULP_APP_NAME}")
 
-if(ULP_COCPU_IS_RISCV)
-    set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_riscv.ld)
-else()
+# Check the supported assembler version
+if(NOT ULP_COCPU_IS_RISCV)
     message(STATUS "ULP assembler version: ${as_version}")
-
-    # Check the supported assembler version
-    file(STRINGS ${IDF_PATH}/components/ulp/toolchain_ulp_version.mk version_file_contents)
-    string(REGEX MATCH
-        "SUPPORTED_ULP_ASSEMBLER_VERSION = (${version_pattern})"
-        as_supported_version
-        ${version_file_contents})
-    set(as_supported_version ${CMAKE_MATCH_1})
+    set(as_supported_version 2.28.51-esp-20191205)
 
     if(NOT as_version STREQUAL as_supported_version)
         message(WARNING "WARNING: ULP assembler version ${as_version} is not supported. Expected to see version: \
                         ${as_supported_version}. Please check ESP-IDF ULP setup instructions and update \
                         the toolchain, or proceed at your own risk.")
     endif()
-
-    set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_fsm.ld)
 endif()
 
 
@@ -53,20 +44,27 @@ list(APPEND ULP_PREPROCESSOR_ARGS ${component_includes})
 list(APPEND ULP_PREPROCESSOR_ARGS -I${COMPONENT_DIR})
 list(APPEND ULP_PREPROCESSOR_ARGS -I${sdkconfig_dir})
 
-include_directories(${COMPONENT_INCLUDES})
+target_include_directories(${ULP_APP_NAME} PRIVATE ${COMPONENT_INCLUDES})
 
 list(APPEND ULP_PREPROCESSOR_ARGS -D__ASSEMBLER__)
 
-# Preprocess linker script, pre-linking
+# Pre-process the linker script
+if(ULP_COCPU_IS_RISCV)
+    set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_riscv.ld)
+else()
+    set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_fsm.ld)
+endif()
 get_filename_component(ULP_LD_SCRIPT ${ULP_LD_TEMPLATE} NAME)
 add_custom_command(OUTPUT ${ULP_LD_SCRIPT}
                    COMMAND ${CMAKE_C_COMPILER} -E -P -xc -o ${ULP_LD_SCRIPT} ${ULP_PREPROCESSOR_ARGS} ${ULP_LD_TEMPLATE}
                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-                   DEPENDS ${ULP_LD_TEMPLATE} ${SDKCONFIG_HEADER}
+                   MAIN_DEPENDENCY ${ULP_LD_TEMPLATE}
+                   DEPENDS ${SDKCONFIG_HEADER}
+                   COMMENT "Generating ${ULP_LD_SCRIPT} linker script..."
                    VERBATIM)
-add_custom_target(${ULP_APP_NAME}_ld_script
-                  DEPENDS ${ULP_LD_SCRIPT}
-                  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+add_custom_target(ld_script DEPENDS ${ULP_LD_SCRIPT})
+add_dependencies(${ULP_APP_NAME} ld_script)
+target_link_options(${ULP_APP_NAME} PRIVATE SHELL:-T ${CMAKE_CURRENT_BINARY_DIR}/${ULP_LD_SCRIPT})
 
 # To avoid warning "Manually-specified variables were not used by the project"
 set(bypassWarning "${IDF_TARGET}")
@@ -80,30 +78,14 @@ if(ULP_COCPU_IS_RISCV)
         "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c"
         "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_utils.c")
 
-    #dummy loop to force pre-processed linker file generation:
-    foreach(ulp_s_source ${ULP_S_SOURCES})
-        set(noop ${ulp_s_source})
-
-        add_custom_command(OUTPUT ${noop}
-            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-            COMMAND cmake -E echo
-            DEPENDS ${ULP_LD_SCRIPT}
-            )
-
-        set_source_files_properties(${noop} PROPERTIES NOOP_PROPERTY ${ULP_LD_SCRIPT})
-    endforeach()
-
-    #creates the executable:
-    add_executable(${ULP_APP_NAME} ${ULP_S_SOURCES})
-    set(DUMP_SYMBOL_ARGS -g)
-    set(MAP_GEN_EXTRA_ARGS --riscv)
-    set(EXTRA_LINKER_ARGS "-nostartfiles")
-    list(APPEND EXTRA_LINKER_ARGS "-Wl,--gc-sections")
-    list(APPEND EXTRA_LINKER_ARGS "-Wl,-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"")
+    target_link_options(${ULP_APP_NAME} PRIVATE "-nostartfiles")
+    target_link_options(${ULP_APP_NAME} PRIVATE -Wl,--gc-sections)
+    target_link_options(${ULP_APP_NAME} PRIVATE -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map)
+    target_sources(${ULP_APP_NAME} PRIVATE ${ULP_S_SOURCES})
     #Makes the csr utillies for riscv visible:
     target_include_directories(${ULP_APP_NAME} PRIVATE "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/include"
                                                        "${IDF_PATH}/components/ulp/ulp_riscv/shared/include")
-    target_link_libraries(${ULP_APP_NAME} "-T \"${IDF_PATH}/components/ulp/ld/${IDF_TARGET}.periperals.ld\"")
+    target_link_options(${ULP_APP_NAME} PRIVATE SHELL:-T ${IDF_PATH}/components/ulp/ld/${IDF_TARGET}.peripherals.ld)
     target_compile_definitions(${ULP_APP_NAME} PRIVATE IS_ULP_COCPU)
 
 else()
@@ -116,7 +98,7 @@ else()
                            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                            COMMAND ${CMAKE_C_COMPILER} -E -P -xc ${ULP_PREPROCESSOR_ARGS}
                            -o ${ulp_ps_output} ${ulp_s_source}
-                           DEPENDS ${ulp_s_source} ${ULP_LD_SCRIPT}
+                           DEPENDS ${ulp_s_source}
                            VERBATIM)
         # During assembly file compilation, output listing files as well.
         set_source_files_properties(${ulp_ps_output}
@@ -125,17 +107,18 @@ else()
         list(APPEND ULP_PS_SOURCES ${ulp_ps_output})
     endforeach()
 
-    # Create an executable
-    add_executable(${ULP_APP_NAME} ${ULP_PS_SOURCES})
-    set(DUMP_SYMBOL_ARGS -g -f posix)
-    set(MAP_GEN_EXTRA_ARGS .)
-    set(EXTRA_LINKER_ARGS "-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"")
+    target_link_options(${ULP_APP_NAME} PRIVATE -Map=${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map)
+    target_sources(${ULP_APP_NAME} PRIVATE ${ULP_PS_SOURCES})
 
 endif()
 
+# Currently all the supported targets have the same base address of the ULP memory in the CPU address space.
+# Modify this or pull this out of some SoC header file, if that becomes necessary.
+set(ULP_BASE_ADDR "0x50000000")
+
 # Dump the list of global symbols in a convenient format
 add_custom_command(OUTPUT ${ULP_APP_NAME}.sym
-                   COMMAND ${CMAKE_NM} ${DUMP_SYMBOL_ARGS} $<TARGET_FILE:${ULP_APP_NAME}> > ${ULP_APP_NAME}.sym
+                   COMMAND ${CMAKE_NM} -f posix -g $<TARGET_FILE:${ULP_APP_NAME}> > ${ULP_APP_NAME}.sym
                    DEPENDS ${ULP_APP_NAME}
                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -146,7 +129,7 @@ add_custom_command(OUTPUT ${ULP_APP_NAME}.bin
                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 
 add_custom_command(OUTPUT ${ULP_APP_NAME}.ld ${ULP_APP_NAME}.h
-                   COMMAND ${ULP_MAP_GEN} ${MAP_GEN_EXTRA_ARGS} -s ${ULP_APP_NAME}.sym -o ${ULP_APP_NAME}
+                   COMMAND ${ULP_MAP_GEN} -s ${ULP_APP_NAME}.sym -o ${ULP_APP_NAME} --base ${ULP_BASE_ADDR}
                    DEPENDS ${ULP_APP_NAME}.sym
                    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 
@@ -157,7 +140,3 @@ add_custom_target(build
                         ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.ld
                         ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.h
                 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
-
-target_link_libraries(${ULP_APP_NAME} "-T\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_LD_SCRIPT}\"")
-target_link_libraries(${ULP_APP_NAME} ${EXTRA_LINKER_ARGS})
-set_target_properties(${ULP_APP_NAME} PROPERTIES LINK_DEPENDS ${ULP_LD_SCRIPT})

+ 51 - 56
components/ulp/esp32ulp_mapgen.py

@@ -2,77 +2,72 @@
 # esp32ulp_mapgen utility converts a symbol list provided by nm into an export script
 # for the linker and a header file.
 #
-# Copyright (c) 2016-2017 Espressif Systems (Shanghai) PTE LTD.
-# Distributed under the terms of Apache License v2.0 found in the top-level LICENSE file.
+# SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD
+# SPDX-License-Identifier: Apache-2.0
 
 from __future__ import print_function
 
-from optparse import OptionParser
-
-BASE_ADDR = 0x50000000
-
-
-def gen_ld_h_from_sym(f_sym, f_ld, f_h):
-    f_ld.write('/* Variable definitions for ESP32ULP linker\n')
-    f_ld.write(' * This file is generated automatically by esp32ulp_mapgen.py utility.\n')
-    f_ld.write(' */\n\n')
-    f_h.write('// Variable definitions for ESP32ULP\n')
-    f_h.write('// This file is generated automatically by esp32ulp_mapgen.py utility\n\n')
-    f_h.write('#pragma once\n\n')
+import argparse
+import os
+import textwrap
+import typing
+
+UTIL = os.path.basename(__file__)
+
+
+def gen_ld_h_from_sym(f_sym: typing.TextIO, f_ld: typing.TextIO, f_h: typing.TextIO, base_addr: int) -> None:
+    f_ld.write(textwrap.dedent(
+        f"""
+        /* ULP variable definitions for the linker.
+         * This file is generated automatically by {UTIL} utility.
+         */
+        """
+    ))
+    f_h.write(textwrap.dedent(
+        f"""
+        /* ULP variable definitions for the compiler.
+         * This file is generated automatically by {UTIL} utility.
+         */
+        #pragma once
+        #ifdef __cplusplus
+        extern "C" {{
+        #endif
+        """
+    ))
 
     for line in f_sym:
-        name, _, addr_str = line.split(' ', 2)
-        addr = int(addr_str, 16) + BASE_ADDR
+        # NM "posix" format output has the following structure:
+        # symbol_name symbol_type addr_hex [size_hex]
+        parts = line.split()
+        name = parts[0]
+        addr = int(parts[2], 16) + base_addr
         f_h.write('extern uint32_t ulp_{0};\n'.format(name))
         f_ld.write('PROVIDE ( ulp_{0} = 0x{1:08x} );\n'.format(name, addr))
 
+    f_h.write(textwrap.dedent(
+        """
+        #ifdef __cplusplus
+        }
+        #endif
+        """
+    ))
 
-def gen_ld_h_from_sym_riscv(f_sym, f_ld, f_h):
-    f_ld.write('/* Variable definitions for ESP32ULP linker\n')
-    f_ld.write(' * This file is generated automatically by esp32ulp_mapgen.py utility.\n')
-    f_ld.write(' */\n\n')
-    f_h.write('// Variable definitions for ESP32ULP\n')
-    f_h.write('// This file is generated automatically by esp32ulp_mapgen.py utility\n\n')
-    f_h.write('#pragma once\n\n')
 
-    for line in f_sym:
-        addr_str, _, name = line.split()
-        addr = int(addr_str, 16) + BASE_ADDR
-        f_h.write('extern uint32_t ulp_{0};\n'.format(name))
-        f_ld.write('PROVIDE ( ulp_{0} = 0x{1:08x} );\n'.format(name, addr))
-
-
-def main():
+def main() -> None:
     description = ('This application generates .h and .ld files for symbols defined in input file. '
                    'The input symbols file can be generated using nm utility like this: '
-                   'esp32-ulp-nm -g -f posix <elf_file> > <symbols_file>')
-
-    parser = OptionParser(description=description)
-    parser.add_option('-s', '--symfile', dest='symfile',
-                      help='symbols file name', metavar='SYMFILE')
-    parser.add_option('-o', '--outputfile', dest='outputfile',
-                      help='destination .h and .ld files name prefix', metavar='OUTFILE')
-
-    parser.add_option('--riscv', action='store_true', help='use format for ulp riscv .sym file')
-
-    (options, args) = parser.parse_args()
-    if options.symfile is None:
-        parser.print_help()
-        return 1
+                   '<PREFIX>nm -g -f posix <elf_file> > <symbols_file>')
 
-    if options.outputfile is None:
-        parser.print_help()
-        return 1
+    parser = argparse.ArgumentParser(description=description)
+    parser.add_argument('-s', '--symfile', required=True, help='symbols file name', metavar='SYMFILE', type=argparse.FileType('r'))
+    parser.add_argument('-o', '--outputfile', required=True, help='destination .h and .ld files name prefix', metavar='OUTFILE')
+    parser.add_argument('--base-addr', required=True, help='base address of the ULP memory, to be added to each symbol')
 
-    if options.riscv:
-        with open(options.outputfile + '.h', 'w') as f_h, open(options.outputfile + '.ld', 'w') as f_ld, open(options.symfile) as f_sym:
-            gen_ld_h_from_sym_riscv(f_sym, f_ld, f_h)
-        return 0
+    args = parser.parse_args()
 
-    with open(options.outputfile + '.h', 'w') as f_h, open(options.outputfile + '.ld', 'w') as f_ld, open(options.symfile) as f_sym:
-        gen_ld_h_from_sym(f_sym, f_ld, f_h)
-    return 0
+    with open(args.outputfile + '.h', 'w') as f_h, open(args.outputfile + '.ld', 'w') as f_ld:
+        gen_ld_h_from_sym(args.symfile, f_ld, f_h, int(args.base_addr, 0))
 
 
 if __name__ == '__main__':
-    exit(main())
+    main()

+ 0 - 0
components/ulp/ld/esp32s2.periperals.ld → components/ulp/ld/esp32s2.peripherals.ld


+ 0 - 0
components/ulp/ld/esp32s3.periperals.ld → components/ulp/ld/esp32s3.peripherals.ld


+ 0 - 1
components/ulp/toolchain_ulp_version.mk

@@ -1 +0,0 @@
-SUPPORTED_ULP_ASSEMBLER_VERSION = 2.28.51-esp-20191205

+ 0 - 1
tools/ci/check_copyright_ignore.txt

@@ -1284,7 +1284,6 @@ components/tcp_transport/test/test_transport_connect.c
 components/tcp_transport/test/test_transport_fixtures.c
 components/tcp_transport/transport_utils.c
 components/tinyusb/additions/include/tusb_config.h
-components/ulp/esp32ulp_mapgen.py
 components/ulp/test/esp32/test_ulp_as.c
 components/unity/include/priv/setjmp.h
 components/unity/include/unity_config.h

+ 0 - 1
tools/ci/mypy_ignore_list.txt

@@ -18,7 +18,6 @@ components/protocomm/python/constants_pb2.py
 components/protocomm/python/sec0_pb2.py
 components/protocomm/python/sec1_pb2.py
 components/protocomm/python/session_pb2.py
-components/ulp/esp32ulp_mapgen.py
 components/wifi_provisioning/python/wifi_config_pb2.py
 components/wifi_provisioning/python/wifi_constants_pb2.py
 components/wifi_provisioning/python/wifi_scan_pb2.py