RTOS example - inter-task communication by using a message queue. One task provides numbers and sends them to a second task which displays them on a 4-digit 7-segment LED tube driven by two 74HC595 shift registers. Hardware: NUCLEO_F446RE board with Arduino Multifunction Shield. The ShiftOut Library by Ollie Milton …
Dependencies: mbed mbed-rtos ShiftOut
main.cpp
- Committer:
- cspista
- Date:
- 2022-02-24
- Revision:
- 0:fb9706dc4816
File content as of revision 0:fb9706dc4816:
#include "mbed.h"
#include "rtos.h"
#include "ShiftOut.h" // Ollie Milton, https://os.mbed.com/users/ollie8/code/ShiftOut/
DigitalOut buzzer(D3);
Serial pc(USBTX,USBRX); //UART via ST-Link
typedef uint32_t message_t;
Queue <message_t, 4> queue;
void display_thread(void const *argument)
{
ShiftOut display(D7, D8, D4); // clk=D7, data=D8, latch=D4, 16)
uint8_t segment_data[4] = {0xFF, 0xFF, 0xFF, 0xFF}; // A frissítendő szegmenskép
/* Számjegyek (0 – 9) szegmensképe, negatív logikával */
const uint8_t SEGMENT_MAP[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* Számjegy (1 - 4) kiválasztó jelek */
const uint8_t SEGMENT_SELECT[] = {0x01, 0x02, 0x04, 0x08};
uint8_t i, idx = 0;
while (true) {
osEvent evt = queue.get(0); // Check for a message without waiting
switch(evt.status) {
case osEventMessage:
printf("osEventMessage = %#05x\n",evt.value.v); //message arrived
int n = evt.value.v;
segment_data[0] = SEGMENT_MAP[(n/1000) %10];
segment_data[1] = SEGMENT_MAP[(n/100) % 10];
segment_data[2] = SEGMENT_MAP[(n/10) % 10];
segment_data[3] = SEGMENT_MAP[n % 10];
break;
case osOK:
//--- pc.printf("osOK\n"); //no error, no message arrived
i = idx++ & 0x03;
display.write(segment_data[i]);
display.write(SEGMENT_SELECT[i]);
break;
case osEventTimeout:
pc.printf("osEventTimeout\n"); //timeout occurred
break;
case osErrorParameter:
pc.printf("osErrorParameter\n");
break; //invalid parameter or is out of range.
default:
pc.printf("Unknown error flag: %#08x\n",(uint32_t)evt.status);
break;
};
Thread::wait(2);
}
}
int main (void)
{
uint16_t raw;
Thread thread2(display_thread);
pc.baud(115200);
buzzer = true;
while (true) {
Thread::wait(1000);
raw++;
queue.put((message_t*)raw);
}
}