PROGRAM SUBJECT : USE OF CALLBACK FUNCTION & THREAD STATUS MONITORING AND FLAG MECHANISM. WHEN DEAL WITH THREAD CALLBACK FUNCTION IS MORE USEFUL WHEN COMMON FUNCTION SHARING BETWEEN MULTI THREAD SYSTEM. THREAD STATUS MONITORING AND FLAG MECHANISM PROVIDE EFFICIENT WAY FOR COMMUNICATION BETWEEN DIFFERENT PROCESS. // CREATED BY : JAYDEEP SHAH -- radhey04ec@gmail.com

main.cpp

Committer:
radhey04ec
Date:
2020-07-15
Revision:
0:b57dcfa14bbb

File content as of revision 0:b57dcfa14bbb:

//CALLBACK API USE IN MBED  + FLAG SYSTEM FROM DIFFERENT THREAD
//TARGET : MBED + HARDWARE : NUCLEO-64

//JAYDEEP SHAH -- radhey04ec@gmail.com

//CALLBACK -- IS LIKE FUNCTION CALL BUT MORE USEFUL than normal call.

/* When you created object at that time objedct have all properties regarding that class.
some times we want to pass object related all information to another function or Thread so you can change related parameters of that object inside that function.
More Handy when --> One Function or Thread for many object 

 when start the thread,  you want to pass objecect as a argument at that time this is very useful -- so thread work according that object.
 
 ENUM DATA_TYPE DECALARED IN THREAD.H FILE FOR STATUS
 0 = IN ACTIVE
 1 = READY
 2 = RUNNING
 4 = WAITING DELAY
 5 = WAITING FOR JOIN 
 16 = DELETED / TERMINATED
 etc...VISIT THREAD.H FILE 
 
 LINK : https://os.mbed.com/docs/mbed-os/v6.1/mbed-os-api-doxy/_thread_8h_source.html
 
 */ 
 
 //PROGRAM : AFTER 5 SEC LED BLINKING OFF & FLAGG MECHANISM

#include "mbed.h"
#include "rtos.h"

Thread thread;  //CREATE GLOBAL THREAD
DigitalOut led1(LED1);  //CREATE OBJECT
volatile bool running = true;  // FLAG TYPE VARIABLE

// Blink function toggles the led in a long running loop
void blink(DigitalOut *led)
{
    while (running) {  // WHILE FLAG SET
    
        *led = !*led;  //TOGGLE
        ThisThread::sleep_for(1000);//SLEEP
        
        uint32_t status = thread.get_state();   //GET THE STATUS OF THREAD
        printf("\n Thread status FROM INSIDE THREAD = %d",(uint32_t)status);  //PRINT STATUS ON SERIAL TERMINAL
    }
}

// Spawns a thread to run blink for 5 seconds
int main()
{
    thread.start(callback(blink, &led1));  //FUNCTION ATTACHMENT + THREAD START + ARGUMENT PASS
    ThisThread::sleep_for(5000); //MAIN THREAD SLEEP
    running = false;  //FLAG FALSE AFTER AWAKING MAIN THREAD
    uint32_t status = thread.get_state();
    printf("\n A-- Thread status FROM MAIN = %d",(uint32_t)status);  //PRINT STATUS ON SERIAL TERMINAL
    status = thread.get_state();
    printf("\n B-- Thread status FROM MAIN = %d",(uint32_t)status);  //PRINT STATUS ON SERIAL TERMINAL
    
    thread.terminate(); //Terminate thread for free stack
    status = thread.get_state();
    printf("\n C-- Thread status FROM MAIN = %d",(uint32_t)status);  //PRINT STATUS ON SERIAL TERMINAL
    thread.join();  // WHILEATE STATEMENT NOT USE IN main(), thats why join use .
    while(1)
    {
    status = thread.get_state();
    printf("\n D-- Thread status FROM MAIN = %d",(uint32_t)status); 
        }

}