Commit 838d73a7 authored by yoogx's avatar yoogx

* Add ISR_Task task kind for handling interrupts

parent c724edac
......@@ -2,20 +2,21 @@ SUBDIRS = drivers
# BEGIN: DO NOT DELETE THIS LINE
ADA_SPECS_WITH_BODY = $(srcdir)/polyorb_hi-aperiodic_task.ads \
$(srcdir)/polyorb_hi-background_task.ads \
$(srcdir)/polyorb_hi-hybrid_task.ads \
$(srcdir)/polyorb_hi-hybrid_task_driver.ads \
$(srcdir)/polyorb_hi-marshallers_g.ads \
$(srcdir)/polyorb_hi-messages.ads \
$(srcdir)/polyorb_hi-output.ads \
$(srcdir)/polyorb_hi-periodic_task.ads \
$(srcdir)/polyorb_hi-port_kinds.ads \
$(srcdir)/polyorb_hi-protocols.ads \
$(srcdir)/polyorb_hi-sporadic_task.ads \
$(srcdir)/polyorb_hi-suspenders.ads \
$(srcdir)/polyorb_hi-thread_interrogators.ads \
$(srcdir)/polyorb_hi-scheduler.ads \
$(srcdir)/polyorb_hi-utils.ads
$(srcdir)/polyorb_hi-background_task.ads \
$(srcdir)/polyorb_hi-hybrid_task.ads \
$(srcdir)/polyorb_hi-hybrid_task_driver.ads \
$(srcdir)/polyorb_hi-isr_task.ads \
$(srcdir)/polyorb_hi-marshallers_g.ads \
$(srcdir)/polyorb_hi-messages.ads \
$(srcdir)/polyorb_hi-output.ads \
$(srcdir)/polyorb_hi-periodic_task.ads \
$(srcdir)/polyorb_hi-port_kinds.ads \
$(srcdir)/polyorb_hi-protocols.ads \
$(srcdir)/polyorb_hi-sporadic_task.ads \
$(srcdir)/polyorb_hi-suspenders.ads \
$(srcdir)/polyorb_hi-thread_interrogators.ads \
$(srcdir)/polyorb_hi-scheduler.ads \
$(srcdir)/polyorb_hi-utils.ads
ADA_SPECS = $(ADA_SPECS_WITH_BODY) $(srcdir)/polyorb_hi.ads \
......
------------------------------------------------------------------------------
-- --
-- PolyORB HI COMPONENTS --
-- --
-- P O L Y O R B _ H I . I S R _ T A S K --
-- --
-- B o d y --
-- --
-- Copyright (C) 2013 ESA & ISAE. --
-- --
-- PolyORB HI is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 2, or (at your option) any later. --
-- PolyORB HI is distributed in the hope that it will be useful, but --
-- WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General --
-- Public License for more details. You should have received a copy of the --
-- GNU General Public License distributed with PolyORB HI; see file --
-- COPYING. If not, write to the Free Software Foundation, 51 Franklin --
-- Street, Fifth Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- PolyORB-HI/Ada is maintained by the TASTE project --
-- (taste-users@lists.tuxfamily.org) --
-- --
------------------------------------------------------------------------------
with Ada.Synchronous_Task_Control;
with PolyORB_HI.Output;
with PolyORB_HI.Suspenders;
package body PolyORB_HI.ISR_Task is
use PolyORB_HI.Errors;
use PolyORB_HI.Output;
use PolyORB_HI_Generated.Deployment;
use PolyORB_HI.Suspenders;
use Ada.Real_Time;
use Ada.Synchronous_Task_Control;
-------------
-- Handler --
-------------
protected body Handler is
----------
-- Wait --
----------
entry Wait when ISR_Pending is
begin
ISR_Pending := False;
end Wait;
------------
-- Handle --
------------
procedure Handle is
begin
ISR_Pending := True;
end Handle;
end Handler;
Next_Deadline_Val : Time;
------------------
-- The_ISR_Task --
------------------
task body The_ISR_Task is
Next_Start : Time;
Error : Error_Kind;
begin
-- Run the initialize entrypoint (if any)
Activate_Entrypoint;
-- Wait for the network initialization to be finished
pragma Debug
(Put_Line
(Verbose,
"ISR Task "
& Entity_Image (Entity)
& ": Wait initialization"));
Suspend_Until_True (Task_Suspension_Objects (Entity));
-- delay until System_Startup_Time;
pragma Debug (Put_Line
(Verbose,
"ISR task initialized for entity "
& Entity_Image (Entity)));
-- Main task loop
loop
pragma Debug
(Put_Line
(Verbose,
"ISR Task "
& Entity_Image (Entity)
& ": New Dispatch"));
-- Block until an event is received
Handler.Wait;
pragma Debug
(Put_Line
(Verbose,
"ISR Task "
& Entity_Image (Entity)
& ": received event"));
-- Calculate the next start time according to the minimal
-- inter-arrival time.
Next_Start := Ada.Real_Time.Clock + Task_Period;
Next_Deadline_Val := Ada.Real_Time.Clock + Task_Deadline;
-- Execute the job
Error := Job;
if Error /= Error_None then
Recover_Entrypoint;
end if;
-- Sleep to guarantee at least the minimal inter-arrival
-- time elapses.
delay until Next_Start;
end loop;
end The_ISR_Task;
-------------------
-- Next_Deadline --
-------------------
function Next_Deadline return Ada.Real_Time.Time is
begin
return Next_Deadline_Val;
end Next_Deadline;
end PolyORB_HI.ISR_Task;
------------------------------------------------------------------------------
-- --
-- PolyORB HI COMPONENTS --
-- --
-- P O L Y O R B _ H I . I S R _ T A S K --
-- --
-- S p e c --
-- --
-- Copyright (C) 2013 ESA & ISAE. --
-- --
-- PolyORB HI is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 2, or (at your option) any later. --
-- PolyORB HI is distributed in the hope that it will be useful, but --
-- WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General --
-- Public License for more details. You should have received a copy of the --
-- GNU General Public License distributed with PolyORB HI; see file --
-- COPYING. If not, write to the Free Software Foundation, 51 Franklin --
-- Street, Fifth Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- PolyORB-HI/Ada is maintained by the TASTE project --
-- (taste-users@lists.tuxfamily.org) --
-- --
------------------------------------------------------------------------------
-- Sporadic threads are a little bit more complicated that periodic
-- ones. Their behaviour can be summerized as follows:
-- BEGIN LOOP
-- 1 - Blocks until a triggering event comes
-- 2 - Do the job
-- 3 - Sleep to guarantee that minimal inter-arrival time elapses
-- END LOOP
with System;
with Ada.Real_Time;
with PolyORB_HI_Generated.Deployment;
with PolyORB_HI.Errors;
with Ada.Interrupts; use Ada.Interrupts;
with Ada.Interrupts.Names; use Ada.Interrupts.Names;
generic
Entity : in PolyORB_HI_Generated.Deployment.Entity_Type;
-- So that the task know from which AADL entity it has been
-- mapped.
Task_Period : in Ada.Real_Time.Time_Span;
-- Task minimal inter-arrival time of events
Task_Deadline : in Ada.Real_Time.Time_Span;
-- Task deadline
Task_Priority : in System.Any_Priority;
-- Task priority
Task_Stack_Size : in Natural;
-- Task stack size
Interrupt_Identifier : in Ada.Interrupts.Interrupt_ID := SIGUSR1;
with function Job return PolyORB_HI.Errors.Error_Kind;
-- Parameterless procedure executed by the periodic task
with procedure Activate_Entrypoint is null;
-- If given, the task run Activate_Entrypoint after the global
-- initialization and before the task main loop.
with procedure Recover_Entrypoint is null;
-- If given, the task runs Recover_Entrypoint when an error is
-- detected.
package PolyORB_HI.ISR_Task is
protected Handler is
entry Wait;
procedure Handle;
pragma Interrupt_Handler(Handle);
pragma Attach_Handler(Handle, Interrupt_Identifier);
private
ISR_Pending : Boolean := False;
end Handler;
task The_ISR_Task is
pragma Priority (Task_Priority);
pragma Storage_Size (Task_Stack_Size);
end The_ISR_Task;
function Next_Deadline return Ada.Real_Time.Time;
-- Return the value of the next deadline (in absolute time)
end PolyORB_HI.ISR_Task;
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