| .. _optimization_tools: |
| |
| Optimization Tools |
| ################## |
| |
| .. _footprint_tools: |
| |
| Footprint and Memory Usage |
| ************************** |
| |
| The build system offers 3 targets to view and analyse RAM, ROM and stack usage |
| in generated images. The tools run on the final image and give information |
| about size of symbols and code being used in both RAM and ROM. Additionally, |
| with features available through the compiler, we can also generate worst-case |
| stack usage analysis: |
| |
| Tools that are available as build system targets: |
| |
| Build Target: puncover |
| ====================== |
| |
| This target uses a 3rd party tools called puncover which can be found `here |
| <https://github.com/HBehrens/puncover>`_. When this target is built, it will |
| launch a local web server which will allow you to open a web client and browse |
| the files and view their ROM, RAM and stack usage. Before you can use this |
| target, you will have to install the puncover python module:: |
| |
| pip3 install git+https://github.com/HBehrens/puncover --user |
| |
| |
| Then: |
| |
| .. zephyr-app-commands:: |
| :tool: all |
| :app: samples/hello_world |
| :board: reel_board |
| :goals: puncover |
| |
| |
| To view worst-case stack usage analysis, build this with the |
| :kconfig:option:`CONFIG_STACK_USAGE` enabled. |
| |
| .. zephyr-app-commands:: |
| :tool: all |
| :app: samples/hello_world |
| :board: reel_board |
| :goals: puncover |
| :gen-args: -DCONFIG_STACK_USAGE=y |
| |
| |
| Build Target: ram_report |
| ======================== |
| |
| List all compiled objects and their RAM usage in a tabular form with bytes |
| per symbol and the percentage it uses. The data is grouped based on the file |
| system location of the object in the tree and the file containing the symbol. |
| |
| Use the ``ram_report`` target with your board: |
| |
| .. zephyr-app-commands:: |
| :tool: all |
| :app: samples/hello_world |
| :board: reel_board |
| :goals: ram_report |
| |
| which will generate something similar to the output below:: |
| |
| Path Size % |
| ============================================================================================================== |
| ... |
| ... |
| SystemCoreClock 4 0.08% |
| _kernel 48 0.99% |
| _sw_isr_table 384 7.94% |
| cli.10544 16 0.33% |
| gpio_initialized.9765 1 0.02% |
| on.10543 4 0.08% |
| poll_out_lock.9764 4 0.08% |
| z_idle_threads 128 2.65% |
| z_interrupt_stacks 2048 42.36% |
| z_main_thread 128 2.65% |
| arch 1 0.02% |
| arm 1 0.02% |
| core 1 0.02% |
| aarch32 1 0.02% |
| cortex_m 1 0.02% |
| mpu 1 0.02% |
| arm_mpu.c 1 0.02% |
| static_regions_num 1 0.02% |
| drivers 536 11.09% |
| clock_control 100 2.07% |
| nrf_power_clock.c 100 2.07% |
| __device_clock_nrf 16 0.33% |
| data 80 1.65% |
| hfclk_users 4 0.08% |
| ... |
| ... |
| |
| |
| Build Target: rom_report |
| ======================== |
| |
| List all compiled objects and their ROM usage in a tabular form with bytes |
| per symbol and the percentage it uses. The data is grouped based on the file |
| system location of the object in the tree and the file containing the symbol. |
| |
| Use the ``rom_report`` to get the ROM report: |
| |
| .. zephyr-app-commands:: |
| :tool: all |
| :app: samples/hello_world |
| :board: reel_board |
| :goals: rom_report |
| |
| which will generate something similar to the output below:: |
| |
| Path Size % |
| ============================================================================================================== |
| ... |
| ... |
| CSWTCH.5 4 0.02% |
| SystemCoreClock 4 0.02% |
| __aeabi_idiv0 2 0.01% |
| __udivmoddi4 702 3.37% |
| _sw_isr_table 384 1.85% |
| delay_machine_code.9114 6 0.03% |
| levels.8826 20 0.10% |
| mpu_config 8 0.04% |
| transitions.10558 12 0.06% |
| arch 1194 5.74% |
| arm 1194 5.74% |
| core 1194 5.74% |
| aarch32 1194 5.74% |
| cortex_m 852 4.09% |
| fault.c 400 1.92% |
| bus_fault.isra.0 60 0.29% |
| mem_manage_fault.isra.0 56 0.27% |
| usage_fault.isra.0 36 0.17% |
| z_arm_fault 232 1.11% |
| z_arm_fault_init 16 0.08% |
| irq_init.c 24 0.12% |
| z_arm_interrupt_init 24 0.12% |
| mpu 352 1.69% |
| arm_core_mpu.c 56 0.27% |
| z_arm_configure_static_mpu_regions 56 0.27% |
| arm_mpu.c 296 1.42% |
| __init_sys_init_arm_mpu_init0 8 0.04% |
| arm_core_mpu_configure_static_mpu_regions 20 0.10% |
| arm_core_mpu_disable 16 0.08% |
| arm_core_mpu_enable 20 0.10% |
| arm_mpu_init 92 0.44% |
| mpu_configure_regions 140 0.67% |
| thread_abort.c 76 0.37% |
| z_impl_k_thread_abort |
| 76 0.37% |
| ... |
| ... |
| |
| |
| Data Structures |
| **************** |
| |
| |
| Build Target: pahole |
| ===================== |
| |
| Poke-a-hole (pahole) is an object-file analysis tool to find the size of |
| the data structures, and the holes caused due to aligning the data |
| elements to the word-size of the CPU by the compiler. |
| |
| Poke-a-hole (pahole) must be installed prior to using this target. It can be |
| obtained from https://git.kernel.org/pub/scm/devel/pahole/pahole.git and is |
| available in the dwarves package in both fedora and ubuntu:: |
| |
| sudo apt-get install dwarves |
| |
| or in fedora:: |
| |
| sudo dnf install dwarves |
| |
| |
| .. zephyr-app-commands:: |
| :tool: all |
| :app: samples/hello_world |
| :board: reel_board |
| :goals: pahole |
| |
| |
| After running this target, pahole will output the results to the console:: |
| |
| /* Used at: zephyr/isr_tables.c */ |
| /* <80> ../include/sw_isr_table.h:30 */ |
| struct _isr_table_entry { |
| void * arg; /* 0 4 */ |
| void (*isr)(void *); /* 4 4 */ |
| |
| /* size: 8, cachelines: 1, members: 2 */ |
| /* last cacheline: 8 bytes */ |
| }; |
| /* Used at: zephyr/isr_tables.c */ |
| /* <eb> ../include/arch/arm/aarch32/cortex_m/mpu/arm_mpu_v7m.h:134 */ |
| struct arm_mpu_region_attr { |
| uint32_t rasr; /* 0 4 */ |
| |
| /* size: 4, cachelines: 1, members: 1 */ |
| /* last cacheline: 4 bytes */ |
| }; |
| /* Used at: zephyr/isr_tables.c */ |
| /* <112> ../include/arch/arm/aarch32/cortex_m/mpu/arm_mpu.h:24 */ |
| struct arm_mpu_region { |
| uint32_t base; /* 0 4 */ |
| const char * name; /* 4 4 */ |
| arm_mpu_region_attr_t attr; /* 8 4 */ |
| |
| /* size: 12, cachelines: 1, members: 3 */ |
| /* last cacheline: 12 bytes */ |
| }; |
| ... |
| ... |