Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- JosephMarinier
- Date:
- 2017-02-03
- Revision:
- 3:f09f9670e40e
- Parent:
- 2:99e36af00b06
- Child:
- 4:1c2925026e7a
File content as of revision 3:f09f9670e40e:
// becj2903 - Joseph Marinier #include "mbed.h" #include "rtos.h" #define SIGNAL 1 #define ADDING_INGREDIENT 100 // ms #define ADDING_4_INGREDIENTS 500 // ms Semaphore ketchup(2); Mutex relish; Mutex mayonnaise; Semaphore moutarde(2); Mutex oignon; Thread thread[4]; struct message_t { char text[6]; }; Queue<message_t, 4> *queue; MemoryPool<message_t, 4> *pool; void add_ingredient(Semaphore ingredient) { // in Semaphore ingredient.wait(); wait_ms(ADDING_INGREDIENT); ingredient.release(); } void add_ingredient(Mutex ingredient) { // in Mutex ingredient.lock(); wait_ms(ADDING_INGREDIENT); ingredient.unlock(); } void doing_hot_dog_1() { DigitalOut led(LED1); while(true) { Thread::signal_wait(SIGNAL); // every_2_seconds add_ingredient(ketchup); add_ingredient(relish); led = !led; } } void doing_hot_dog_2() { DigitalOut led(LED2); while(true) { Thread::signal_wait(SIGNAL); // every_2_seconds add_ingredient(moutarde); add_ingredient(oignon); add_ingredient(mayonnaise); led = !led; } } bool passing_to_4 = false; void doing_hot_dog_3() { DigitalOut led(LED3); while(true) { Thread::signal_wait(SIGNAL); // every_2_seconds add_ingredient(ketchup); if(passing_to_4) { message_t *message = pool->alloc(); message->text[0] = 'h'; message->text[1] = 'o'; message->text[2] = 't'; message->text[3] = 'd'; message->text[4] = 'o'; message->text[5] = 'g'; queue->put(message); } else { led = !led; } passing_to_4 = !passing_to_4; } } void doing_hot_dog_4() { DigitalOut led(LED4); while(true) { Thread::signal_wait(SIGNAL); // every_2_seconds osEvent evt = queue->get(); if (evt.status == osEventMessage) { message_t *message = (message_t*)evt.value.p; printf("\"%s\" should be \"hotdog\"\r\n", message->text); pool->free(message); relish.lock(); mayonnaise.lock(); moutarde.wait(); oignon.lock(); wait_ms(ADDING_4_INGREDIENTS); oignon.unlock(); moutarde.release(); mayonnaise.unlock(); relish.unlock(); led = !led; } } } bool every_2_seconds = false; bool every_4_seconds = false; void every_second() { thread[0].signal_set(SIGNAL); if(every_2_seconds) { thread[1].signal_set(SIGNAL); thread[2].signal_set(SIGNAL); if(every_4_seconds) { thread[3].signal_set(SIGNAL); } every_4_seconds = !every_4_seconds; } every_2_seconds = !every_2_seconds; } int main() { queue = &Queue<message_t, 4>(); pool = &MemoryPool<message_t, 4>(); thread[0] = Thread(osPriorityRealtime); thread[0].start(doing_hot_dog_1); // Wow la phrase! thread[1] = Thread(osPriorityHigh); thread[1].start(doing_hot_dog_2); // Ho franchement, c'est cute! thread[2] = Thread(osPriorityNormal); thread[2].start(doing_hot_dog_3); // Hooo wow! thread[3] = Thread(osPriorityLow); thread[3].start(doing_hot_dog_4); // Wow wow wow! Ticker ticker; ticker.attach(&every_second, 1); Thread::wait(osWaitForever); }