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

Committer:
radhey04ec
Date:
Wed Jul 15 06:22:56 2020 +0000
Revision:
0:b57dcfa14bbb
CALLBACK FUNCTION & THREAD STATUS CHECKING; COMMIT_DONE;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radhey04ec 0:b57dcfa14bbb 1 //CALLBACK API USE IN MBED + FLAG SYSTEM FROM DIFFERENT THREAD
radhey04ec 0:b57dcfa14bbb 2 //TARGET : MBED + HARDWARE : NUCLEO-64
radhey04ec 0:b57dcfa14bbb 3
radhey04ec 0:b57dcfa14bbb 4 //JAYDEEP SHAH -- radhey04ec@gmail.com
radhey04ec 0:b57dcfa14bbb 5
radhey04ec 0:b57dcfa14bbb 6 //CALLBACK -- IS LIKE FUNCTION CALL BUT MORE USEFUL than normal call.
radhey04ec 0:b57dcfa14bbb 7
radhey04ec 0:b57dcfa14bbb 8 /* When you created object at that time objedct have all properties regarding that class.
radhey04ec 0:b57dcfa14bbb 9 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.
radhey04ec 0:b57dcfa14bbb 10 More Handy when --> One Function or Thread for many object
radhey04ec 0:b57dcfa14bbb 11
radhey04ec 0:b57dcfa14bbb 12 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.
radhey04ec 0:b57dcfa14bbb 13
radhey04ec 0:b57dcfa14bbb 14 ENUM DATA_TYPE DECALARED IN THREAD.H FILE FOR STATUS
radhey04ec 0:b57dcfa14bbb 15 0 = IN ACTIVE
radhey04ec 0:b57dcfa14bbb 16 1 = READY
radhey04ec 0:b57dcfa14bbb 17 2 = RUNNING
radhey04ec 0:b57dcfa14bbb 18 4 = WAITING DELAY
radhey04ec 0:b57dcfa14bbb 19 5 = WAITING FOR JOIN
radhey04ec 0:b57dcfa14bbb 20 16 = DELETED / TERMINATED
radhey04ec 0:b57dcfa14bbb 21 etc...VISIT THREAD.H FILE
radhey04ec 0:b57dcfa14bbb 22
radhey04ec 0:b57dcfa14bbb 23 LINK : https://os.mbed.com/docs/mbed-os/v6.1/mbed-os-api-doxy/_thread_8h_source.html
radhey04ec 0:b57dcfa14bbb 24
radhey04ec 0:b57dcfa14bbb 25 */
radhey04ec 0:b57dcfa14bbb 26
radhey04ec 0:b57dcfa14bbb 27 //PROGRAM : AFTER 5 SEC LED BLINKING OFF & FLAGG MECHANISM
radhey04ec 0:b57dcfa14bbb 28
radhey04ec 0:b57dcfa14bbb 29 #include "mbed.h"
radhey04ec 0:b57dcfa14bbb 30 #include "rtos.h"
radhey04ec 0:b57dcfa14bbb 31
radhey04ec 0:b57dcfa14bbb 32 Thread thread; //CREATE GLOBAL THREAD
radhey04ec 0:b57dcfa14bbb 33 DigitalOut led1(LED1); //CREATE OBJECT
radhey04ec 0:b57dcfa14bbb 34 volatile bool running = true; // FLAG TYPE VARIABLE
radhey04ec 0:b57dcfa14bbb 35
radhey04ec 0:b57dcfa14bbb 36 // Blink function toggles the led in a long running loop
radhey04ec 0:b57dcfa14bbb 37 void blink(DigitalOut *led)
radhey04ec 0:b57dcfa14bbb 38 {
radhey04ec 0:b57dcfa14bbb 39 while (running) { // WHILE FLAG SET
radhey04ec 0:b57dcfa14bbb 40
radhey04ec 0:b57dcfa14bbb 41 *led = !*led; //TOGGLE
radhey04ec 0:b57dcfa14bbb 42 ThisThread::sleep_for(1000);//SLEEP
radhey04ec 0:b57dcfa14bbb 43
radhey04ec 0:b57dcfa14bbb 44 uint32_t status = thread.get_state(); //GET THE STATUS OF THREAD
radhey04ec 0:b57dcfa14bbb 45 printf("\n Thread status FROM INSIDE THREAD = %d",(uint32_t)status); //PRINT STATUS ON SERIAL TERMINAL
radhey04ec 0:b57dcfa14bbb 46 }
radhey04ec 0:b57dcfa14bbb 47 }
radhey04ec 0:b57dcfa14bbb 48
radhey04ec 0:b57dcfa14bbb 49 // Spawns a thread to run blink for 5 seconds
radhey04ec 0:b57dcfa14bbb 50 int main()
radhey04ec 0:b57dcfa14bbb 51 {
radhey04ec 0:b57dcfa14bbb 52 thread.start(callback(blink, &led1)); //FUNCTION ATTACHMENT + THREAD START + ARGUMENT PASS
radhey04ec 0:b57dcfa14bbb 53 ThisThread::sleep_for(5000); //MAIN THREAD SLEEP
radhey04ec 0:b57dcfa14bbb 54 running = false; //FLAG FALSE AFTER AWAKING MAIN THREAD
radhey04ec 0:b57dcfa14bbb 55 uint32_t status = thread.get_state();
radhey04ec 0:b57dcfa14bbb 56 printf("\n A-- Thread status FROM MAIN = %d",(uint32_t)status); //PRINT STATUS ON SERIAL TERMINAL
radhey04ec 0:b57dcfa14bbb 57 status = thread.get_state();
radhey04ec 0:b57dcfa14bbb 58 printf("\n B-- Thread status FROM MAIN = %d",(uint32_t)status); //PRINT STATUS ON SERIAL TERMINAL
radhey04ec 0:b57dcfa14bbb 59
radhey04ec 0:b57dcfa14bbb 60 thread.terminate(); //Terminate thread for free stack
radhey04ec 0:b57dcfa14bbb 61 status = thread.get_state();
radhey04ec 0:b57dcfa14bbb 62 printf("\n C-- Thread status FROM MAIN = %d",(uint32_t)status); //PRINT STATUS ON SERIAL TERMINAL
radhey04ec 0:b57dcfa14bbb 63 thread.join(); // WHILEATE STATEMENT NOT USE IN main(), thats why join use .
radhey04ec 0:b57dcfa14bbb 64 while(1)
radhey04ec 0:b57dcfa14bbb 65 {
radhey04ec 0:b57dcfa14bbb 66 status = thread.get_state();
radhey04ec 0:b57dcfa14bbb 67 printf("\n D-- Thread status FROM MAIN = %d",(uint32_t)status);
radhey04ec 0:b57dcfa14bbb 68 }
radhey04ec 0:b57dcfa14bbb 69
radhey04ec 0:b57dcfa14bbb 70 }