Skip to content
Snippets Groups Projects
Commit 56613709 authored by David Sidrane's avatar David Sidrane Committed by Lorenz Meier
Browse files

Changed to Upstream NuttX Instrumentation changes

parent b7d7b567
No related branches found
No related tags found
No related merge requests found
......@@ -60,8 +60,11 @@
#ifdef __PX4_NUTTX
__EXPORT void sched_note_start(FAR struct tcb_s *tcb);
__EXPORT void sched_note_stop(FAR struct tcb_s *tcb);
# include <nuttx/sched_note.h>
void sched_note_suspend(FAR struct tcb_s *tcb);
void sched_note_resume(FAR struct tcb_s *tcb);
__EXPORT void sched_note_switch(FAR struct tcb_s *pFromTcb, FAR struct tcb_s *pToTcb);
__EXPORT struct system_load_s system_load;
......@@ -97,6 +100,8 @@ void cpuload_initialize_once()
system_load.total_count); // it is assumed that these static threads have consecutive PIDs
system_load.tasks[system_load.total_count].valid = true;
}
system_load.initialized = true;
}
void sched_note_start(FAR struct tcb_s *tcb)
......@@ -104,15 +109,17 @@ void sched_note_start(FAR struct tcb_s *tcb)
/* search first free slot */
int i;
for (i = 1; i < CONFIG_MAX_TASKS; i++) {
if (!system_load.tasks[i].valid) {
/* slot is available */
system_load.tasks[i].total_runtime = 0;
system_load.tasks[i].curr_start_time = 0;
system_load.tasks[i].tcb = tcb;
system_load.tasks[i].valid = true;
system_load.total_count++;
break;
if (system_load.initialized) {
for (i = 1; i < CONFIG_MAX_TASKS; i++) {
if (!system_load.tasks[i].valid) {
/* slot is available */
system_load.tasks[i].total_runtime = 0;
system_load.tasks[i].curr_start_time = 0;
system_load.tasks[i].tcb = tcb;
system_load.tasks[i].valid = true;
system_load.total_count++;
break;
}
}
}
}
......@@ -121,47 +128,49 @@ void sched_note_stop(FAR struct tcb_s *tcb)
{
int i;
for (i = 1; i < CONFIG_MAX_TASKS; i++) {
if (system_load.tasks[i].tcb->pid == tcb->pid) {
/* mark slot as fee */
system_load.tasks[i].valid = false;
system_load.tasks[i].total_runtime = 0;
system_load.tasks[i].curr_start_time = 0;
system_load.tasks[i].tcb = NULL;
system_load.total_count--;
break;
if (system_load.initialized) {
for (i = 1; i < CONFIG_MAX_TASKS; i++) {
if (system_load.tasks[i].tcb != 0 && system_load.tasks[i].tcb->pid == tcb->pid) {
/* mark slot as fee */
system_load.tasks[i].valid = false;
system_load.tasks[i].total_runtime = 0;
system_load.tasks[i].curr_start_time = 0;
system_load.tasks[i].tcb = NULL;
system_load.total_count--;
break;
}
}
}
}
void sched_note_switch(FAR struct tcb_s *pFromTcb, FAR struct tcb_s *pToTcb)
void sched_note_suspend(FAR struct tcb_s *tcb)
{
uint64_t new_time = hrt_absolute_time();
/* Kind of inefficient: find both tasks and update times */
uint8_t both_found = 0;
for (int i = 0; i < CONFIG_MAX_TASKS; i++) {
/* Check if task is initialized correctly */
if (system_load.tasks[i].tcb == NULL) {
continue;
if (system_load.initialized) {
for (int i = 0; i < CONFIG_MAX_TASKS; i++) {
/* Task ending its current scheduling run */
if (system_load.tasks[i].valid && system_load.tasks[i].tcb != 0 && system_load.tasks[i].tcb->pid == tcb->pid) {
system_load.tasks[i].total_runtime += new_time - system_load.tasks[i].curr_start_time;
break;
}
}
}
}
/* Task ending its current scheduling run */
if (system_load.tasks[i].tcb->pid == pFromTcb->pid) {
system_load.tasks[i].total_runtime += new_time - system_load.tasks[i].curr_start_time;
both_found++;
} else if (system_load.tasks[i].tcb->pid == pToTcb->pid) {
system_load.tasks[i].curr_start_time = new_time;
both_found++;
}
void sched_note_resume(FAR struct tcb_s *tcb)
{
uint64_t new_time = hrt_absolute_time();
/* Do only iterate as long as needed */
if (both_found == 2) {
break;
if (system_load.initialized) {
for (int i = 0; i < CONFIG_MAX_TASKS; i++) {
if (system_load.tasks[i].valid && system_load.tasks[i].tcb->pid == tcb->pid) {
system_load.tasks[i].curr_start_time = new_time;
break;
}
}
}
}
#else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment