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@0:b57dcfa14bbb, 2020-07-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |