Commit 8b89b936 authored by julien.delange's avatar julien.delange

* po-hi-c/include/po_hi_gqueue.h

   po-hi-c/src/po_hi_gqueue.c

 * po-hi-c/include/po_hi_transport.h
   po-hi-c/include/po_hi_types.h
   po-hi-c/src/po_hi_main.c
   po-hi-c/src/po_hi_transport.c
   - Integrate Xtratum calls


 * po-hi-c/examples/aadlv2/ping/software.aadl
   po-hi-c/examples/aadlv2/ping/ping-xtratum.aadl
   po-hi-c/examples/aadlv2/ping/xtratum_polling.c
   - Complete the Xtratum example with the poller.




git-svn-id: https://tecsw.estec.esa.int/svn/taste/trunk/po-hi-c@2400 129961e7-ef38-4bb5-a8f7-c9a525a55882
parent df758609
...@@ -26,13 +26,38 @@ features ...@@ -26,13 +26,38 @@ features
Data_Sink : in event data port Software::Simple_Type; Data_Sink : in event data port Software::Simple_Type;
end B; end B;
subprogram do_ports_polling
properties
source_language => C;
source_name => "user_ports_polling";
source_text => ("xtratum_polling.c");
end do_ports_polling;
thread xtratum_poller
end xtratum_poller;
thread implementation xtratum_poller.i
calls
Mycalls: {
P_Spg : subprogram do_ports_polling;
};
properties
Dispatch_Protocol => Periodic;
Period => 100 Ms;
Compute_Execution_time => 0 ms .. 3 ms;
Deadline => 100 ms;
end xtratum_poller.i;
process implementation B.Impl process implementation B.Impl
subcomponents subcomponents
Ping_Me : thread Software::Q.Impl; Ping_Me : thread Software::Q.Impl;
poll_port : thread xtratum_poller.i;
connections connections
port Data_Sink -> Ping_Me.Data_Sink; port Data_Sink -> Ping_Me.Data_Sink;
end B.Impl; end B.Impl;
memory myram memory myram
end myram; end myram;
......
...@@ -17,6 +17,7 @@ data Simple_Type ...@@ -17,6 +17,7 @@ data Simple_Type
properties properties
Type_Source_Name => "custom_int"; Type_Source_Name => "custom_int";
Source_Text => ("ping"); Source_Text => ("ping");
Source_Data_Size => 8 Bytes;
end Simple_Type; end Simple_Type;
----------------- -----------------
...@@ -41,6 +42,7 @@ properties ...@@ -41,6 +42,7 @@ properties
source_text => ("ping.c"); source_text => ("ping.c");
end Ping_Spg; end Ping_Spg;
------------- -------------
-- Threads -- -- Threads --
------------- -------------
......
#include <stdio.h>
#include <deployment.h>
#include <po_hi_types.h>
#include <po_hi_transport.h>
#include <po_hi_gqueue.h>
#include <request.h>
#include <xm.h>
void user_ports_polling ()
{
__po_hi_port_t portno;
__po_hi_node_t mynode;
__po_hi_node_t tmpnode;
__po_hi_request_t request;
__po_hi_port_kind_t pkind;
int ret;
mynode = __po_hi_transport_get_mynode ();
for (portno = 0 ; portno < __PO_HI_NB_PORTS ; portno++)
{
pkind = __po_hi_transport_get_port_kind (portno);
tmpnode = __po_hi_transport_get_node_from_entity (__po_hi_get_entity_from_global_port (portno));
ret = -1;
if (tmpnode == mynode)
{
if (pkind == __PO_HI_IN_DATA_INTER_PROCESS)
{
ret = XM_read_sampling_message (__po_hi_transport_xtratum_get_port (portno),
&request,
sizeof (__po_hi_request_t), 0);
}
if (pkind == __PO_HI_IN_EVENT_DATA_INTER_PROCESS)
{
ret = XM_receive_queuing_message (__po_hi_transport_xtratum_get_port (portno),
&request,
sizeof (__po_hi_request_t));
}
printf ("[XTRATUM POLLER] Poll port %d, corresponding xtratum port = %d, return=%d\n", portno, __po_hi_transport_xtratum_get_port (portno), ret);
if (ret > 0)
{
__po_hi_main_deliver (&request);
}
}
}
}
...@@ -132,4 +132,6 @@ __po_hi_request_t* __po_hi_gqueue_get_most_recent_value ...@@ -132,4 +132,6 @@ __po_hi_request_t* __po_hi_gqueue_get_most_recent_value
__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);
#endif /* __PO_HI_GQUEUE_H__ */ #endif /* __PO_HI_GQUEUE_H__ */
...@@ -51,6 +51,25 @@ char* __po_hi_get_device_naming (const __po_hi_device_id dev); ...@@ -51,6 +51,25 @@ char* __po_hi_get_device_naming (const __po_hi_device_id dev);
__po_hi_uint32_t* __po_hi_get_device_configuration (const __po_hi_device_id); __po_hi_uint32_t* __po_hi_get_device_configuration (const __po_hi_device_id);
__po_hi_uint32_t __po_hi_transport_get_data_size (const __po_hi_port_t portno);
__po_hi_uint32_t __po_hi_transport_get_queue_size (const __po_hi_port_t portno);
__po_hi_port_kind_t __po_hi_transport_get_port_kind (const __po_hi_port_t portno);
char* __po_hi_transport_get_model_name (const __po_hi_port_t portno);
__po_hi_node_t __po_hi_transport_get_mynode (void);
#ifdef XM3_RTEMS_MODE
void __po_hi_transport_xtratum_port_init (const __po_hi_port_t portno, int val);
int __po_hi_transport_xtratum_get_port (const __po_hi_port_t portno);
#endif
#endif /* __PO_HI_NB_PORTS > 0 */ #endif /* __PO_HI_NB_PORTS > 0 */
#endif /* __PO_HI_TRANSPORT__ */ #endif /* __PO_HI_TRANSPORT__ */
...@@ -96,7 +96,8 @@ typedef enum ...@@ -96,7 +96,8 @@ typedef enum
__PO_HI_IN_EVENT_INTER_PROCESS = 16, __PO_HI_IN_EVENT_INTER_PROCESS = 16,
__PO_HI_OUT_EVENT_INTER_PROCESS = 18, __PO_HI_OUT_EVENT_INTER_PROCESS = 18,
__PO_HI_IN_EVENT_INTRA_PROCESS = 20, __PO_HI_IN_EVENT_INTRA_PROCESS = 20,
__PO_HI_OUT_EVENT_INTRA_PROCESS = 22 __PO_HI_OUT_EVENT_INTRA_PROCESS = 22,
__PO_HI_INVALID_PORT_KIND = 50
}__po_hi_port_kind_t; }__po_hi_port_kind_t;
void __po_hi_copy_array (void* dst, void* src, __po_hi_uint16_t size); void __po_hi_copy_array (void* dst, void* src, __po_hi_uint16_t size);
......
...@@ -570,3 +570,5 @@ __po_hi_port_t __po_hi_gqueue_get_destination (const __po_hi_task_id task_id, co ...@@ -570,3 +570,5 @@ __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]); return (__po_hi_gqueues_destinations[task_id][local_port][destination_number]);
} }
...@@ -203,54 +203,46 @@ int __po_hi_initialize () ...@@ -203,54 +203,46 @@ int __po_hi_initialize ()
#ifdef XM3_RTEMS_MODE #ifdef XM3_RTEMS_MODE
#include <deployment.h> #include <deployment.h>
#include <po_hi_types.h> #include <po_hi_types.h>
#include <po_hi_transport.h>
#include <xm.h> #include <xm.h>
extern __po_hi_node_t __po_hi_mynode; __po_hi_port_kind_t pkind;
extern __po_hi_entity_t __po_hi_port_global_to_entity[__PO_HI_NB_PORTS]; __po_hi_port_t tmp;
extern __po_hi_node_t __po_hi_entity_table[__PO_HI_NB_ENTITIES]; __po_hi_node_t tmpnode;
extern __po_hi_port_kind_t __po_hi_port_global_kind[__PO_HI_NB_PORTS]; __po_hi_node_t mynode;
extern char* __po_hi_port_global_model_names[__PO_HI_NB_PORTS]; int portno;
__po_hi_port_t tmp; mynode = __po_hi_transport_get_mynode ();
for (tmp = 0 ; tmp < __PO_HI_NB_PORTS ; tmp++) for (tmp = 0 ; tmp < __PO_HI_NB_PORTS ; tmp++)
{ {
if ((__po_hi_entity_table[__po_hi_port_global_to_entity[tmp]] == __po_hi_mynode) && pkind = __po_hi_transport_get_port_kind (tmp);
( (__po_hi_port_global_kind[tmp] == __PO_HI_IN_DATA_INTER_PROCESS) || tmpnode = __po_hi_transport_get_node_from_entity (__po_hi_get_entity_from_global_port (tmp));
(__po_hi_port_global_kind[tmp] == __PO_HI_OUT_DATA_INTER_PROCESS) || if ((tmpnode == mynode) &&
(__po_hi_port_global_kind[tmp] == __PO_HI_IN_EVENT_DATA_INTER_PROCESS) || ( (pkind == __PO_HI_IN_DATA_INTER_PROCESS) ||
(__po_hi_port_global_kind[tmp] == __PO_HI_OUT_EVENT_DATA_INTER_PROCESS) (pkind == __PO_HI_OUT_DATA_INTER_PROCESS) ||
(pkind == __PO_HI_IN_EVENT_DATA_INTER_PROCESS) ||
(pkind == __PO_HI_OUT_EVENT_DATA_INTER_PROCESS)
)) ))
{ {
__DEBUGMSG ("[MAIN] Should init port %d\n", tmp); __DEBUGMSG ("[MAIN] Should init port %d\n", tmp);
switch (__po_hi_port_global_kind[tmp]) portno = -1;
switch (pkind)
{ {
case __PO_HI_IN_DATA_INTER_PROCESS: case __PO_HI_IN_DATA_INTER_PROCESS:
if (XM_create_sampling_port (__po_hi_port_global_model_names [tmp], 8, XM_DESTINATION_PORT) < 0) portno = XM_create_sampling_port (__po_hi_transport_get_model_name (tmp), __po_hi_transport_get_queue_size (tmp), XM_DESTINATION_PORT);
{
__DEBUGMSG ("[MAIN] Sampling destination port %d cannot be created !\n", tmp);
}
break; break;
case __PO_HI_OUT_DATA_INTER_PROCESS: case __PO_HI_OUT_DATA_INTER_PROCESS:
if (XM_create_sampling_port (__po_hi_port_global_model_names [tmp], 8, XM_SOURCE_PORT) < 0) portno = XM_create_sampling_port (__po_hi_transport_get_model_name (tmp), __po_hi_transport_get_queue_size (tmp), XM_SOURCE_PORT);
{
__DEBUGMSG ("[MAIN] Sampling source port %d cannot be created !\n", tmp);
}
break; break;
case __PO_HI_IN_EVENT_DATA_INTER_PROCESS: case __PO_HI_IN_EVENT_DATA_INTER_PROCESS:
if (XM_create_queuing_port (__po_hi_port_global_model_names [tmp], 1, 8, XM_DESTINATION_PORT) < 0) portno = XM_create_queuing_port (__po_hi_transport_get_model_name (tmp), __po_hi_transport_get_queue_size (tmp), __po_hi_transport_get_data_size (tmp), XM_DESTINATION_PORT);
{
__DEBUGMSG ("[MAIN] Queuing destination port %d cannot be created !\n", tmp);
}
break; break;
case __PO_HI_OUT_EVENT_DATA_INTER_PROCESS: case __PO_HI_OUT_EVENT_DATA_INTER_PROCESS:
if (XM_create_queuing_port (__po_hi_port_global_model_names [tmp], 1, 8, XM_SOURCE_PORT) < 0) portno = XM_create_queuing_port (__po_hi_transport_get_model_name (tmp), __po_hi_transport_get_queue_size (tmp), __po_hi_transport_get_data_size (tmp), XM_SOURCE_PORT);
{
__DEBUGMSG ("[MAIN] Queuing source port %d cannot be created !\n", tmp);
}
break; break;
default: default:
...@@ -258,6 +250,16 @@ int __po_hi_initialize () ...@@ -258,6 +250,16 @@ int __po_hi_initialize ()
break; break;
} }
if (portno < 0)
{
__DEBUGMSG ("[MAIN] Cannot open port %d, name=%s, return=%d\n", tmp, __po_hi_transport_get_model_name (tmp), portno);
}
else
{
__po_hi_transport_xtratum_port_init (tmp, portno);
__DEBUGMSG ("[MAIN] Port %d (name=%s) created, identifier = %d\n", tmp, __po_hi_transport_get_model_name (tmp), portno);
}
} }
} }
#endif #endif
......
...@@ -44,6 +44,16 @@ extern char* __po_hi_devices_naming[__PO_HI_NB_DEVICES]; ...@@ -44,6 +44,16 @@ extern char* __po_hi_devices_naming[__PO_HI_NB_DEVICES];
extern __po_hi_uint32_t* __po_hi_devices_configuration_values[__PO_HI_NB_DEVICES]; extern __po_hi_uint32_t* __po_hi_devices_configuration_values[__PO_HI_NB_DEVICES];
#endif #endif
#ifdef XM3_RTEMS_MODE
#include <deployment.h>
#include <po_hi_types.h>
#include <po_hi_transport.h>
#include <xm.h>
int __po_hi_xtratum_port[__PO_HI_NB_PORTS];
#endif
int __po_hi_transport_send_default (__po_hi_task_id id, __po_hi_port_t port) int __po_hi_transport_send_default (__po_hi_task_id id, __po_hi_port_t port)
{ {
__po_hi_msg_t msg; __po_hi_msg_t msg;
...@@ -100,6 +110,32 @@ int __po_hi_transport_send_default (__po_hi_task_id id, __po_hi_port_t port) ...@@ -100,6 +110,32 @@ int __po_hi_transport_send_default (__po_hi_task_id id, __po_hi_port_t port)
__PO_HI_DEBUG_DEBUG (" [deliver locally]\n"); __PO_HI_DEBUG_DEBUG (" [deliver locally]\n");
__po_hi_main_deliver (request); __po_hi_main_deliver (request);
} }
#ifdef XM3_RTEMS_MODE
else
{
__po_hi_port_kind_t pkind = __po_hi_transport_get_port_kind (port);
int ret;
ret = -1;
if (pkind == __PO_HI_OUT_DATA_INTER_PROCESS)
{
ret = XM_write_sampling_message (__po_hi_xtratum_port[port], request, sizeof (__po_hi_request_t));
}
if (pkind == __PO_HI_OUT_EVENT_DATA_INTER_PROCESS)
{
ret = XM_send_queuing_message (__po_hi_xtratum_port[port], request, sizeof (__po_hi_request_t));
}
if (ret < 0)
{
__PO_HI_DEBUG_DEBUG ("[GQUEUE] Cannot deliver the data using inter-partitions ports, return=%d\n", ret);
}
else
{
__PO_HI_DEBUG_DEBUG ("[GQUEUE] Data delivered using inter-partitions ports, return=%d\n", ret);
}
}
#endif
} }
request->port = __PO_HI_GQUEUE_INVALID_PORT; request->port = __PO_HI_GQUEUE_INVALID_PORT;
...@@ -115,6 +151,13 @@ __po_hi_node_t __po_hi_transport_get_node_from_entity (const __po_hi_entity_t en ...@@ -115,6 +151,13 @@ __po_hi_node_t __po_hi_transport_get_node_from_entity (const __po_hi_entity_t en
return __po_hi_entity_table[entity]; return __po_hi_entity_table[entity];
} }
__po_hi_node_t __po_hi_transport_get_mynode (void)
{
extern __po_hi_node_t __po_hi_mynode;
return (__po_hi_mynode);
}
__po_hi_entity_t __po_hi_get_entity_from_global_port (const __po_hi_port_t port) __po_hi_entity_t __po_hi_get_entity_from_global_port (const __po_hi_port_t port)
{ {
return __po_hi_port_global_to_entity[port]; return __po_hi_port_global_to_entity[port];
...@@ -163,3 +206,78 @@ __po_hi_uint32_t* __po_hi_get_device_configuration (const __po_hi_device_id dev) ...@@ -163,3 +206,78 @@ __po_hi_uint32_t* __po_hi_get_device_configuration (const __po_hi_device_id dev)
#endif #endif
char* __po_hi_transport_get_model_name (const __po_hi_port_t portno)
{
extern char* __po_hi_port_global_model_names[__PO_HI_NB_PORTS];
if (portno >= __PO_HI_NB_PORTS)
{
__DEBUGMSG ("[TRANSPORT] Try to get the name of a non-existing port\n");
return NULL;
}
else
{
return __po_hi_port_global_model_names[portno];
}
}
__po_hi_uint32_t __po_hi_transport_get_queue_size (const __po_hi_port_t portno)
{
extern __po_hi_uint32_t __po_hi_port_global_queue_size[__PO_HI_NB_PORTS];
if (portno >= __PO_HI_NB_PORTS)
{
__DEBUGMSG ("[TRANSPORT] Try to get the queue size of a non-existing port\n");
return 1;
}
else
{
return __po_hi_port_global_queue_size[portno];
}
}
__po_hi_uint32_t __po_hi_transport_get_data_size (const __po_hi_port_t portno)
{
extern __po_hi_uint32_t __po_hi_port_global_data_size[__PO_HI_NB_PORTS];
if (portno >= __PO_HI_NB_PORTS)
{
__DEBUGMSG ("[TRANSPORT] Try to get the data size of a non-existing port\n");
return 1;
}
else
{
return __po_hi_port_global_data_size[portno];
}
}
__po_hi_port_kind_t __po_hi_transport_get_port_kind (const __po_hi_port_t portno)
{
extern __po_hi_port_kind_t __po_hi_port_global_kind[__PO_HI_NB_PORTS];
if (portno >= __PO_HI_NB_PORTS)
{
__DEBUGMSG ("[TRANSPORT] Try to get the type/kind of a non-existing port\n");
return __PO_HI_INVALID_PORT_KIND;
}
else
{
return __po_hi_port_global_kind[portno];
}
}
#ifdef XM3_RTEMS_MODE
void __po_hi_transport_xtratum_port_init (const __po_hi_port_t portno, int val)
{
__po_hi_xtratum_port[portno] = val;
}
int __po_hi_transport_xtratum_get_port (const __po_hi_port_t portno)
{
return __po_hi_xtratum_port[portno];
}
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment