Skip to content

Instantly share code, notes, and snippets.

@jscrane
Last active November 13, 2018 02:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jscrane/16cd5c99ad7c4fa50e9c to your computer and use it in GitHub Desktop.
Save jscrane/16cd5c99ad7c4fa50e9c to your computer and use it in GitHub Desktop.
Dining Philosophers for the Arduino Uno
#define MAX 5
Semaphore forks[MAX];
byte ids = 1;
byte leds[] = { 5, 6, 7, 8, 9 };
void eating(byte id) {
digitalWrite(leds[id], HIGH);
Tasks::delay(1 + random(MAX * 100));
digitalWrite(leds[id], LOW);
}
class Philosopher: public Task<50> {
public:
void setup() {
_id = ids++;
}
void loop() {
forks[_id - 1].wait();
forks[_id].wait();
eating(_id);
forks[_id - 1].signal();
forks[_id].signal();
}
private:
byte _id;
};
Philosopher philosophers[MAX-1];
void setup() {
randomSeed(analogRead(0));
Tasks::init();
Tasks::set_idle_handler(timer_sleep);
for (int i = 0; i < MAX; i++) {
forks[i].signal();
pinMode(leds[i], OUTPUT);
}
for (int i = 0; i < MAX-1; i++)
Tasks::start(philosophers[i]);
}
void loop() {
forks[0].wait();
forks[MAX-1].wait();
eating(0);
forks[0].signal();
forks[MAX-1].signal();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment