You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
11 KiB
219 lines
11 KiB
.. _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:`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 */ |
|
}; |
|
... |
|
...
|
|
|