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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*SEMAPHORE ADVANCE PART 4
00002 THIS PROGRAM DEDICATED TO COUNTING SEMAPHORE
00003 NO MENTIONED WHILE CREATING SEMAPHORE IS ACT LIKE COUNTER, WHILE COUNTER > 0, THREAD/PROCESS CAN ACCESS RESOURCES.
00004 IF COUNT = 1 IT ACT AS BINARY SEMAPHORE.
00005 */
00006 
00007 //OUTPUT  --> PUTTY / COOLTERM / HYPERTTERMINAL
00008 //TARGET : SOFTWARE = MBED ONLINE , HARDWARE : NUCLEO - 64 
00009 
00010 //SEMAPHORE - ADVANCE PART 4
00011 //PART -4 JAYDEEP SHAH
00012 
00013 #include "mbed.h"  //MBED LIBRARY
00014 #include "rtos.h"  // RTOS LIBRARY
00015  
00016 Semaphore two_slots(2);  //CREATE SEMAPHORE OBJECT WITH N=2 , TWO PROCESS CAN ACCESS CRITICAL SECTION
00017  
00018 void test_thread(void const *name) {        //PROCESS OR FUNCTION
00019     while (true) {
00020         printf("\n BEFORE SEMAPHORE GUARD -- THREAD NAME %s\n\r", (const char*)name);
00021         two_slots.wait();   //SEMAPHORE GUARD --> PROCESS CAN CROSS ONLY IF N>0
00022         
00023         // N = N -1 --> COUNTER DECREMENT IF PROCESS CROSS
00024         printf("\n SEMAPHORE CROSS AND SLEPP THREAD =  %s\n\r", (const char*)name);  //PRINT  STRING AFTER TYPE CONVERSION
00025         
00026         Thread::wait(1000);  //THREAD SLEEP FOR 1 SEC   --> THREAD SLEEP
00027         
00028         two_slots.release();  //SEMAPHORE RELEASE
00029         //IF SEMAPHORE RELEASE --> N = N +1
00030         
00031         printf("\n SEMAPHORE RELEASE THREAD = %s\n\r", (const char*)name); //AFTER SLEEP
00032     }
00033 }
00034  
00035 int main (void) {  // MAIN THREAD CREATE AND START
00036     Thread t2;   // CREATEHREAD OBJECT
00037     Thread t3;   // CREATE THREAD OBJECT
00038  
00039     t2.start(callback(test_thread, (void *)"Th 2"));  // THREAD START - CALL THE FUNCTION WITH CALLBACK COMMAND AND PASS STRING AS ARGUMENT
00040     t3.start(callback(test_thread, (void *)"Th 3"));  // THREAD START    & FUNCTION CALL SAME AS ABOVE
00041  
00042     test_thread((void *)"Th 1");  // FUNCTION CALL 
00043     //MAIN THREAD FIRST START WITH NORMAL PRIORITY
00044 }
00045 
00046 
00047 // YOU CAN TEST THE PROGRAM OUTPUT ON SERIAL MONITOR WITH TIME STAMP
00048 //FOR MORE CLARIFICATION , TRY TO CHANGE SEMAPHORE COUNTER VALUE AND CHECK OUTPUT