Hi Mathew and Joel,

 

On the past, I’ve used the following code to get individual task usage and 
monitor tasks behavior through time. It’s completely based on 
rtems_cpu_usage_report_with_plugin and I know it’s not the best way to do it, 
but worked for me 😊.

 

Regards,

 

Fabrício.

 

/**

* Returns the task usage in us. If the taskId is zero, returns the time since 
boot.

* Code based on ‘rtems_cpu_usage_report_with_plugin’.

**/

uint64_t TasksStatusList::GetCpuUsagePerTask(const rtems_id &taskId)

{

                if (taskId == 0)

                {

                               struct timespec uptime;

                               struct timespec total;

 

                               rtems_clock_get_uptime(&uptime);

                               
_Timespec_Subtract(&CPU_usage_Uptime_at_last_reset, &uptime, &total);

 

                               uint64_t totalCpuUsageInUs = (total.tv_sec * 
static_cast<uint64_t>(1000000)) + (total.tv_nsec / static_cast<uint64_t>(1000));

 

                               return totalCpuUsageInUs;

                }

                else

                {

                               Objects_Information *ptObjInformation = NULL;

                               Thread_Control                        *ptThread 
= NULL;

                               Thread_CPU_usage_t timeRan;

 

                               for (uint32_t i = 1; i <= OBJECTS_APIS_LAST; i++)

                               {

                                               if 
(!_Objects_Information_table[i])

                                               {

                                                               continue; // 
that’s ugly, but it works

                                               }

 

                                               ptObjInformation = 
_Objects_Information_table[i][1];

 

                                               if (ptObjInformation != NULL)

                                               {

                                                               for (uint32_t j 
= 1; j <= ptObjInformation->maximum; j++)

                                                               {

                                                                               
ptThread = reinterpret_cast<Thread_Control *>(ptObjInformation->local_table[j]);

 

                                                                               
if (ptThread == NULL)

                                                                               {

                                                                                
               continue; // still ugly, still works

                                                                               }

 

                                                                               
// if the caller task asks for its own cpu usage, the time since the last 
context switch will not be computed

                                                                               
if (ptThread->Object.id == taskId)

                                                                               {

                                                                                
              timeRan = ptThread->cpu_time_used;

 

                                                                                
              uint64_t cpuUsageInUs = (_Timestamp_Get_seconds(&timeRan) * 
static_cast<uint64_t>(1000000)) + (_Timestamp_Get_nanoseconds(&timeRan) / 
static_cast<uint64_t>(1000));

 

                                                                                
              return cpuUsageInUs;

                                                                               }

                                                               }

                                               }

                               }

 

                               // if the rtemsId doesn’t exist...

                               return 0;

                }

}

 

De: users [mailto:users-boun...@rtems.org] Em nome de Joel Sherrill
Enviada em: quinta-feira, 12 de julho de 2018 11:37
Para: Mathew Benson <mben...@windhoverlabs.com>
Cc: RTEMS <rtems-us...@rtems.org>
Assunto: Re: CPU utilization

 

 

 

On Tue, Jul 10, 2018 at 2:30 PM, Mathew Benson < 
<mailto:mben...@windhoverlabs.com> mben...@windhoverlabs.com> wrote:

What would be the recommend way to read CPU utilization?  Am I correct in 
saying, the best way would be to call rtems_cpu_usage_report_with_plugin()?  
Its ill advised to access the private symbols utilized by the 
rtems_cpu_usage_report_with_plugin() call directly, right?  Is there another 
function that I can call to return a structure rather than parsing it with the 
rtems_printer plugin?  I haven't dug into the rtems_printer object yet, but I'm 
assuming I could use it and parse a string sent to it.

 

 

Yes. You could use the printer_object passed in to parse it. 

 

There isn't a call to get this information (yet) and similarly, there isn't an

API to get the stack usage. 

 

Proposals and code welcomed. :)

 

--joel

 


-- 

Mathew Benson

CEO | Chief Engineer

Windhover Labs, LLC
832-640-4018

  
<https://drive.google.com/a/windhoverlabs.com/uc?id=1cLDczWESrU667xKgEJlFhHa2yjq5UVhJ&export=download>
 

 <http://www.windhoverlabs.com> www.windhoverlabs.com


_______________________________________________
users mailing list
 <mailto:users@rtems.org> users@rtems.org
 <http://lists.rtems.org/mailman/listinfo/users> 
http://lists.rtems.org/mailman/listinfo/users

 

_______________________________________________
users mailing list
users@rtems.org
http://lists.rtems.org/mailman/listinfo/users

Reply via email to