1
0
Fork 0
forked from len0rd/rockbox

Boot charting support.

Select (B)ootchart in advanced options in configure, and logf will record timings for various stages of boot, for performance comparisons. Format logged is:
BC:>function_name,123,80
where 123 is the line number, 80 is the number of ticks since boot. This can be loaded as CSV into a spreadsheet.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25426 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Torne Wuff 2010-04-01 16:27:21 +00:00
parent f376fd2f4a
commit 52e528e057
5 changed files with 132 additions and 4 deletions

View file

@ -33,6 +33,7 @@
#include "skin_engine/skin_engine.h" #include "skin_engine/skin_engine.h"
#include "skin_engine/skin_fonts.h" #include "skin_engine/skin_fonts.h"
#include "statusbar-skinned.h" #include "statusbar-skinned.h"
#include "bootchart.h"
/* call this after loading a .wps/.rwps or other skin files, so that the /* call this after loading a .wps/.rwps or other skin files, so that the
@ -73,6 +74,7 @@ void settings_apply_skins(void)
#ifdef HAVE_REMOTE_LCD #ifdef HAVE_REMOTE_LCD
screen = skins[i].suffix[0] == 'r' ? SCREEN_REMOTE : SCREEN_MAIN; screen = skins[i].suffix[0] == 'r' ? SCREEN_REMOTE : SCREEN_MAIN;
#endif #endif
CHART2(">skin load ", skins[i].suffix);
if (skins[i].setting[0] && skins[i].setting[0] != '-') if (skins[i].setting[0] && skins[i].setting[0] != '-')
{ {
snprintf(buf, sizeof buf, WPS_DIR "/%s.%s", snprintf(buf, sizeof buf, WPS_DIR "/%s.%s",
@ -83,6 +85,7 @@ void settings_apply_skins(void)
{ {
skins[i].loadfunc(screen, NULL, true); skins[i].loadfunc(screen, NULL, true);
} }
CHART2("<skin load ", skins[i].suffix);
} }
viewportmanager_theme_changed(THEME_STATUSBAR); viewportmanager_theme_changed(THEME_STATUSBAR);
#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1

View file

@ -75,6 +75,7 @@
#include "icon.h" #include "icon.h"
#include "viewport.h" #include "viewport.h"
#include "statusbar-skinned.h" #include "statusbar-skinned.h"
#include "bootchart.h"
#ifdef IPOD_ACCESSORY_PROTOCOL #ifdef IPOD_ACCESSORY_PROTOCOL
#include "iap.h" #include "iap.h"
@ -136,7 +137,9 @@ int main(void)
#endif #endif
{ {
int i; int i;
CHART(">init");
init(); init();
CHART("<init");
FOR_NB_SCREENS(i) FOR_NB_SCREENS(i)
{ {
screens[i].clear_display(); screens[i].clear_display();
@ -167,6 +170,7 @@ int main(void)
global_status.last_volume_change = 0; global_status.last_volume_change = 0;
/* no calls INIT_ATTR functions after this point anymore! /* no calls INIT_ATTR functions after this point anymore!
* see definition of INIT_ATTR in config.h */ * see definition of INIT_ATTR in config.h */
CHART(">root_menu");
root_menu(); root_menu();
} }
@ -414,13 +418,18 @@ static void init(void)
#ifdef CPU_ARM #ifdef CPU_ARM
enable_fiq(); enable_fiq();
#endif #endif
/* current_tick should be ticking by now */
CHART("ticking");
lcd_init(); lcd_init();
#ifdef HAVE_REMOTE_LCD #ifdef HAVE_REMOTE_LCD
lcd_remote_init(); lcd_remote_init();
#endif #endif
font_init(); font_init();
CHART(">show_logo");
show_logo(); show_logo();
CHART("<show_logo");
lang_init(core_language_builtin, language_strings, lang_init(core_language_builtin, language_strings,
LANG_LAST_INDEX_IN_ARRAY); LANG_LAST_INDEX_IN_ARRAY);
@ -436,7 +445,9 @@ static void init(void)
rtc_init(); rtc_init();
#endif #endif
#ifdef HAVE_RTC_RAM #ifdef HAVE_RTC_RAM
CHART(">settings_load(RTC)");
settings_load(SETTINGS_RTC); /* early load parts of global_settings */ settings_load(SETTINGS_RTC); /* early load parts of global_settings */
CHART("<settings_load(RTC)");
#endif #endif
adc_init(); adc_init();
@ -460,10 +471,18 @@ static void init(void)
/* Keep the order of this 3 (viewportmanager handles statusbars) /* Keep the order of this 3 (viewportmanager handles statusbars)
* Must be done before any code uses the multi-screen API */ * Must be done before any code uses the multi-screen API */
CHART(">gui_syncstatusbar_init");
gui_syncstatusbar_init(&statusbars); gui_syncstatusbar_init(&statusbars);
CHART("<gui_syncstatusbar_init");
CHART(">sb_skin_init");
sb_skin_init(); sb_skin_init();
CHART("<sb_skin_init");
CHART(">gui_sync_wps_init");
gui_sync_wps_init(); gui_sync_wps_init();
CHART("<gui_sync_wps_init");
CHART(">viewportmanager_init");
viewportmanager_init(); viewportmanager_init();
CHART("<viewportmanager_init");
#if CONFIG_CHARGING && (CONFIG_CPU == SH7034) #if CONFIG_CHARGING && (CONFIG_CPU == SH7034)
/* charger_inserted() can't be used here because power_thread() /* charger_inserted() can't be used here because power_thread()
@ -483,7 +502,9 @@ static void init(void)
} }
#endif #endif
CHART(">storage_init");
rc = storage_init(); rc = storage_init();
CHART("<storage_init");
if(rc) if(rc)
{ {
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
@ -498,7 +519,9 @@ static void init(void)
} }
#ifdef HAVE_EEPROM_SETTINGS #ifdef HAVE_EEPROM_SETTINGS
CHART(">eeprom_settings_init");
eeprom_settings_init(); eeprom_settings_init();
CHART("<eeprom_settings_init");
#endif #endif
#ifndef HAVE_USBSTACK #ifndef HAVE_USBSTACK
@ -527,7 +550,9 @@ static void init(void)
if (!mounted) if (!mounted)
{ {
CHART(">disk_mount_all");
rc = disk_mount_all(); rc = disk_mount_all();
CHART("<disk_mount_all");
if (rc<=0) if (rc<=0)
{ {
lcd_clear_display(); lcd_clear_display();
@ -561,19 +586,32 @@ static void init(void)
} }
else else
#endif #endif
{
CHART(">settings_load(ALL)");
settings_load(SETTINGS_ALL); settings_load(SETTINGS_ALL);
CHART("<settings_load(ALL)");
}
if (init_dircache(true) < 0) CHART(">init_dircache(true)");
rc = init_dircache(true);
CHART("<init_dircache(true");
if (rc < 0)
{ {
#ifdef HAVE_TAGCACHE #ifdef HAVE_TAGCACHE
remove(TAGCACHE_STATEFILE); remove(TAGCACHE_STATEFILE);
#endif #endif
} }
CHART(">settings_apply(true)");
settings_apply(true); settings_apply(true);
CHART("<settings_apply(true)");
CHART(">init_dircache(false)");
init_dircache(false); init_dircache(false);
CHART("<init_dircache(false)");
#ifdef HAVE_TAGCACHE #ifdef HAVE_TAGCACHE
CHART(">init_tagcache");
init_tagcache(); init_tagcache();
CHART("<init_tagcache");
#endif #endif
#ifdef HAVE_EEPROM_SETTINGS #ifdef HAVE_EEPROM_SETTINGS
@ -581,7 +619,9 @@ static void init(void)
{ {
/* In case we crash. */ /* In case we crash. */
firmware_settings.disk_clean = false; firmware_settings.disk_clean = false;
CHART(">eeprom_settings_store");
eeprom_settings_store(); eeprom_settings_store();
CHART("<eeprom_settings_store");
} }
#endif #endif
playlist_init(); playlist_init();
@ -614,7 +654,9 @@ static void init(void)
talk_init(); talk_init();
#endif /* CONFIG_CODEC != SWCODEC */ #endif /* CONFIG_CODEC != SWCODEC */
CHART(">audio_init");
audio_init(); audio_init();
CHART("<audio_init");
#if (CONFIG_CODEC == SWCODEC) && defined(HAVE_RECORDING) && !defined(SIMULATOR) #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_RECORDING) && !defined(SIMULATOR)
pcm_rec_init(); pcm_rec_init();
@ -636,9 +678,13 @@ static void init(void)
lineout_set(global_settings.lineout_active); lineout_set(global_settings.lineout_active);
#endif #endif
#ifdef HAVE_HOTSWAP_STORAGE_AS_MAIN #ifdef HAVE_HOTSWAP_STORAGE_AS_MAIN
CHART("<check_bootfile(false)");
check_bootfile(false); /* remember write time and filesize */ check_bootfile(false); /* remember write time and filesize */
CHART(">check_bootfile(false)");
#endif #endif
CHART("<settings_apply_skins");
settings_apply_skins(); settings_apply_skins();
CHART(">settings_apply_skins");
} }
#ifdef CPU_PP #ifdef CPU_PP

