This is sample program for Nucleo L152RE (and F401RE & F411RE) mbed-rtos. You need to modify mbed-src and mbed-rtos before compile it.
Dependencies: mbed-rtos mbed-src SetRTC
Fork of GR-PEACH_test_on_rtos_works_well by
Please refer below link.
/users/kenjiArai/notebook/necleo-l152re-rtos-sample-also-for-f401re--f411re-/
main.cpp@13:d0d1da1fae4c, 2015-05-20 (annotated)
- Committer:
- kenjiArai
- Date:
- Wed May 20 10:49:02 2015 +0000
- Revision:
- 13:d0d1da1fae4c
- Parent:
- 10:1c0f58b9c048
change L152 System clock (PLL VCO=96MHz) ->32MHz Clock
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 1:a399a743d109 | 1 | /* |
kenjiArai | 1:a399a743d109 | 2 | * mbed Application program for the mbed |
kenjiArai | 10:1c0f58b9c048 | 3 | * RTOS Test program for Nucleo L152RE |
kenjiArai | 1:a399a743d109 | 4 | * |
kenjiArai | 8:4006b111c0d4 | 5 | * Copyright (c) 2014,'15 Kenji Arai / JH1PJL |
kenjiArai | 1:a399a743d109 | 6 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 1:a399a743d109 | 7 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 1:a399a743d109 | 8 | * Created: November 29th, 2014 |
kenjiArai | 13:d0d1da1fae4c | 9 | * Revised: May 20th, 2015 |
kenjiArai | 1:a399a743d109 | 10 | * |
kenjiArai | 1:a399a743d109 | 11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
kenjiArai | 1:a399a743d109 | 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
kenjiArai | 1:a399a743d109 | 13 | * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
kenjiArai | 1:a399a743d109 | 14 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
kenjiArai | 1:a399a743d109 | 15 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
kenjiArai | 1:a399a743d109 | 16 | */ |
kenjiArai | 1:a399a743d109 | 17 | |
kenjiArai | 4:76b3113c79ff | 18 | // Include --------------------------------------------------------------------------------------- |
kenjiArai | 10:1c0f58b9c048 | 19 | #include "mbed.h" |
kenjiArai | 10:1c0f58b9c048 | 20 | #include "rtos.h" |
kenjiArai | 10:1c0f58b9c048 | 21 | #include "SetRTC.h" // Own lib. / RTC control |
kenjiArai | 2:3747397a1618 | 22 | |
kenjiArai | 4:76b3113c79ff | 23 | // Definition ------------------------------------------------------------------------------------ |
kenjiArai | 10:1c0f58b9c048 | 24 | #define DO_DEBUG 1 |
kenjiArai | 10:1c0f58b9c048 | 25 | |
kenjiArai | 10:1c0f58b9c048 | 26 | #if DO_DEBUG |
kenjiArai | 10:1c0f58b9c048 | 27 | #define DEBUG_LINE printf("line:%d\r\n", __LINE__); |
kenjiArai | 10:1c0f58b9c048 | 28 | #else |
kenjiArai | 10:1c0f58b9c048 | 29 | #define DEBUG_LINE {;} |
kenjiArai | 10:1c0f58b9c048 | 30 | #endif |
kenjiArai | 4:76b3113c79ff | 31 | |
kenjiArai | 4:76b3113c79ff | 32 | // Com |
kenjiArai | 10:1c0f58b9c048 | 33 | #if 1 |
kenjiArai | 10:1c0f58b9c048 | 34 | #define BAUD(x) pc.baud(x) |
kenjiArai | 10:1c0f58b9c048 | 35 | #define GETC(x) pc.getc(x) |
kenjiArai | 10:1c0f58b9c048 | 36 | #define PUTC(x) pc.putc(x) |
kenjiArai | 10:1c0f58b9c048 | 37 | #define PUTS(x) pc.puts(x) |
kenjiArai | 10:1c0f58b9c048 | 38 | #define PRINTF(...) pc.printf(__VA_ARGS__) |
kenjiArai | 10:1c0f58b9c048 | 39 | #define READABLE(x) pc.readable(x) |
kenjiArai | 4:76b3113c79ff | 40 | #else |
kenjiArai | 10:1c0f58b9c048 | 41 | #define BAUD(x) {;} |
kenjiArai | 10:1c0f58b9c048 | 42 | #define GETC(x) {;} |
kenjiArai | 10:1c0f58b9c048 | 43 | #define PUTC(x) {;} |
kenjiArai | 10:1c0f58b9c048 | 44 | #define PUTS(x) {;} |
kenjiArai | 10:1c0f58b9c048 | 45 | #define PRINTF(...) {;} |
kenjiArai | 10:1c0f58b9c048 | 46 | #define READABLE(x) {;} |
kenjiArai | 0:a17b3cf2f466 | 47 | #endif |
kenjiArai | 0:a17b3cf2f466 | 48 | |
kenjiArai | 10:1c0f58b9c048 | 49 | #define TIME_BASE_S 0.02 |
kenjiArai | 10:1c0f58b9c048 | 50 | |
kenjiArai | 10:1c0f58b9c048 | 51 | #define step_one (0.0625f) |
kenjiArai | 4:76b3113c79ff | 52 | |
kenjiArai | 4:76b3113c79ff | 53 | // Object ---------------------------------------------------------------------------------------- |
kenjiArai | 10:1c0f58b9c048 | 54 | // LED's !! DON'T USE LED1(PA_5) because PA_5 uses for DAC |
kenjiArai | 10:1c0f58b9c048 | 55 | DigitalOut LEDs[3] = { |
kenjiArai | 10:1c0f58b9c048 | 56 | DigitalOut(PC_10), DigitalOut(PC_11), DigitalOut(PC_12) |
kenjiArai | 4:76b3113c79ff | 57 | }; |
kenjiArai | 5:dccdaaa1e57b | 58 | // OS check |
kenjiArai | 10:1c0f58b9c048 | 59 | DigitalOut task0(PC_2); |
kenjiArai | 10:1c0f58b9c048 | 60 | DigitalOut task1(PC_3); |
kenjiArai | 10:1c0f58b9c048 | 61 | // Swiches |
kenjiArai | 10:1c0f58b9c048 | 62 | DigitalIn usr_sw(PC_13); |
kenjiArai | 10:1c0f58b9c048 | 63 | // DAC to ADC |
kenjiArai | 10:1c0f58b9c048 | 64 | #if defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 10:1c0f58b9c048 | 65 | AnalogOut dac0(PA_4); |
kenjiArai | 10:1c0f58b9c048 | 66 | AnalogOut dac1(PA_5); |
kenjiArai | 5:dccdaaa1e57b | 67 | #endif |
kenjiArai | 10:1c0f58b9c048 | 68 | AnalogIn adc1(A1); |
kenjiArai | 10:1c0f58b9c048 | 69 | AnalogIn adc3(A3); |
kenjiArai | 10:1c0f58b9c048 | 70 | // I2C |
kenjiArai | 10:1c0f58b9c048 | 71 | I2C i2c1(D14,D15); // SDA, SCL |
kenjiArai | 4:76b3113c79ff | 72 | // com |
kenjiArai | 10:1c0f58b9c048 | 73 | Serial pc(USBTX, USBRX); // Communication with Host |
kenjiArai | 4:76b3113c79ff | 74 | // Mutex |
kenjiArai | 10:1c0f58b9c048 | 75 | Mutex uart_mutex; |
kenjiArai | 4:76b3113c79ff | 76 | Mutex i2c_mutex; |
kenjiArai | 0:a17b3cf2f466 | 77 | |
kenjiArai | 4:76b3113c79ff | 78 | // RAM ------------------------------------------------------------------------------------------- |
kenjiArai | 4:76b3113c79ff | 79 | Queue<uint32_t, 2> queue0; |
kenjiArai | 10:1c0f58b9c048 | 80 | |
kenjiArai | 10:1c0f58b9c048 | 81 | float fg[3]; |
kenjiArai | 10:1c0f58b9c048 | 82 | float fa[3]; |
kenjiArai | 10:1c0f58b9c048 | 83 | |
kenjiArai | 10:1c0f58b9c048 | 84 | float analog[2]; |
kenjiArai | 4:76b3113c79ff | 85 | |
kenjiArai | 4:76b3113c79ff | 86 | /* Mail */ |
kenjiArai | 4:76b3113c79ff | 87 | typedef struct { |
kenjiArai | 4:76b3113c79ff | 88 | float voltage; /* AD result of measured voltage */ |
kenjiArai | 4:76b3113c79ff | 89 | float current; /* AD result of measured current */ |
kenjiArai | 4:76b3113c79ff | 90 | uint32_t counter; /* A counter value */ |
kenjiArai | 4:76b3113c79ff | 91 | } mail_t; |
kenjiArai | 4:76b3113c79ff | 92 | |
kenjiArai | 4:76b3113c79ff | 93 | Mail<mail_t, 16> mail_box; |
kenjiArai | 4:76b3113c79ff | 94 | |
kenjiArai | 8:4006b111c0d4 | 95 | uint8_t show_flag0; |
kenjiArai | 8:4006b111c0d4 | 96 | uint8_t show_flag1; |
kenjiArai | 5:dccdaaa1e57b | 97 | uint32_t count; |
kenjiArai | 5:dccdaaa1e57b | 98 | |
kenjiArai | 4:76b3113c79ff | 99 | // ROM / Constant data --------------------------------------------------------------------------- |
kenjiArai | 10:1c0f58b9c048 | 100 | const float out_data[16] = {step_one * 15, step_one * 14, step_one * 13, step_one * 12, step_one * 11, |
kenjiArai | 10:1c0f58b9c048 | 101 | step_one * 10, step_one * 9, step_one * 8, step_one * 7, step_one * 6, |
kenjiArai | 10:1c0f58b9c048 | 102 | step_one * 5, step_one * 4, step_one * 3, step_one * 2, step_one * 1, 0}; |
kenjiArai | 10:1c0f58b9c048 | 103 | |
kenjiArai | 4:76b3113c79ff | 104 | // Function prototypes --------------------------------------------------------------------------- |
kenjiArai | 4:76b3113c79ff | 105 | |
kenjiArai | 4:76b3113c79ff | 106 | // Function prototypes --------------------------------------------------------------------------- |
kenjiArai | 4:76b3113c79ff | 107 | extern int mon( void); |
kenjiArai | 4:76b3113c79ff | 108 | |
kenjiArai | 4:76b3113c79ff | 109 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 4:76b3113c79ff | 110 | // Control Program |
kenjiArai | 4:76b3113c79ff | 111 | //------------------------------------------------------------------------------------------------- |
kenjiArai | 4:76b3113c79ff | 112 | void send_thread (void const *args) { |
kenjiArai | 4:76b3113c79ff | 113 | uint32_t i = 0; |
kenjiArai | 4:76b3113c79ff | 114 | while (true) { |
kenjiArai | 4:76b3113c79ff | 115 | i++; // fake data update |
kenjiArai | 4:76b3113c79ff | 116 | mail_t *mail = mail_box.alloc(); |
kenjiArai | 4:76b3113c79ff | 117 | mail->voltage = (i * 0.1) * 33; |
kenjiArai | 4:76b3113c79ff | 118 | mail->current = (i * 0.1) * 11; |
kenjiArai | 4:76b3113c79ff | 119 | mail->counter = i; |
kenjiArai | 4:76b3113c79ff | 120 | mail_box.put(mail); |
kenjiArai | 4:76b3113c79ff | 121 | Thread::wait(1000); |
kenjiArai | 4:76b3113c79ff | 122 | } |
kenjiArai | 4:76b3113c79ff | 123 | } |
kenjiArai | 4:76b3113c79ff | 124 | |
kenjiArai | 4:76b3113c79ff | 125 | void blink(void const *n) { |
kenjiArai | 4:76b3113c79ff | 126 | LEDs[(int)n] = !LEDs[(int)n]; |
kenjiArai | 4:76b3113c79ff | 127 | } |
kenjiArai | 4:76b3113c79ff | 128 | |
kenjiArai | 4:76b3113c79ff | 129 | // Read switch status |
kenjiArai | 10:1c0f58b9c048 | 130 | int read_sw(){ |
kenjiArai | 10:1c0f58b9c048 | 131 | if (usr_sw.read()){ |
kenjiArai | 10:1c0f58b9c048 | 132 | return 0; |
kenjiArai | 10:1c0f58b9c048 | 133 | } else { |
kenjiArai | 10:1c0f58b9c048 | 134 | return 1; |
kenjiArai | 10:1c0f58b9c048 | 135 | } |
kenjiArai | 4:76b3113c79ff | 136 | } |
kenjiArai | 4:76b3113c79ff | 137 | |
kenjiArai | 4:76b3113c79ff | 138 | // Monitor program |
kenjiArai | 4:76b3113c79ff | 139 | void monitor(void const *args){ |
kenjiArai | 10:1c0f58b9c048 | 140 | Thread::wait(100); |
kenjiArai | 4:76b3113c79ff | 141 | while (true){ |
kenjiArai | 10:1c0f58b9c048 | 142 | DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 143 | mon(); |
kenjiArai | 0:a17b3cf2f466 | 144 | } |
kenjiArai | 0:a17b3cf2f466 | 145 | } |
kenjiArai | 4:76b3113c79ff | 146 | |
kenjiArai | 8:4006b111c0d4 | 147 | void watch_time (void const *args) { |
kenjiArai | 8:4006b111c0d4 | 148 | time_t seconds; |
kenjiArai | 8:4006b111c0d4 | 149 | char buf[64]; |
kenjiArai | 8:4006b111c0d4 | 150 | |
kenjiArai | 8:4006b111c0d4 | 151 | while (true) { |
kenjiArai | 8:4006b111c0d4 | 152 | seconds = time(NULL); |
kenjiArai | 8:4006b111c0d4 | 153 | strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds)); |
kenjiArai | 8:4006b111c0d4 | 154 | if (show_flag1){ |
kenjiArai | 10:1c0f58b9c048 | 155 | // printf("[TASK1] %s, No:%5d, Ticker:%10u\r\n",buf, i++, us_ticker_read()); |
kenjiArai | 8:4006b111c0d4 | 156 | } |
kenjiArai | 8:4006b111c0d4 | 157 | Thread::wait(1000); |
kenjiArai | 8:4006b111c0d4 | 158 | } |
kenjiArai | 8:4006b111c0d4 | 159 | } |
kenjiArai | 8:4006b111c0d4 | 160 | |
kenjiArai | 4:76b3113c79ff | 161 | // Interrupt routine |
kenjiArai | 4:76b3113c79ff | 162 | void queue_isr0() { |
kenjiArai | 4:76b3113c79ff | 163 | queue0.put((uint32_t*)1); |
kenjiArai | 4:76b3113c79ff | 164 | } |
kenjiArai | 4:76b3113c79ff | 165 | |
kenjiArai | 4:76b3113c79ff | 166 | // Update sensor data |
kenjiArai | 10:1c0f58b9c048 | 167 | void update_sensor(void const *args){ // No need to connect I2C line |
kenjiArai | 10:1c0f58b9c048 | 168 | char cmd[2]; |
kenjiArai | 10:1c0f58b9c048 | 169 | uint8_t i = 0; |
kenjiArai | 10:1c0f58b9c048 | 170 | |
kenjiArai | 10:1c0f58b9c048 | 171 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 172 | osDelay(1000); |
kenjiArai | 10:1c0f58b9c048 | 173 | i2c1.frequency(50000); |
kenjiArai | 4:76b3113c79ff | 174 | while (true) { |
kenjiArai | 4:76b3113c79ff | 175 | osEvent evt = queue0.get(); |
kenjiArai | 4:76b3113c79ff | 176 | // ---->lock |
kenjiArai | 4:76b3113c79ff | 177 | i2c_mutex.lock(); |
kenjiArai | 10:1c0f58b9c048 | 178 | cmd[0] = 0x55; |
kenjiArai | 10:1c0f58b9c048 | 179 | cmd[1] = 0xaa; |
kenjiArai | 10:1c0f58b9c048 | 180 | i2c1.write(0xa4, cmd, 2); |
kenjiArai | 10:1c0f58b9c048 | 181 | if (i2c1.read(0xa4, cmd, 2)){ |
kenjiArai | 10:1c0f58b9c048 | 182 | fa[0] = fa[1] = fa[2] = 1.11f + (++i / 100); |
kenjiArai | 10:1c0f58b9c048 | 183 | fg[0] = fg[1] = fg[2] = 2.22f + (++i / 100); |
kenjiArai | 10:1c0f58b9c048 | 184 | } else { |
kenjiArai | 10:1c0f58b9c048 | 185 | fa[0] = fa[1] = fa[2] = -0.01f - (++i / 100); |
kenjiArai | 10:1c0f58b9c048 | 186 | fg[0] = fg[1] = fg[2] = 0.01f + (++i / 100); |
kenjiArai | 10:1c0f58b9c048 | 187 | } |
kenjiArai | 4:76b3113c79ff | 188 | // <----unlock |
kenjiArai | 4:76b3113c79ff | 189 | i2c_mutex.unlock(); |
kenjiArai | 5:dccdaaa1e57b | 190 | // debug |
kenjiArai | 5:dccdaaa1e57b | 191 | task0 = !task0; |
kenjiArai | 10:1c0f58b9c048 | 192 | osDelay(1000); |
kenjiArai | 4:76b3113c79ff | 193 | } |
kenjiArai | 4:76b3113c79ff | 194 | } |
kenjiArai | 4:76b3113c79ff | 195 | |
kenjiArai | 4:76b3113c79ff | 196 | // Update sensor data |
kenjiArai | 10:1c0f58b9c048 | 197 | void adc(void const *args){ |
kenjiArai | 4:76b3113c79ff | 198 | while (true) { |
kenjiArai | 10:1c0f58b9c048 | 199 | #if defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 10:1c0f58b9c048 | 200 | analog[0] = adc1.read(); |
kenjiArai | 10:1c0f58b9c048 | 201 | analog[1] = adc3.read(); |
kenjiArai | 10:1c0f58b9c048 | 202 | #else |
kenjiArai | 10:1c0f58b9c048 | 203 | analog[0] = 1.2f; |
kenjiArai | 10:1c0f58b9c048 | 204 | analog[1] = 3.4f; |
kenjiArai | 5:dccdaaa1e57b | 205 | #endif |
kenjiArai | 10:1c0f58b9c048 | 206 | osDelay(500); // miliseconds |
kenjiArai | 5:dccdaaa1e57b | 207 | task1 = !task1; |
kenjiArai | 4:76b3113c79ff | 208 | } |
kenjiArai | 4:76b3113c79ff | 209 | } |
kenjiArai | 4:76b3113c79ff | 210 | |
kenjiArai | 10:1c0f58b9c048 | 211 | // Update sensor data |
kenjiArai | 10:1c0f58b9c048 | 212 | void pwm_and_dac(void const *args){ |
kenjiArai | 10:1c0f58b9c048 | 213 | uint8_t i = 0; |
kenjiArai | 10:1c0f58b9c048 | 214 | while (true) { |
kenjiArai | 10:1c0f58b9c048 | 215 | #if defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 10:1c0f58b9c048 | 216 | dac0.write(out_data[i & 0x0f]); |
kenjiArai | 10:1c0f58b9c048 | 217 | dac1.write(out_data[i & 0x0f]); |
kenjiArai | 10:1c0f58b9c048 | 218 | #endif |
kenjiArai | 10:1c0f58b9c048 | 219 | osDelay(500); // miliseconds |
kenjiArai | 10:1c0f58b9c048 | 220 | i++; |
kenjiArai | 10:1c0f58b9c048 | 221 | } |
kenjiArai | 10:1c0f58b9c048 | 222 | } |
kenjiArai | 10:1c0f58b9c048 | 223 | |
kenjiArai | 4:76b3113c79ff | 224 | // Thread definition |
kenjiArai | 10:1c0f58b9c048 | 225 | osThreadDef(update_sensor, osPriorityNormal, 1024); |
kenjiArai | 5:dccdaaa1e57b | 226 | osThreadDef(monitor, osPriorityNormal, 1024); |
kenjiArai | 8:4006b111c0d4 | 227 | osThreadDef(watch_time, osPriorityNormal, 1024); |
kenjiArai | 10:1c0f58b9c048 | 228 | osThreadDef(adc, osPriorityAboveNormal, 1024); |
kenjiArai | 10:1c0f58b9c048 | 229 | osThreadDef(pwm_and_dac, osPriorityAboveNormal, 1024); |
kenjiArai | 4:76b3113c79ff | 230 | |
kenjiArai | 4:76b3113c79ff | 231 | int main(void) { |
kenjiArai | 10:1c0f58b9c048 | 232 | osDelay(1000); // wait 1sec |
kenjiArai | 10:1c0f58b9c048 | 233 | // PUTS("\x1b[2J\x1b[H"); |
kenjiArai | 10:1c0f58b9c048 | 234 | PUTS("\r\nCreated on "__DATE__ " " __TIME__ " (UTC)\r\n""\r\n"); |
kenjiArai | 10:1c0f58b9c048 | 235 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 236 | if (SetRTC(0) == 1) { |
kenjiArai | 10:1c0f58b9c048 | 237 | PRINTF("Use External CLK (Good for RTC)\r\n"); |
kenjiArai | 10:1c0f58b9c048 | 238 | } else { |
kenjiArai | 10:1c0f58b9c048 | 239 | PRINTF("Use Internal CLK (Bad for RTC)\r\n"); |
kenjiArai | 10:1c0f58b9c048 | 240 | } |
kenjiArai | 10:1c0f58b9c048 | 241 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 242 | time_enter_mode(); |
kenjiArai | 10:1c0f58b9c048 | 243 | DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 244 | RtosTimer led_1_timer(blink, osTimerPeriodic, (void *)0); |
kenjiArai | 4:76b3113c79ff | 245 | RtosTimer led_2_timer(blink, osTimerPeriodic, (void *)1); |
kenjiArai | 4:76b3113c79ff | 246 | RtosTimer led_3_timer(blink, osTimerPeriodic, (void *)2); |
kenjiArai | 10:1c0f58b9c048 | 247 | DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 248 | led_1_timer.start(2000); |
kenjiArai | 4:76b3113c79ff | 249 | led_2_timer.start(1000); |
kenjiArai | 4:76b3113c79ff | 250 | led_3_timer.start(500); |
kenjiArai | 10:1c0f58b9c048 | 251 | DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 252 | Thread thread(send_thread); |
kenjiArai | 10:1c0f58b9c048 | 253 | DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 254 | // IRQ |
kenjiArai | 4:76b3113c79ff | 255 | Ticker ticker0; |
kenjiArai | 4:76b3113c79ff | 256 | Ticker ticker1; |
kenjiArai | 4:76b3113c79ff | 257 | ticker0.attach(queue_isr0, TIME_BASE_S); |
kenjiArai | 10:1c0f58b9c048 | 258 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 259 | #if 0 |
kenjiArai | 10:1c0f58b9c048 | 260 | /// Create a thread and add it to Active Threads and set it to state READY |
kenjiArai | 10:1c0f58b9c048 | 261 | osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) { |
kenjiArai | 10:1c0f58b9c048 | 262 | if (__exceptional_mode()) return NULL; // Not allowed in ISR |
kenjiArai | 10:1c0f58b9c048 | 263 | if ((__get_mode() != MODE_USR) && (os_running == 0)) { |
kenjiArai | 10:1c0f58b9c048 | 264 | // Privileged and not running |
kenjiArai | 10:1c0f58b9c048 | 265 | return svcThreadCreate(thread_def, argument); |
kenjiArai | 10:1c0f58b9c048 | 266 | } else { |
kenjiArai | 10:1c0f58b9c048 | 267 | return __svcThreadCreate(thread_def, argument); |
kenjiArai | 10:1c0f58b9c048 | 268 | } |
kenjiArai | 10:1c0f58b9c048 | 269 | } |
kenjiArai | 10:1c0f58b9c048 | 270 | #endif |
kenjiArai | 5:dccdaaa1e57b | 271 | // Starts threads |
kenjiArai | 10:1c0f58b9c048 | 272 | if (osThreadCreate(osThread(monitor), NULL) == NULL){ |
kenjiArai | 10:1c0f58b9c048 | 273 | PRINTF("ERROR/monitor() thread\r\n"); |
kenjiArai | 5:dccdaaa1e57b | 274 | } |
kenjiArai | 10:1c0f58b9c048 | 275 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 276 | if (osThreadCreate(osThread(update_sensor), NULL) == NULL){ |
kenjiArai | 10:1c0f58b9c048 | 277 | PRINTF("ERROR/update_sensor() thread\r\n"); |
kenjiArai | 5:dccdaaa1e57b | 278 | } |
kenjiArai | 10:1c0f58b9c048 | 279 | DEBUG_LINE |
kenjiArai | 8:4006b111c0d4 | 280 | if (osThreadCreate(osThread(watch_time), NULL) == NULL){ |
kenjiArai | 10:1c0f58b9c048 | 281 | printf("ERROR/watch_time() thread\r\n"); |
kenjiArai | 10:1c0f58b9c048 | 282 | } |
kenjiArai | 10:1c0f58b9c048 | 283 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 284 | if (osThreadCreate(osThread(adc), NULL) == NULL){ |
kenjiArai | 10:1c0f58b9c048 | 285 | PRINTF("ERROR/print4com() therad\r\n"); |
kenjiArai | 8:4006b111c0d4 | 286 | } |
kenjiArai | 10:1c0f58b9c048 | 287 | DEBUG_LINE |
kenjiArai | 10:1c0f58b9c048 | 288 | if (osThreadCreate(osThread(pwm_and_dac), NULL) == NULL){ |
kenjiArai | 10:1c0f58b9c048 | 289 | PRINTF("ERROR/print4com() therad\r\n"); |
kenjiArai | 10:1c0f58b9c048 | 290 | } |
kenjiArai | 10:1c0f58b9c048 | 291 | DEBUG_LINE |
kenjiArai | 5:dccdaaa1e57b | 292 | count = 0; |
kenjiArai | 10:1c0f58b9c048 | 293 | DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 294 | while (true) { |
kenjiArai | 4:76b3113c79ff | 295 | osEvent evt = mail_box.get(); |
kenjiArai | 10:1c0f58b9c048 | 296 | //DEBUG_LINE |
kenjiArai | 4:76b3113c79ff | 297 | if (evt.status == osEventMail) { |
kenjiArai | 4:76b3113c79ff | 298 | mail_t *mail = (mail_t*)evt.value.p; |
kenjiArai | 8:4006b111c0d4 | 299 | if (show_flag0){ |
kenjiArai | 8:4006b111c0d4 | 300 | PRINTF("[MAIN]\r\n"); |
kenjiArai | 4:76b3113c79ff | 301 | PRINTF("This is dummy!, "); |
kenjiArai | 4:76b3113c79ff | 302 | PRINTF("Volt: %.2f V, " , mail->voltage); |
kenjiArai | 4:76b3113c79ff | 303 | PRINTF("Current: %.2f A, " , mail->current); |
kenjiArai | 4:76b3113c79ff | 304 | PRINTF("# of cycles: %u\r\n", mail->counter); |
kenjiArai | 4:76b3113c79ff | 305 | } |
kenjiArai | 4:76b3113c79ff | 306 | mail_box.free(mail); |
kenjiArai | 4:76b3113c79ff | 307 | } |
kenjiArai | 4:76b3113c79ff | 308 | } |
kenjiArai | 4:76b3113c79ff | 309 | } |
kenjiArai | 5:dccdaaa1e57b | 310 | |
kenjiArai | 10:1c0f58b9c048 | 311 | // rtos error routine |
kenjiArai | 5:dccdaaa1e57b | 312 | void mbed_die(void) { |
kenjiArai | 5:dccdaaa1e57b | 313 | PRINTF("Error, came from os_error()!\r\n"); |
kenjiArai | 5:dccdaaa1e57b | 314 | gpio_t led_1; gpio_init_out(&led_1, LED1); |
kenjiArai | 10:1c0f58b9c048 | 315 | gpio_t led_2; gpio_init_out(&led_2, PC_10); |
kenjiArai | 10:1c0f58b9c048 | 316 | gpio_t led_3; gpio_init_out(&led_3, PC_11); |
kenjiArai | 10:1c0f58b9c048 | 317 | gpio_t led_4; gpio_init_out(&led_4, PC_12); |
kenjiArai | 5:dccdaaa1e57b | 318 | |
kenjiArai | 5:dccdaaa1e57b | 319 | while (1) { |
kenjiArai | 5:dccdaaa1e57b | 320 | gpio_write(&led_1, 1); |
kenjiArai | 5:dccdaaa1e57b | 321 | gpio_write(&led_2, 0); |
kenjiArai | 5:dccdaaa1e57b | 322 | gpio_write(&led_3, 0); |
kenjiArai | 5:dccdaaa1e57b | 323 | gpio_write(&led_4, 1); |
kenjiArai | 5:dccdaaa1e57b | 324 | wait_ms(100); |
kenjiArai | 5:dccdaaa1e57b | 325 | gpio_write(&led_1, 0); |
kenjiArai | 5:dccdaaa1e57b | 326 | gpio_write(&led_2, 1); |
kenjiArai | 5:dccdaaa1e57b | 327 | gpio_write(&led_3, 1); |
kenjiArai | 5:dccdaaa1e57b | 328 | gpio_write(&led_4, 0); |
kenjiArai | 5:dccdaaa1e57b | 329 | wait_ms(100); |
kenjiArai | 5:dccdaaa1e57b | 330 | } |
kenjiArai | 5:dccdaaa1e57b | 331 | } |