SEMAPHORE ADVANCE PART 4 EXAMPLE OF COUNTING SEMAPHORE IN MBED OS FOR PROTECTING CRITICAL SECTION OF SHARED RESOURCES TARGET BOARD NUCLEO - 64 OS PLATFORM : MBED CREATED BY : JAYDEEP SHAH -- radhey04ec@gmail.com

main.cpp

Committer:
radhey04ec
Date:
2020-07-15
Revision:
1:d3e6b9a8a9c2
Parent:
0:2de8a221f1d2

File content as of revision 1:d3e6b9a8a9c2:

/*SEMAPHORE ADVANCE PART 4
THIS PROGRAM DEDICATED TO COUNTING SEMAPHORE
NO MENTIONED WHILE CREATING SEMAPHORE IS ACT LIKE COUNTER, WHILE COUNTER > 0, THREAD/PROCESS CAN ACCESS RESOURCES.
IF COUNT = 1 IT ACT AS BINARY SEMAPHORE.
*/

//OUTPUT  --> PUTTY / COOLTERM / HYPERTTERMINAL
//TARGET : SOFTWARE = MBED ONLINE , HARDWARE : NUCLEO - 64 

//SEMAPHORE - ADVANCE PART 4
//PART -4 JAYDEEP SHAH

#include "mbed.h"  //MBED LIBRARY
#include "rtos.h"  // RTOS LIBRARY
 
Semaphore two_slots(2);  //CREATE SEMAPHORE OBJECT WITH N=2 , TWO PROCESS CAN ACCESS CRITICAL SECTION
 
void test_thread(void const *name) {        //PROCESS OR FUNCTION
    while (true) {
        printf("\n BEFORE SEMAPHORE GUARD -- THREAD NAME %s\n\r", (const char*)name);
        two_slots.wait();   //SEMAPHORE GUARD --> PROCESS CAN CROSS ONLY IF N>0
        
        // N = N -1 --> COUNTER DECREMENT IF PROCESS CROSS
        printf("\n SEMAPHORE CROSS AND SLEPP THREAD =  %s\n\r", (const char*)name);  //PRINT  STRING AFTER TYPE CONVERSION
        
        Thread::wait(1000);  //THREAD SLEEP FOR 1 SEC   --> THREAD SLEEP
        
        two_slots.release();  //SEMAPHORE RELEASE
        //IF SEMAPHORE RELEASE --> N = N +1
        
        printf("\n SEMAPHORE RELEASE THREAD = %s\n\r", (const char*)name); //AFTER SLEEP
    }
}
 
int main (void) {  // MAIN THREAD CREATE AND START
    Thread t2;   // CREATEHREAD OBJECT
    Thread t3;   // CREATE THREAD OBJECT
 
    t2.start(callback(test_thread, (void *)"Th 2"));  // THREAD START - CALL THE FUNCTION WITH CALLBACK COMMAND AND PASS STRING AS ARGUMENT
    t3.start(callback(test_thread, (void *)"Th 3"));  // THREAD START    & FUNCTION CALL SAME AS ABOVE
 
    test_thread((void *)"Th 1");  // FUNCTION CALL 
    //MAIN THREAD FIRST START WITH NORMAL PRIORITY
}


// YOU CAN TEST THE PROGRAM OUTPUT ON SERIAL MONITOR WITH TIME STAMP
//FOR MORE CLARIFICATION , TRY TO CHANGE SEMAPHORE COUNTER VALUE AND CHECK OUTPUT