Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
PolyORB-HI-C
Commits
412d12e0
Commit
412d12e0
authored
Jun 02, 2015
by
yoogx
Browse files
* Include monitoring API in PolyORB-HI/C runtime and build
infrastructure For issue
#5
parent
f1ff3ef4
Changes
7
Hide whitespace changes
Inline
Side-by-side
configure.ac
View file @
412d12e0
...
...
@@ -185,9 +185,12 @@ AC_OUTPUT([
src/Makefile
src/drivers/Makefile
src/drivers/configuration/Makefile
src/monitoring/Makefile
src/monitoring/cheddar_scheduling/Makefile
include/Makefile
include/drivers/Makefile
include/drivers/configuration/Makefile
include/monitoring/Makefile
examples/Makefile
examples/aadlv1/Makefile
examples/aadlv1/d3.1.3-1/Makefile
...
...
include/Makefile.am
View file @
412d12e0
AUTOMAKE_OPTIONS
=
no-dependencies
SUBDIRS
=
drivers
SUBDIRS
=
drivers monitoring
EXTRA_DIST
=
$(srcdir)
/po_hi_common.h
\
$(srcdir)
/po_hi_debug.h
\
$(srcdir)
/po_hi_marshallers.h
\
...
...
include/po_hi_gqueue.h
View file @
412d12e0
...
...
@@ -53,8 +53,8 @@ void __po_hi_gqueue_init (__po_hi_task_id id,
* total_fifo_size gives the total size of the global queue
*/
void
__po_hi_gqueue_store_out
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
void
__po_hi_gqueue_store_out
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_request_t
*
request
);
/* Store a value for an OUT port.
*
...
...
@@ -63,10 +63,10 @@ void __po_hi_gqueue_store_out (__po_hi_task_id id,
* last argument is the request to store in the queue.
*/
int
__po_hi_gqueue_send_output
(
__po_hi_task_id
id
,
int
__po_hi_gqueue_send_output
(
__po_hi_task_id
id
,
__po_hi_port_t
port
);
/*
* Send a value for an out port.
* Send a value for an out port.
*
* The first argument is the id of the task which have the global
* queue. The second argument is the number of port that will send the
...
...
@@ -74,11 +74,11 @@ int __po_hi_gqueue_send_output (__po_hi_task_id id,
*/
int
__po_hi_gqueue_get_value
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
int
__po_hi_gqueue_get_value
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_request_t
*
request
);
/*
* Get the value on the specified port.
* Get the value on the specified port.
*
* The id parameter corresponds to the task-id in the local
* process. The port argument is the number of the port that received
...
...
@@ -87,7 +87,7 @@ int __po_hi_gqueue_get_value(__po_hi_task_id id,
* but will not produce an error.
*/
int
__po_hi_gqueue_next_value
(
__po_hi_task_id
id
,
int
__po_hi_gqueue_next_value
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
);
/*
* Dequeue the value on a port. The argument id is the task identifier
...
...
@@ -96,7 +96,7 @@ int __po_hi_gqueue_next_value(__po_hi_task_id id,
* you know what you do.
*/
int
__po_hi_gqueue_get_count
(
__po_hi_task_id
id
,
int
__po_hi_gqueue_get_count
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
);
/*
* Return the number of events that are pending of a port. The first
...
...
@@ -104,7 +104,7 @@ int __po_hi_gqueue_get_count(__po_hi_task_id id,
* argument is the port identifier (or port number) for the thread.
*/
void
__po_hi_gqueue_wait_for_incoming_event
(
__po_hi_task_id
id
,
void
__po_hi_gqueue_wait_for_incoming_event
(
__po_hi_task_id
id
,
__po_hi_local_port_t
*
port
);
/*
* Wait until an event is received on any port for a given thread. The
...
...
@@ -114,8 +114,8 @@ void __po_hi_gqueue_wait_for_incoming_event(__po_hi_task_id id,
* the event.
*/
__po_hi_uint8_t
__po_hi_gqueue_store_in
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_uint8_t
__po_hi_gqueue_store_in
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_request_t
*
request
);
/*
* Store a value in a IN port. The first argument is the task
...
...
@@ -124,14 +124,37 @@ __po_hi_uint8_t __po_hi_gqueue_store_in (__po_hi_task_id id,
* request that will be stored in the queue.
*/
__po_hi_request_t
*
__po_hi_gqueue_get_most_recent_value
__po_hi_request_t
*
__po_hi_gqueue_get_most_recent_value
(
const
__po_hi_task_id
task_id
,
const
__po_hi_local_port_t
local_port
);
__po_hi_port_t
__po_hi_gqueue_get_destination
(
const
__po_hi_task_id
task_id
,
const
__po_hi_local_port_t
local_port
,
const
uint8_t
destination_number
);
__po_hi_port_t
__po_hi_gqueue_get_destination
(
const
__po_hi_task_id
task_id
,
const
__po_hi_local_port_t
local_port
,
const
uint8_t
destination_number
);
uint8_t
__po_hi_gqueue_get_destinations_number
(
const
__po_hi_task_id
task_id
,
const
__po_hi_local_port_t
local_port
);
uint8_t
__po_hi_gqueue_get_destinations_number
(
const
__po_hi_task_id
task_id
,
const
__po_hi_local_port_t
local_port
);
/*
* Access the size of a port. The first argument is the task
* identifier in the local process. The second argument is the port
* identifier for the local thread.
*/
__po_hi_int8_t
__po_hi_gqueue_get_port_size
(
const
__po_hi_task_id
id
,
const
__po_hi_local_port_t
port
);
/*
* Access the used size of a port. The first argument is the task
* identifier in the local process. The second argument is the port
* identifier for the local thread.
*/
__po_hi_int8_t
__po_hi_gqueue_used_size
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
);
__po_hi_int8_t
po_hi_gqueues_queue_is_empty
(
__po_hi_task_id
id
);
__po_hi_request_t
*
__po_hi_gqueues_get_request
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
);
#endif
/* __PO_HI_GQUEUE_H__ */
src/Makefile.am
View file @
412d12e0
AUTOMAKE_OPTIONS
=
no-dependencies
SUBDIRS
=
drivers
SUBDIRS
=
drivers
monitoring
C_FILES
=
$(srcdir)
/po_hi_task.c
\
$(srcdir)
/po_hi_main.c
\
...
...
src/po_hi_gqueue.c
View file @
412d12e0
...
...
@@ -37,7 +37,9 @@
#include
<native/mutex.h>
#endif
#if defined (MONITORING)
/* Headers from run-time verification */
#include
<trace_manager.hh>
#endif
#define __PO_HI_GQUEUE_OUT_PORT constant_out_identifier
/* give a default value to the out port */
...
...
@@ -225,7 +227,6 @@ void __po_hi_gqueue_init (__po_hi_task_id id,
#endif
}
void
__po_hi_gqueue_store_out
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_request_t
*
request
)
...
...
@@ -238,8 +239,6 @@ void __po_hi_gqueue_store_out (__po_hi_task_id id,
__PO_HI_DEBUG_DEBUG
(
"__po_hi_gqueue_store_out() from task %d on port %d
\n
"
,
id
,
port
);
}
__po_hi_uint8_t
__po_hi_gqueue_store_in
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_request_t
*
request
)
...
...
@@ -354,6 +353,7 @@ __po_hi_uint8_t __po_hi_gqueue_store_in (__po_hi_task_id id,
return
__PO_HI_SUCCESS
;
}
void
__po_hi_gqueue_wait_for_incoming_event
(
__po_hi_task_id
id
,
__po_hi_local_port_t
*
port
)
{
...
...
@@ -424,6 +424,7 @@ void __po_hi_gqueue_wait_for_incoming_event (__po_hi_task_id id,
__DEBUGMSG
(
"[GQUEUE] Gogo kiki
\n
"
);
*
port
=
__po_hi_gqueues_global_history
[
id
][
__po_hi_gqueues_global_history_offset
[
id
]];
#if defined (POSIX) || defined (RTEMS_POSIX) || defined (XENO_POSIX)
pthread_mutex_unlock
(
&
__po_hi_gqueues_mutexes
[
id
]);
#elif defined (XENO_NATIVE)
...
...
@@ -442,6 +443,7 @@ void __po_hi_gqueue_wait_for_incoming_event (__po_hi_task_id id,
}
int
__po_hi_gqueue_get_count
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
)
{
if
(
__po_hi_gqueues_sizes
[
id
][
port
]
==
__PO_HI_GQUEUE_FIFO_INDATA
)
...
...
@@ -454,6 +456,7 @@ int __po_hi_gqueue_get_count( __po_hi_task_id id, __po_hi_local_port_t port)
}
}
int
__po_hi_gqueue_get_value
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
,
__po_hi_request_t
*
request
)
...
...
@@ -495,6 +498,7 @@ int __po_hi_gqueue_get_value (__po_hi_task_id id,
#if defined (POSIX) || defined (RTEMS_POSIX) || defined (XENO_POSIX)
pthread_cond_wait
(
&
__po_hi_gqueues_conds
[
id
],
&
__po_hi_gqueues_mutexes
[
id
]);
#elif defined (XENO_NATIVE)
rt_cond_wait
(
&
__po_hi_gqueues_conds
[
id
],
&
__po_hi_gqueues_mutexes
[
id
],
TM_INFINITE
);
#elif defined (RTEMS_PURE)
...
...
@@ -512,9 +516,14 @@ int __po_hi_gqueue_get_value (__po_hi_task_id id,
}
}
#if defined (MONITORING)
update_sporadic_dispatch
(
id
,
port
);
#endif
if
(
__po_hi_gqueues_used_size
[
id
][
port
]
==
0
)
{
memcpy
(
request
,
ptr
,
sizeof
(
__po_hi_request_t
));
//update_runtime (id, port, ptr);
}
else
{
...
...
@@ -525,28 +534,6 @@ int __po_hi_gqueue_get_value (__po_hi_task_id id,
__PO_HI_DEBUG_INFO
(
"[GQUEUE] Task %d get a value on port %d
\n
"
,
id
,
port
);
/*
* As this part of the code is now considered as stable, we don't print debug output
*
__DEBUGMSG ("RECEIVED vars in gqueue: |");
{
int s;
int i;
uint8_t* tmp;
tmp = (unsigned int*) &request->vars;
s = sizeof (request->vars);
for (i = 0 ; i < s ; i++)
{
printf("%x", *tmp);
tmp++;
fflush (stdout);
}
}
__DEBUGMSG ("|\n");
#endif
*/
#if defined (POSIX) || defined (RTEMS_POSIX) || defined (XENO_POSIX)
pthread_mutex_unlock
(
&
__po_hi_gqueues_mutexes
[
id
]);
#elif defined (XENO_NATIVE)
...
...
@@ -570,7 +557,6 @@ int __po_hi_gqueue_next_value (__po_hi_task_id id, __po_hi_local_port_t port)
rtems_status_code
ret
;
#endif
/* incomplete semantics, should discriminate and report whether
there is a next value or not */
...
...
@@ -649,3 +635,38 @@ __po_hi_port_t __po_hi_gqueue_get_destination (const __po_hi_task_id task_id, co
{
return
(
__po_hi_gqueues_destinations
[
task_id
][
local_port
][
destination_number
]);
}
__po_hi_int8_t
__po_hi_gqueue_get_port_size
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
)
{
return
__po_hi_gqueues_sizes
[
id
][
port
];
}
__po_hi_int8_t
__po_hi_gqueue_used_size
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
)
{
return
__po_hi_gqueues_used_size
[
id
][
port
];
}
__po_hi_int8_t
po_hi_gqueues_queue_is_empty
(
__po_hi_task_id
id
)
{
return
__po_hi_gqueues_queue_is_empty
[
id
];
}
__po_hi_request_t
*
__po_hi_gqueues_get_request
(
__po_hi_task_id
id
,
__po_hi_local_port_t
port
)
{
__po_hi_request_t
*
request
;
__po_hi_request_t
*
ptr
;
if
(
__po_hi_gqueues_used_size
[
id
][
port
]
==
0
)
{
memcpy
(
request
,
ptr
,
sizeof
(
__po_hi_request_t
));
//update_runtime (id, port, ptr);
}
else
{
ptr
=
((
__po_hi_request_t
*
)
&
__po_hi_gqueues
[
id
][
port
])
+
__po_hi_gqueues_first
[
id
][
port
]
+
__po_hi_gqueues_offsets
[
id
][
port
];
memcpy
(
request
,
ptr
,
sizeof
(
__po_hi_request_t
));
}
return
request
;
}
src/po_hi_main.c
View file @
412d12e0
...
...
@@ -8,7 +8,6 @@
* Copyright (C) 2010-2014 ESA & ISAE.
*/
#include
<deployment.h>
/* included files from the generated code */
...
...
@@ -22,6 +21,11 @@
#include
<po_hi_utils.h>
/* included files from PolyORB-HI-C */
#if defined (MONITORING)
#include
<trace_manager.hh>
#endif
/* Headers from run-time verification */
#if defined (POSIX) || defined (RTEMS_POSIX) || defined (XENO_POSIX)
#include
<pthread.h>
/* POSIX files */
...
...
@@ -59,7 +63,7 @@ RT_TASK* main_task_id;
* between the main task and the other tasks.
*
* For that reason, the main task does not wait for
* the initialization of the other tasks. The
* the initialization of the other tasks. The
* __po_hi_wait_initialization just passes when it is
* called from the main task. To do that, we need
* to differentiate the main task from the other,
...
...
@@ -97,7 +101,7 @@ int __po_hi_initialize_early ()
#if defined (XENO_POSIX) || defined (XENO_NATIVE)
/*
* Once initialization has been done, we avoid ALL
* Once initialization has been done, we avoid ALL
* potential paging operations that can introduce
* some indeterministic timing behavior.
*/
...
...
@@ -186,7 +190,7 @@ int __po_hi_initialize_early ()
#ifdef RTEMS_PURE
__DEBUGMSG
(
"[MAIN] Create a barrier that wait for %d tasks
\n
"
,
__po_hi_nb_tasks_to_init
);
ret
=
rtems_barrier_create
(
rtems_build_name
(
'B'
,
'A'
,
'R'
,
'M'
),
RTEMS_BARRIER_AUTOMATIC_RELEASE
,
__po_hi_nb_tasks_to_init
,
&
__po_hi_main_initialization_barrier
);
if
(
ret
!=
RTEMS_SUCCESSFUL
)
{
...
...
@@ -226,7 +230,7 @@ int __po_hi_initialize ()
#include
<po_hi_transport.h>
#include
<xm.h>
__po_hi_port_kind_t
pkind
;
__po_hi_port_kind_t
pkind
;
__po_hi_port_t
tmp
;
__po_hi_node_t
tmpnode
;
__po_hi_node_t
mynode
;
...
...
@@ -284,6 +288,14 @@ int __po_hi_initialize ()
}
#endif
/*!
* Initialize the monitoring trace if needed
*/
#if defined (MONITORING)
trace_initialize
();
#endif
return
(
__PO_HI_SUCCESS
);
}
...
...
@@ -310,7 +322,7 @@ int __po_hi_wait_initialization ()
__po_hi_initialized_tasks
++
;
__DEBUGMSG
(
"[MAIN] %d task(s) initialized (total to init =%d)
\n
"
,
__po_hi_initialized_tasks
,
__po_hi_nb_tasks_to_init
);
while
(
__po_hi_initialized_tasks
<
__po_hi_nb_tasks_to_init
)
{
pthread_cond_wait
(
&
cond_init
,
&
mutex_init
);
...
...
@@ -327,11 +339,11 @@ int __po_hi_wait_initialization ()
__po_hi_initialized_tasks
++
;
__DEBUGMSG
(
"[MAIN] %d task(s) initialized (total to init =%d)
\n
"
,
__po_hi_initialized_tasks
,
__po_hi_nb_tasks_to_init
);
while
(
__po_hi_initialized_tasks
<
__po_hi_nb_tasks_to_init
)
{
LeaveCriticalSection
(
&
__po_hi_main_initialization_critical_section
);
WaitForSingleObject
(
__po_hi_main_initialization_event
,
INFINITE
);
WaitForSingleObject
(
__po_hi_main_initialization_event
,
INFINITE
);
EnterCriticalSection
(
&
__po_hi_main_initialization_critical_section
);
}
...
...
@@ -339,7 +351,7 @@ int __po_hi_wait_initialization ()
LeaveCriticalSection
(
&
__po_hi_main_initialization_critical_section
);
return
(
__PO_HI_SUCCESS
);
#elif defined (RTEMS_PURE)
#elif defined (RTEMS_PURE)
rtems_status_code
ret
;
__DEBUGMSG
(
"[MAIN] Task wait for the barrier
\n
"
);
...
...
@@ -375,7 +387,7 @@ int __po_hi_wait_initialization ()
__po_hi_initialized_tasks
++
;
__DEBUGMSG
(
"[MAIN] %d task(s) initialized (total to init =%d)
\n
"
,
__po_hi_initialized_tasks
,
__po_hi_nb_tasks_to_init
);
while
(
__po_hi_initialized_tasks
<
__po_hi_nb_tasks_to_init
)
{
rt_cond_wait
(
&
cond_init
,
&
mutex_init
,
TM_INFINITE
);
...
...
@@ -393,9 +405,9 @@ int __po_hi_wait_initialization ()
void
__po_hi_wait_end_of_instrumentation
()
{
#ifdef RTEMS_PURE
rtems_task_wake_after
(
10000000
/
_TOD_Microseconds_per_tick
);
rtems_task_wake_after
(
10000000
/
_TOD_Microseconds_per_tick
);
#else
#include
<po_hi_time.h>
#include
<po_hi_time.h>
#include
<unistd.h>
__po_hi_time_t
now
;
...
...
src/po_hi_task.c
View file @
412d12e0
...
...
@@ -48,6 +48,11 @@
#include
<po_hi_utils.h>
/* Header files in PolyORB-HI */
#if defined (MONITORING)
#include
<trace_manager.hh>
#endif
/* Headers from run-time verification */
#include
<deployment.h>
/* Header files from generated code */
...
...
@@ -90,6 +95,7 @@ __po_hi_task_t tasks[__PO_HI_NB_TASKS];
HANDLE
__po_hi_tasks_array
[
__PO_HI_NB_TASKS
];
#endif
void
__po_hi_wait_for_tasks
()
{
#if defined (RTEMS_POSIX) || defined (POSIX) || defined (XENO_POSIX)
...
...
@@ -170,12 +176,21 @@ int __po_hi_compute_next_period (__po_hi_task_id task)
#endif
}
int
__po_hi_wait_for_next_period
(
__po_hi_task_id
task
)
{
#if defined (POSIX) || defined (RTEMS_POSIX) || defined (XENO_POSIX)
int
ret
;
__PO_HI_INSTRUMENTATION_VCD_WRITE
(
"0t%d
\n
"
,
task
);
__po_hi_task_delay_until
(
&
(
tasks
[
task
].
timer
),
task
);
/*!
* Entry ports monitoring at dispatch if MONITORING is defined
*/
#if defined (MONITORING)
update_periodic_dispatch
(
task
);
#endif
if
(
(
ret
=
__po_hi_compute_next_period
(
task
))
!=
1
)
{
return
(
__PO_HI_ERROR_CLOCK
);
...
...
@@ -355,6 +370,7 @@ pthread_t __po_hi_posix_create_thread (__po_hi_priority_t priority,
return
tid
;
}
int
__po_hi_posix_initialize_task
(
__po_hi_task_t
*
task
)
{
if
(
pthread_mutex_init
(
&
(
task
->
mutex
),
NULL
)
!=
0
)
...
...
@@ -452,7 +468,6 @@ RT_TASK __po_hi_xenomai_create_thread (__po_hi_priority_t priority,
}
#endif
int
__po_hi_create_generic_task
(
const
__po_hi_task_id
id
,
const
__po_hi_time_t
*
period
,
const
__po_hi_priority_t
priority
,
...
...
@@ -511,6 +526,7 @@ int __po_hi_create_generic_task (const __po_hi_task_id id,
return
(
__PO_HI_SUCCESS
);
}
int
__po_hi_create_periodic_task
(
const
__po_hi_task_id
id
,
const
__po_hi_time_t
*
period
,
const
__po_hi_priority_t
priority
,
...
...
@@ -518,6 +534,14 @@ int __po_hi_create_periodic_task (const __po_hi_task_id id,
const
__po_hi_int8_t
core_id
,
void
*
(
*
start_routine
)(
void
))
{
/*
* Send Task type to trace manager, if there is monitoring.
*/
#if defined (MONITORING)
periodic_task_creation
(
id
);
#endif
if
(
__po_hi_create_generic_task
(
id
,
period
,
priority
,
stack_size
,
core_id
,
start_routine
,
NULL
)
!=
1
)
{
__DEBUGMSG
(
"ERROR when creating generic task (task id=%d)
\n
"
,
id
);
...
...
@@ -565,6 +589,13 @@ int __po_hi_create_sporadic_task (const __po_hi_task_id id,
const
__po_hi_int8_t
core_id
,
void
*
(
*
start_routine
)(
void
)
)
{
/*
* Send Task type to trace manager, if there is monitoring.
*/
#if defined (MONITORING)
sporadic_task_creation
(
id
);
#endif
/*
* Create generic task which will execute the routine given in the
* last parameter. Typically, a sporadic thread will wait on a
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment