diff --git a/tools/idf_size.py b/tools/idf_size.py index 55630dc49ea..77b26ceba2c 100755 --- a/tools/idf_size.py +++ b/tools/idf_size.py @@ -6,19 +6,8 @@ # Includes information which is not shown in "xtensa-esp32-elf-size", # or easy to parse from "xtensa-esp32-elf-objdump" or raw map files. # -# Copyright 2017-2021 Espressif Systems (Shanghai) CO LTD -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 # from __future__ import division, print_function, unicode_literals diff --git a/tools/test_idf_size/expected_output b/tools/test_idf_size/expected_output index 7c7cc1f4ece..00db2c1c437 100644 --- a/tools/test_idf_size/expected_output +++ b/tools/test_idf_size/expected_output @@ -1,4 +1,25 @@ +*** +Building project for esp32... + +*** +Running mem_test.py for esp32... +Test complete without errors + +*** +Building project for esp32s2... + +*** +Running mem_test.py for esp32s2... +Test complete without errors + +*** +Building project for esp32c3... + +*** +Running mem_test.py for esp32c3... +Test complete without errors + *** Running idf_size.py... Total sizes: diff --git a/tools/test_idf_size/mem_test.py b/tools/test_idf_size/mem_test.py new file mode 100644 index 00000000000..4bfaf0d5cd7 --- /dev/null +++ b/tools/test_idf_size/mem_test.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +# +import argparse +import json +import os +import re +from typing import Dict + +IDF_PATH = os.environ['IDF_PATH'] +MAX_SIZE_DIFF = 50 + + +def mem_test(size_json, esptool_output): # type: (dict, list) -> None + seg_len = {} # type: Dict[str, int] + for i in esptool_output: + tmp = i.split(' ') + if tmp[0] == 'Segment': + # tmp look like ['Segment', '2:', 'len', '0x02780', 'load', '0x3fc90610', 'file_offs', '0x00007ab0', '[BYTE_ACCESSIBLE,MEM_INTERNAL,DRAM]'] + # tmp[3] contains the size of the segment and tmp[8] contains the name of the memory segment + esptool_mem = {'mem_type':tmp[8], 'size':tmp[3]} + seg = re.sub(r'MEM_INTERNAL|,|BYTE_ACCESSIBLE|\n|\[|\]', '', esptool_mem['mem_type']) + # If there are two IRAMs in esptool output it will compute these two IRAM lengths in a seg_len['IRAM'] + seg_len[seg] = int(esptool_mem['size'], 16) if seg not in seg_len else seg_len[seg] + int(esptool_mem['size'], 16) + # including flash_other to DROM because flash_other contain .flash.appdesc that includes in DROM that produced by esptool + size_from_map = [('IROM', size_json['flash_code']), ('IRAM', size_json['iram_text'] + size_json['iram_vectors'] + size_json['diram_text'] + + size_json['diram_vectors']), ('DROM', size_json['flash_rodata'] + size_json['flash_other']), ('DRAM', size_json + ['dram_data'] + size_json['diram_data'])] + for mem_type, size in size_from_map: + if abs(size - seg_len[mem_type]) > MAX_SIZE_DIFF: + raise RuntimeError(mem_type + " segment in idf_size isn't correct regarding esptool") + print('Test complete without errors') + + +def main(): # type: () -> None + parser = argparse.ArgumentParser(description='mem_test.py - a tool to test accuracy of the sizes of the memory segments regarding idf.py size by esptool') + + parser.add_argument( + 'size_json', help='JSON file with the output of the idf.py size', + type=argparse.FileType('r')) + parser.add_argument( + 'esptool_output', help='File with the output of the esptool', + type=argparse.FileType('r')) + + args = parser.parse_args() + mem_test(json.loads(args.size_json.read()), args.esptool_output.read().split('\n')) + + +if __name__ == '__main__': + main() diff --git a/tools/test_idf_size/test.sh b/tools/test_idf_size/test.sh index 12f07f044c9..9ad84455a54 100755 --- a/tools/test_idf_size/test.sh +++ b/tools/test_idf_size/test.sh @@ -1,7 +1,31 @@ #!/usr/bin/env bash -{ coverage debug sys \ - && coverage erase &> output \ + +memory_test () { + pushd $IDF_PATH/examples/get-started/hello_world \ + && echo -e "\n***\nBuilding project for $1..." &>> $IDF_PATH/tools/test_idf_size/output \ + && idf.py set-target $1 \ + && idf.py build \ + && echo -e "\n***\nRunning mem_test.py for $1..." &>> $IDF_PATH/tools/test_idf_size/output \ + && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json build/hello-world.map > size_output.json \ + && python $IDF_PATH/components/esptool_py/esptool/esptool.py --chip $1 image_info build/hello-world.bin > esptool_output \ + && python -m coverage run -a $IDF_PATH/tools/test_idf_size/mem_test.py size_output.json esptool_output &>> $IDF_PATH/tools/test_idf_size/output \ + && popd +} + +json_test() { + echo -e "\n***\nProducing JSON output for $1..." &>> output \ + && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ + && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ + && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ + && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output +} + +{ python -m coverage debug sys \ + && python -m coverage erase &> output \ + && memory_test esp32 \ + && memory_test esp32s2 \ + && memory_test esp32c3 \ && echo -e "\n***\nRunning idf_size.py..." &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py app.map &>> output \ && echo -e "\n***\nRunning idf_size.py on bootloader..." &>> output \ @@ -101,21 +125,9 @@ && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app.map --diff app2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app.map --diff app2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app.map --diff app2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && echo -e "\n***\nProducing JSON output for esp32s2..." &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && echo -e "\n***\nProducing JSON output for esp32c3..." &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && echo -e "\n***\nProducing JSON output for esp32s3..." &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ - && python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \ + && json_test esp32s2 \ + && json_test esp32c3 \ + && json_test esp32s3 \ && echo -e "\n***\nProducing JSON file output..." &>> output \ && coverage run -a $IDF_PATH/tools/idf_size.py --json --output-file output.json app.map &>> output \ && echo -e "\n***\nProducing text file output..." &>> output \