View file

@ -70,6 +70,7 @@
#include "skin_engine/skin_engine.h" #include "skin_engine/skin_engine.h"
#include "viewport.h" #include "viewport.h"
#include "statusbar-skinned.h" #include "statusbar-skinned.h"
#include "bootchart.h"
#if CONFIG_CODEC == MAS3507D #if CONFIG_CODEC == MAS3507D
void dac_line_in(bool enable); void dac_line_in(bool enable);
@ -745,6 +746,7 @@ void settings_apply(bool read_disk)
{ {
char buf[64]; char buf[64];
int rc;
#if CONFIG_CODEC == SWCODEC #if CONFIG_CODEC == SWCODEC
int i; int i;
#endif #endif
@ -841,7 +843,10 @@ void settings_apply(bool read_disk)
&& global_settings.font_file[0] != '-') { && global_settings.font_file[0] != '-') {
snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt", snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
global_settings.font_file); global_settings.font_file);
if (font_load(NULL, buf) < 0) CHART2(">font_load ", global_settings.font_file);
rc = font_load(NULL, buf);
CHART2("<font_load ", global_settings.font_file);
if (rc < 0)
font_reset(NULL); font_reset(NULL);
} }
else else
@ -851,7 +856,10 @@ void settings_apply(bool read_disk)
&& global_settings.remote_font_file[0] != '-') { && global_settings.remote_font_file[0] != '-') {
snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt", snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
global_settings.remote_font_file); global_settings.remote_font_file);
if (font_load_remoteui(buf) < 0) CHART2(">font_load_remoteui ", global_settings.remote_font_file);
rc = font_load_remoteui(buf);
CHART2("<font_load_remoteui ", global_settings.remote_font_file);
if (rc < 0)
font_load_remoteui(NULL); font_load_remoteui(NULL);
} }
else else
@ -860,7 +868,9 @@ void settings_apply(bool read_disk)
if ( global_settings.kbd_file[0]) { if ( global_settings.kbd_file[0]) {
snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd", snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd",
global_settings.kbd_file); global_settings.kbd_file);
CHART(">load_kbd");
load_kbd(buf); load_kbd(buf);
CHART("<load_kbd");
} }
else else
load_kbd(NULL); load_kbd(NULL);
@ -869,16 +879,26 @@ void settings_apply(bool read_disk)
if ( global_settings.lang_file[0]) { if ( global_settings.lang_file[0]) {
snprintf(buf, sizeof buf, LANG_DIR "/%s.lng", snprintf(buf, sizeof buf, LANG_DIR "/%s.lng",
global_settings.lang_file); global_settings.lang_file);
CHART(">lang_core_load");
lang_core_load(buf); lang_core_load(buf);
CHART("<lang_core_load");
CHART(">talk_init");
talk_init(); /* use voice of same language */ talk_init(); /* use voice of same language */
CHART("<talk_init");
} }
/* load the icon set */ /* load the icon set */
CHART(">icons_init");
icons_init(); icons_init();
CHART("<icons_init");
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
if (global_settings.colors_file[0]) if (global_settings.colors_file[0])
{
CHART(">read_color_theme_file");
read_color_theme_file(); read_color_theme_file();
CHART("<read_color_theme_file");
}
#endif #endif
} }
#ifdef HAVE_LCD_COLOR #ifdef HAVE_LCD_COLOR
@ -901,7 +921,9 @@ void settings_apply(bool read_disk)
lcd_scroll_delay(global_settings.scroll_delay); lcd_scroll_delay(global_settings.scroll_delay);
CHART(">set_codepage");
set_codepage(global_settings.default_codepage); set_codepage(global_settings.default_codepage);
CHART("<set_codepage");
#if CONFIG_CODEC == SWCODEC #if CONFIG_CODEC == SWCODEC
#ifdef HAVE_CROSSFADE #ifdef HAVE_CROSSFADE
@ -966,7 +988,9 @@ void settings_apply(bool read_disk)
#endif #endif
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
/* already called with THEME_STATUSBAR in settings_apply_skins() */ /* already called with THEME_STATUSBAR in settings_apply_skins() */
CHART(">viewportmanager_theme_changed");
viewportmanager_theme_changed(THEME_UI_VIEWPORT|THEME_LANGUAGE|THEME_BUTTONBAR); viewportmanager_theme_changed(THEME_UI_VIEWPORT|THEME_LANGUAGE|THEME_BUTTONBAR);
CHART("<viewportmanager_theme_changed");
#endif #endif
} }

