Skip to main content

Tasking in Ada on a Raspberry Pi

Ada provides an extensive set of capabilities for creating programs with concurrent code modules (tasks), for real-time programming, similar to Java threads. Those tasks are executed concurrently with the rest of the program, so I thought the best way to test them on a Raspberry Pi is by blinking two LEDs at different time intervals ;)



Accessing the GPIO pins on a Raspberry Pi from an Ada program requires a library, I'm using Linux Simple I/O Library by  Philip Munts.

Assuming we have two LEDs (and corresponding resistors) on GPIO17 and 18, here's the source code for blinking them at different intervals, using tasks.


--
--  GPIO LED Test using libsimpleio
--  task version
--
WITH Ada.Text_IO; USE Ada.Text_IO;
WITH GPIO.libsimpleio;

PROCEDURE blinky_tasks IS

  LED_red : GPIO.Pin := GPIO.libsimpleio.Create(0, 17, GPIO.Output);
  LED_green : GPIO.Pin := GPIO.libsimpleio.Create(0, 18, GPIO.Output);
  Ch : Character;
  Available : Boolean;

  task First_task;
  task Second_task;

  task body First_task is
  begin
    LOOP
      LED_red.Put(True); delay 1.5; LED_red.Put(False); delay 1.5;
      exit when Available = True;
    END LOOP;
  end First_task;

  task body Second_task is
  begin
    LOOP
      LED_green.Put(True); delay 0.5; LED_green.Put(False); delay 0.5;
      exit when Available = True;
    END LOOP;
  end Second_task;

BEGIN
  Put_Line("GPIO LED Test using libsimpleio - task version");
  New_Line;
  Put_Line("press any key to exit...");

  LOOP
    Get_Immediate(Ch, Available);
    exit when Available = True;
  END LOOP;
  LED_red.Put(False);
  LED_green.Put(False);
END blinky_tasks;




Note: Ada logo source Ada Belgium

Comments

Popular posts from this blog

Raspberry Pi, Ada, and Linux Simple I/O Library

Programming in Ada on a Raspberry Pi is simple enough, Raspbian has a fairly recent version of  GNAT, but if you don't use Raspbian, you can always download GNAT directly from  AdaCore . sudo apt-get install gnat A simple hello test shows that everything works as expected. Tasking in Ada will require a couple more tests, but it should work since GNAT seems to support the Ravenscar profile ... Accessing the GPIO pins requires a library, and thanks to Philip Munts we have one :) Read the readme , find the user manual and install the Linux Simple I/O Library. The library also contains a couple of programs, I just modified one and got a simple blinky. I used the makefile from the library, unmodified, to compile this example. Assume a LED (and a small resistor) on GPIO17 (that's Wiring Pi pin 0, or pin 11 on the board). Next step is to use tasks to blink a couple of LEDs in 'real time', and to check Philip Munt's  MuntsOS Embedded Linux Framework .

Ada Web Server - LED on/off control on Raspberry Pi

Inspired by all those Arduino / ESP8266 / etc. tutorials on controlling a LED from a web page... Requirements: - GNU Ada compiler (sudo apt-get install gnat) - Ada Web Server (sudo apt-get install libaws-bin libaws-doc libaws3.3.2-dev) - Munts Linux Simple I/O Library (see my post here about this, User Manual available here ) - LED (with a resistor) on GPIO17 I used as a starting point the "web-block" sample from AWS, changing a couple of things. For dealing with Raspberry Pi's GPIOs I made a simple package, using libsimpleio, of course ;) I also changed the directory structure, and added to the .gpr project all the libsimpleio related stuff. The entire project is on github here .