simple mutex demo on lpc4337
Fork of lpc4337_mbed_os_semaphore_demo by
main.cpp@1:c8817129932e, 2016-10-03 (annotated)
- Committer:
- uLipe
- Date:
- Mon Oct 03 23:08:57 2016 +0000
- Revision:
- 1:c8817129932e
- Parent:
- 0:d767141a0a9c
first working commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uLipe | 0:d767141a0a9c | 1 | /** |
uLipe | 0:d767141a0a9c | 2 | * @brief Simple Semaphore using the mbed os demo |
uLipe | 0:d767141a0a9c | 3 | */ |
uLipe | 0:d767141a0a9c | 4 | #include "mbed.h" |
uLipe | 0:d767141a0a9c | 5 | #include "rtos.h" |
uLipe | 0:d767141a0a9c | 6 | #include "ST7567.h" |
uLipe | 0:d767141a0a9c | 7 | |
uLipe | 0:d767141a0a9c | 8 | /* LCD and font parameters */ |
uLipe | 0:d767141a0a9c | 9 | #define LCD_HEIGHT 64 |
uLipe | 0:d767141a0a9c | 10 | #define LCD_WIDTH 128 |
uLipe | 0:d767141a0a9c | 11 | #define FONT_HEIGHT 10 |
uLipe | 0:d767141a0a9c | 12 | #define FONT_WIDTH 5 |
uLipe | 0:d767141a0a9c | 13 | |
uLipe | 1:c8817129932e | 14 | #define RT_TASK 0x8001 |
uLipe | 1:c8817129932e | 15 | #define HP_TASK 0x8002 |
uLipe | 1:c8817129932e | 16 | |
uLipe | 0:d767141a0a9c | 17 | |
uLipe | 0:d767141a0a9c | 18 | /* allocate statically stacks for the three threads */ |
uLipe | 0:d767141a0a9c | 19 | unsigned char rt_stk[1024]; |
uLipe | 0:d767141a0a9c | 20 | unsigned char hp_stk[1024]; |
uLipe | 0:d767141a0a9c | 21 | unsigned char lp_stk[1024]; |
uLipe | 0:d767141a0a9c | 22 | |
uLipe | 0:d767141a0a9c | 23 | /* creates three tread objects with different priorities */ |
uLipe | 0:d767141a0a9c | 24 | Thread real_time_thread(osPriorityRealtime, 1024, &rt_stk[0]); |
uLipe | 0:d767141a0a9c | 25 | Thread high_prio_thread(osPriorityHigh, 1024, &hp_stk[0]); |
uLipe | 0:d767141a0a9c | 26 | Thread low_prio_thread(osPriorityNormal, 1024, &lp_stk[0]); |
uLipe | 0:d767141a0a9c | 27 | |
uLipe | 0:d767141a0a9c | 28 | |
uLipe | 1:c8817129932e | 29 | /* crates a mutex that will help us to controll a resource access */ |
uLipe | 1:c8817129932e | 30 | Mutex message_lock; |
uLipe | 0:d767141a0a9c | 31 | |
uLipe | 1:c8817129932e | 32 | /* console buffer which has shared access */ |
uLipe | 1:c8817129932e | 33 | char console_buffer[64] = {0}; |
uLipe | 0:d767141a0a9c | 34 | |
uLipe | 0:d767141a0a9c | 35 | |
uLipe | 0:d767141a0a9c | 36 | /* creates a instance of display */ |
uLipe | 0:d767141a0a9c | 37 | ST7567 disp(D11, D13, D12, D9, D10); |
uLipe | 0:d767141a0a9c | 38 | |
uLipe | 1:c8817129932e | 39 | /** |
uLipe | 1:c8817129932e | 40 | * @brief prints the current task which executes: |
uLipe | 1:c8817129932e | 41 | */ |
uLipe | 1:c8817129932e | 42 | static void log_thread(int t, int noof_exec) { |
uLipe | 1:c8817129932e | 43 | |
uLipe | 1:c8817129932e | 44 | /* try to take the mutex, or wait until becomes avalialble*/ |
uLipe | 1:c8817129932e | 45 | |
uLipe | 1:c8817129932e | 46 | |
uLipe | 1:c8817129932e | 47 | disp.cls(); |
uLipe | 1:c8817129932e | 48 | |
uLipe | 1:c8817129932e | 49 | disp.locate(0, FONT_HEIGHT * 1); |
uLipe | 1:c8817129932e | 50 | disp.printf("Thread status: "); |
uLipe | 0:d767141a0a9c | 51 | |
uLipe | 1:c8817129932e | 52 | disp.locate(0, FONT_HEIGHT * 2); |
uLipe | 1:c8817129932e | 53 | if(t == RT_TASK) { |
uLipe | 1:c8817129932e | 54 | message_lock.lock(); |
uLipe | 1:c8817129932e | 55 | strcpy(&console_buffer[0], "-current thread: rt_task();\0" ); |
uLipe | 1:c8817129932e | 56 | message_lock.unlock(); |
uLipe | 1:c8817129932e | 57 | disp.printf("%s", console_buffer); |
uLipe | 1:c8817129932e | 58 | } else { |
uLipe | 1:c8817129932e | 59 | message_lock.lock(); |
uLipe | 1:c8817129932e | 60 | strcpy(&console_buffer[0], "-current thread: hp_task();\0" ); |
uLipe | 1:c8817129932e | 61 | message_lock.unlock(); |
uLipe | 1:c8817129932e | 62 | disp.printf("%s", console_buffer); |
uLipe | 1:c8817129932e | 63 | } |
uLipe | 1:c8817129932e | 64 | |
uLipe | 1:c8817129932e | 65 | disp.locate(0, FONT_HEIGHT * 3); |
uLipe | 1:c8817129932e | 66 | disp.printf("-noof executions: %d ;", noof_exec); |
uLipe | 1:c8817129932e | 67 | disp.locate(0, FONT_HEIGHT * 4); |
uLipe | 1:c8817129932e | 68 | disp.printf("-mutex status: taken ."); |
uLipe | 1:c8817129932e | 69 | |
uLipe | 1:c8817129932e | 70 | |
uLipe | 1:c8817129932e | 71 | } |
uLipe | 0:d767141a0a9c | 72 | |
uLipe | 0:d767141a0a9c | 73 | |
uLipe | 0:d767141a0a9c | 74 | /** |
uLipe | 0:d767141a0a9c | 75 | * @brief real time prio task function |
uLipe | 0:d767141a0a9c | 76 | */ |
uLipe | 1:c8817129932e | 77 | static void rt_task(void) { |
uLipe | 1:c8817129932e | 78 | int execs = 0; |
uLipe | 0:d767141a0a9c | 79 | |
uLipe | 0:d767141a0a9c | 80 | |
uLipe | 0:d767141a0a9c | 81 | for(;;) { |
uLipe | 1:c8817129932e | 82 | execs++; |
uLipe | 1:c8817129932e | 83 | log_thread(RT_TASK, execs); |
uLipe | 1:c8817129932e | 84 | Thread::wait(2000); |
uLipe | 0:d767141a0a9c | 85 | } |
uLipe | 0:d767141a0a9c | 86 | |
uLipe | 0:d767141a0a9c | 87 | } |
uLipe | 0:d767141a0a9c | 88 | |
uLipe | 0:d767141a0a9c | 89 | /** |
uLipe | 0:d767141a0a9c | 90 | * @brief high prio task function |
uLipe | 0:d767141a0a9c | 91 | */ |
uLipe | 0:d767141a0a9c | 92 | static void hp_task(void){ |
uLipe | 0:d767141a0a9c | 93 | |
uLipe | 1:c8817129932e | 94 | int execs = 0; |
uLipe | 0:d767141a0a9c | 95 | |
uLipe | 0:d767141a0a9c | 96 | for(;;) { |
uLipe | 1:c8817129932e | 97 | execs++; |
uLipe | 1:c8817129932e | 98 | log_thread(HP_TASK, execs); |
uLipe | 1:c8817129932e | 99 | Thread::wait(2000); |
uLipe | 0:d767141a0a9c | 100 | } |
uLipe | 0:d767141a0a9c | 101 | } |
uLipe | 0:d767141a0a9c | 102 | |
uLipe | 0:d767141a0a9c | 103 | /** |
uLipe | 0:d767141a0a9c | 104 | * @brief normal prio task function |
uLipe | 0:d767141a0a9c | 105 | */ |
uLipe | 0:d767141a0a9c | 106 | static void np_task(void) { |
uLipe | 1:c8817129932e | 107 | |
uLipe | 1:c8817129932e | 108 | Thread::wait(0); |
uLipe | 0:d767141a0a9c | 109 | |
uLipe | 0:d767141a0a9c | 110 | for(;;) { |
uLipe | 0:d767141a0a9c | 111 | |
uLipe | 0:d767141a0a9c | 112 | } |
uLipe | 0:d767141a0a9c | 113 | } |
uLipe | 0:d767141a0a9c | 114 | |
uLipe | 0:d767141a0a9c | 115 | /** |
uLipe | 0:d767141a0a9c | 116 | * @brief main loop |
uLipe | 0:d767141a0a9c | 117 | */ |
uLipe | 0:d767141a0a9c | 118 | int main(void) { |
uLipe | 0:d767141a0a9c | 119 | const char banner[] = {"Embarcados MBED-OS\0"}; |
uLipe | 0:d767141a0a9c | 120 | |
uLipe | 0:d767141a0a9c | 121 | /* configures the display */ |
uLipe | 0:d767141a0a9c | 122 | disp.cls(); |
uLipe | 0:d767141a0a9c | 123 | disp.set_contrast(0x35); |
uLipe | 0:d767141a0a9c | 124 | disp.locate((LCD_WIDTH - (sizeof(banner) * FONT_WIDTH)) / 2, (LCD_HEIGHT/2) - (FONT_HEIGHT/2)); |
uLipe | 0:d767141a0a9c | 125 | disp.printf(banner); |
uLipe | 0:d767141a0a9c | 126 | |
uLipe | 0:d767141a0a9c | 127 | Thread::wait(2500); |
uLipe | 0:d767141a0a9c | 128 | disp.cls(); |
uLipe | 0:d767141a0a9c | 129 | |
uLipe | 0:d767141a0a9c | 130 | /* starts the three tasks */ |
uLipe | 0:d767141a0a9c | 131 | real_time_thread.start(rt_task); |
uLipe | 0:d767141a0a9c | 132 | high_prio_thread.start(hp_task); |
uLipe | 0:d767141a0a9c | 133 | low_prio_thread.start(np_task); |
uLipe | 0:d767141a0a9c | 134 | |
uLipe | 0:d767141a0a9c | 135 | |
uLipe | 0:d767141a0a9c | 136 | return 0; |
uLipe | 0:d767141a0a9c | 137 | } |
uLipe | 0:d767141a0a9c | 138 |