Предположим, что Вы хотите оптимизировать какой-нибудь обработчик прерывания путем правки его кода на ассемблере. Для этой цели надо из кода C получить код ассемблера. Как это сделать, процесс по шагам:
Теперь нам остается только немного модифицировать эту командную строку, чтобы добавить опцию -S и имя выходного генерируемого файла ассемблера.
#!/bin/bash
# Файл скрипта toasm.sh, предназначенный для генерации кода ассемблера
# из модуля исходного кода на языке C. Как использовать:
#
# 1. Измените переменные GCC, HC, PRJFOLDER, BUILD, чтобы они соответствовали вашей
# рабочей среде компиляции.
# 2. Для генерации кода ассемблера (*.S) из кода C (*.c) запустите скрипт командой:
# $ ./toasm.sh имямодуля.c
#
# Здесь вместо имямодуля.c может быть полный или относительный путь до компилируемого
# модуля на языке C. Файл на языке ассемблера появится в том же каталоге.
GCC=/.espressif/tools/riscv32-esp-elf/esp-2021r2-patch3-8.4.0/riscv32-esp-elf/bin/riscv32-esp-elf-gcc
HC=/home/имяпользователя
PRJFOLDER=/каталогпроекта
BUILD=$HC/каталогпроекта/build/esp-idf/espidf/CMakeFiles/__idf_espidf.dir/__/src
INC=-I$HC/каталогпроекта/build/config
INC="$INC -I$HC$PRJFOLDER"
INC="$INC -I$HC$PRJFOLDER/include"
INC="$INC -I$HC/esp/esp-idf/components/newlib/platform_include"
INC="$INC -I$HC/esp/esp-idf/components/freertos/include"
INC="$INC -I$HC/esp/esp-idf/components/freertos/include/esp_additions"
INC="$INC -I$HC/esp/esp-idf/components/freertos/include/esp_additions/freertos"
INC="$INC -I$HC/esp/esp-idf/components/freertos/port/riscv/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_hw_support/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_hw_support/include/soc"
INC="$INC -I$HC/esp/esp-idf/components/esp_hw_support/include/soc/esp32c3"
INC="$INC -I$HC/esp/esp-idf/components/esp_hw_support/port/esp32c3/."
INC="$INC -I$HC/esp/esp-idf/components/esp_hw_support/port/esp32c3/private_include"
INC="$INC -I$HC/esp/esp-idf/components/heap/include"
INC="$INC -I$HC/esp/esp-idf/components/log/include"
INC="$INC -I$HC/esp/esp-idf/components/lwip/include/apps"
INC="$INC -I$HC/esp/esp-idf/components/lwip/include/apps/sntp"
INC="$INC -I$HC/esp/esp-idf/components/lwip/lwip/src/include"
INC="$INC -I$HC/esp/esp-idf/components/lwip/port/esp32/include"
INC="$INC -I$HC/esp/esp-idf/components/lwip/port/esp32/include/arch"
INC="$INC -I$HC/esp/esp-idf/components/soc/include"
INC="$INC -I$HC/esp/esp-idf/components/soc/esp32c3/."
INC="$INC -I$HC/esp/esp-idf/components/soc/esp32c3/include"
INC="$INC -I$HC/esp/esp-idf/components/hal/esp32c3/include"
INC="$INC -I$HC/esp/esp-idf/components/hal/include"
INC="$INC -I$HC/esp/esp-idf/components/hal/platform_port/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_rom/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_rom/include/esp32c3"
INC="$INC -I$HC/esp/esp-idf/components/esp_rom/esp32c3"
INC="$INC -I$HC/esp/esp-idf/components/esp_common/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_system/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_system/port/soc"
INC="$INC -I$HC/esp/esp-idf/components/esp_system/port/include/riscv"
INC="$INC -I$HC/esp/esp-idf/components/esp_system/port/public_compat"
INC="$INC -I$HC/esp/esp-idf/components/riscv/include"
INC="$INC -I$HC/esp/esp-idf/components/driver/include"
INC="$INC -I$HC/esp/esp-idf/components/driver/esp32c3/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_pm/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_ringbuf/include"
INC="$INC -I$HC/esp/esp-idf/components/efuse/include"
INC="$INC -I$HC/esp/esp-idf/components/efuse/esp32c3/include"
INC="$INC -I$HC/esp/esp-idf/components/vfs/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_wifi/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_event/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_netif/include"
INC="$INC -I$HC/esp/esp-idf/components/tcpip_adapter/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_phy/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_phy/esp32c3/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_ipc/include"
INC="$INC -I$HC/esp/esp-idf/components/app_trace/include"
INC="$INC -I$HC/esp/esp-idf/components/esp_timer/include"
INC="$INC -I$HC/esp/esp-idf/components/esp-tls"
INC="$INC -I$HC/esp/esp-idf/components/esp-tls/esp-tls-crypto"
INC="$INC -I$HC/esp/esp-idf/components/mbedtls/port/include"
INC="$INC -I$HC/esp/esp-idf/components/mbedtls/mbedtls/include"
INC="$INC -I$HC/esp/esp-idf/components/mbedtls/esp_crt_bundle/include"
INC="$INC -I$HC/esp/esp-idf/components/nvs_flash/include"
INC="$INC -I$HC/esp/esp-idf/components/spi_flash/include"
WARN=-Wall
WARN="$WARN -Werror=all"
WARN="$WARN -Wno-error=unused-function"
WARN="$WARN -Wno-error=unused-variable"
WARN="$WARN -Wno-error=deprecated-declarations"
WARN="$WARN -Wextra"
WARN="$WARN -Wno-unused-parameter"
WARN="$WARN -Wno-sign-compare"
WARN="$WARN -Wno-error=format="
WARN="$WARN -Wno-format"
WARN="$WARN -Wno-error=unused-but-set-variable"
WARN="$WARN -Wno-old-style-declaration"
OUTPUTASM=$1.S
rm $BUILD/*.*$GCC -DMBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\" $INC -march=rv32imc -ffunction-sections
-fdata-sections $WARN -nostartfiles -O2 -fmacro-prefix-map=$HC$PRJFOLDER=.
-fmacro-prefix-map=$HC/esp/esp-idf=IDF -fstrict-volatile-bitfields -fno-jump-tables
-fno-tree-switch-conversion -std=gnu99 -D_GNU_SOURCE -DIDF_VER=\"v4.4.1-dirty\"
-DESP_PLATFORM -D_POSIX_READER_WRITER_LOCKS -MD -c $1 -o $OUTPUTASM -S .
rm $1.d