# HG changeset patch # User gthomas # Date 1037370753 0 # Node ID 0ff80f81c4e86f25bdc25aae90df09a36c0e4dac # Parent adaa3da3f4e7ca21a4f04e4c4e69f9e68d34de19 Changes in profiling API. Add documentation. diff --git a/packages/services/profile/gprof/current/ChangeLog b/packages/services/profile/gprof/current/ChangeLog --- a/packages/services/profile/gprof/current/ChangeLog +++ b/packages/services/profile/gprof/current/ChangeLog @@ -1,3 +1,11 @@ +2002-11-15 Gary Thomas + + * src/profile.c: + * include/profile.h: Add proper C++ protections. Change timer + callback function to be __profile_hit() - less polluting. + + * doc/profile.sgml: New file. + 2002-11-14 Gary Thomas * src/profile.c: diff --git a/packages/services/profile/gprof/current/doc/profile.sgml b/packages/services/profile/gprof/current/doc/profile.sgml new file mode 100644 --- /dev/null +++ b/packages/services/profile/gprof/current/doc/profile.sgml @@ -0,0 +1,84 @@ + +Application profiling + + +The profile_gprof package provides a mechanism to measure the +runtime performance of an application. This is done by gathering +an execution histogram, which can then be uploaded to a host +and analyzed using the +gprof +utility program. + + +Since the collected histogram data is volatile, some mechanism +must be used to export the data from the target. +Currently, this process is done using +TFTP. +When profiling is started on the target device, a +TFTP +server will be started +which exports the single file +PROFILE.DAT + + + +Profiling functions + + API + +In order for profile data to be gathered for an application, the +program has to initiate the process. +Once started, execution histogram data will be collected in a +dynamic memory buffer. +This data can be uploaded to a host using TFTP. +A side effect of the upload of the data is that the histogram +is reset. +This is useful, especially for high resolution histograms, since +the histogram data are collected as 16-bit counters which can be quickly +saturated. +For example, if the histogram is being collected at a rate of 10,000 +samples per second, a hot spot in the program could saturate after +only 6.5 seconds. + + The API for the application profiling functions can be +found in the file <cyg/profile/profile.h>. + + +profile_on + +This function is used to initiate the gathering of the +runtime execution histogram data. + + +void profile_on(void *start, void *end, int bucket_size, int resolution); + + +Calling this function will initiate execution profiling. +An execution histogram is collected at the rate of +resolution times per second. +The area between start and end +will be divided up into a number of buckets, each representing +bucket_size +program bytes in length. Using statistical sampling (via a high speed timer), when +the program counter is found to be within the range +start..end, the appropriate +bucket (histogram entry) will be incremented. + + +The choice of resolution and bucket_size +control how large the data gathered will be, as well as how much overhead is +encumbered for gathering the histogram. +Smaller values for bucket_size will garner better +results (gprof can more closely align the data with +actual function names) at the expense of a larger data buffer. + +NOTE + +The value of bucket_size will be rounded up to a power of two. + + + + + + + diff --git a/packages/services/profile/gprof/current/include/profile.h b/packages/services/profile/gprof/current/include/profile.h --- a/packages/services/profile/gprof/current/include/profile.h +++ b/packages/services/profile/gprof/current/include/profile.h @@ -50,21 +50,24 @@ // Description: // // Usage: -// #include +// #include // // //####DESCRIPTIONEND#### // //========================================================================== +#include +#include + // Enable profiling -extern void profile_on(void *start_addr, void *end_addr, - int bucket_size, int sample_resolution); +__externC void profile_on(void *start_addr, void *end_addr, + int bucket_size, int sample_resolution); // Callback used by timer routine -extern void profile_hit(unsigned long pc); +__externC void __profile_hit(unsigned long pc); // Timer setup routine, used when enabling profiling -extern void hal_enable_profile_timer(int resolution); +__externC void hal_enable_profile_timer(int resolution); #endif // CYGONCE_PROFILE_H diff --git a/packages/services/profile/gprof/current/src/profile.c b/packages/services/profile/gprof/current/src/profile.c --- a/packages/services/profile/gprof/current/src/profile.c +++ b/packages/services/profile/gprof/current/src/profile.c @@ -192,7 +192,7 @@ profile_read(int fd, void *buf, int len) } void -profile_hit(unsigned long pc) +__profile_hit(unsigned long pc) { int bucket; if (enabled) {