View file

@ -0,0 +1,42 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 by Torne Wuff
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef BOOTCHART_H
#define BOOTCHART_H
#include <config.h>
#include <stdbool.h>
#include "../include/_ansi.h"
#include "logf.h"
#include "kernel.h"
#ifdef DO_BOOTCHART
/* we call _logf directly to avoid needing LOGF_ENABLE per-file */
#define CHART2(x,y) _logf("BC:%s%s,%d,%ld", (x), (y), __LINE__, current_tick)
#define CHART(x) CHART2(x,"")
#else /* !DO_BOOTCHART */
#define CHART2(x,y)
#define CHART(x)
#endif /* DO_BOOTCHART */
#endif /* BOOTCHART_H */

15
tools/configure vendored
View file

@ -12,6 +12,7 @@
CCOPTS="-W -Wall -Wundef -O -nostdlib -ffreestanding -Wstrict-prototypes -pipe" CCOPTS="-W -Wall -Wundef -O -nostdlib -ffreestanding -Wstrict-prototypes -pipe"
use_logf="#undef ROCKBOX_HAS_LOGF" use_logf="#undef ROCKBOX_HAS_LOGF"
use_bootchart="#undef DO_BOOTCHART"
scriptver=`echo '$Revision$' | sed -e 's:\\$::g' -e 's/Revision: //'` scriptver=`echo '$Revision$' | sed -e 's:\\$::g' -e 's/Revision: //'`
@ -366,7 +367,7 @@ whichadvanced () {
interact=1 interact=1
echo "" echo ""
echo "Enter your developer options (press enter when done)" echo "Enter your developer options (press enter when done)"
printf "(D)EBUG, (L)ogf, (S)imulator, (P)rofiling, (V)oice, (W)in32 crosscompile" printf "(D)EBUG, (L)ogf, (B)ootchart, (S)imulator, (P)rofiling, (V)oice, (W)in32 crosscompile"
if [ "$memory" = "2" ]; then if [ "$memory" = "2" ]; then
printf ", (8)MB MOD" printf ", (8)MB MOD"
fi fi
@ -407,6 +408,11 @@ whichadvanced () {
echo "logf() support enabled" echo "logf() support enabled"
logf="yes" logf="yes"
;; ;;
[Bb])
echo "bootchart enabled (logf also enabled)"
bootchart="yes"
logf="yes"
;;
[Ss]) [Ss])
echo "Simulator build enabled" echo "Simulator build enabled"
simulator="yes" simulator="yes"
@ -493,6 +499,9 @@ whichadvanced () {
if [ "yes" = "$logf" ]; then if [ "yes" = "$logf" ]; then
use_logf="#define ROCKBOX_HAS_LOGF 1" use_logf="#define ROCKBOX_HAS_LOGF 1"
fi fi
if [ "yes" = "$bootchart" ]; then
use_bootchart="#define DO_BOOTCHART 1"
fi
if [ "yes" = "$simulator" ]; then if [ "yes" = "$simulator" ]; then
debug="-DDEBUG" debug="-DDEBUG"
extradefines="$extradefines -DSIMULATOR" extradefines="$extradefines -DSIMULATOR"
@ -2904,6 +2913,7 @@ fi
sed > autoconf.h \ sed > autoconf.h \
-e "s,@ENDIAN@,${defendian},g" \ -e "s,@ENDIAN@,${defendian},g" \
-e "s,^#undef ROCKBOX_HAS_LOGF,$use_logf,g" \ -e "s,^#undef ROCKBOX_HAS_LOGF,$use_logf,g" \
-e "s,^#undef DO_BOOTCHART,$use_bootchart,g" \
-e "s,@config_rtc@,$config_rtc,g" \ -e "s,@config_rtc@,$config_rtc,g" \
-e "s,@have_rtc_alarm@,$have_rtc_alarm,g" \ -e "s,@have_rtc_alarm@,$have_rtc_alarm,g" \
-e "s,@RBDIR@,${rbdir},g" \ -e "s,@RBDIR@,${rbdir},g" \
@ -2921,6 +2931,9 @@ sed > autoconf.h \
/* Define this if you build rockbox to support the logf logging and display */ /* Define this if you build rockbox to support the logf logging and display */
#undef ROCKBOX_HAS_LOGF #undef ROCKBOX_HAS_LOGF
/* Define this to record a chart with timings for the stages of boot */
#undef DO_BOOTCHART
/* optional define for a backlight modded Ondio */ /* optional define for a backlight modded Ondio */
@have_backlight@ @have_backlight@