Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// Include ---------------------------------------------------------------------------------------
#include "mbed.h"
#include "rtos.h"
#define BAUD(x) pcx.baud(x)
#define GETC(x) pcx.getc(x)
#define PUTC(x) pcx.putc(x)
#define PRINTF(...) pcx.printf(__VA_ARGS__)
#define READABLE(x) pcx.readable(x)
#define TIME_BASE_S 0.01
#define TIME_BASE_MS ( TIME_BASE_S * 1000)
#define RATE 0.1
// LED's
DigitalOut LEDs[4] = {
DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4)
};
Serial pcx(USBTX, USBRX); // Communication with Host
Queue<uint32_t, 2> queue0;
Queue<uint32_t, 2> queue1;
/* Mail */
typedef struct {
float voltage; /* AD result of measured voltage */
float current; /* AD result of measured current */
uint32_t counter; /* A counter value */
} mail_t;
Mail<mail_t, 16> mail_box;
uint8_t show_flag;
// ROM / Constant data ---------------------------------------------------------------------------
// Function prototypes ---------------------------------------------------------------------------
// Function prototypes ---------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// Control Program
//-------------------------------------------------------------------------------------------------
void send_thread (void const *args) {
uint32_t i = 0;
while (true) {
i++; // fake data update
mail_t *mail = mail_box.alloc();
mail->voltage = (i * 0.1) * 33;
mail->current = (i * 0.1) * 11;
mail->counter = i;
mail_box.put(mail);
Thread::wait(1000);
}
}
void blink(void const *n) {
LEDs[(int)n] = !LEDs[(int)n];
}
// Read switch status
int read_sw(uint8_t n){
}
// Monitor program
void monitor(void const *args){
}
// Interrupt routine
void queue_isr0() {
queue0.put((uint32_t*)1);
}
void queue_isr1() {
queue1.put((uint32_t*)1);
}
// Update sensor data
void update_angle(void const *args){
}
// Read angle and control an inertia rotor
void rotor_control(void const *args){
}
// Update sensor data
void display(void const *args){
}
// Thread definition
osThreadDef(update_angle, osPriorityRealtime, 4096);
osThreadDef(rotor_control, osPriorityAboveNormal, 4096);
osThreadDef(monitor, osPriorityNormal, 4096);
osThreadDef(display, osPriorityNormal, 4096);
int main(void) {
PRINTF("step1\r\n");
RtosTimer led_1_timer(blink, osTimerPeriodic, (void *)0);
RtosTimer led_2_timer(blink, osTimerPeriodic, (void *)1);
RtosTimer led_3_timer(blink, osTimerPeriodic, (void *)2);
RtosTimer led_4_timer(blink, osTimerPeriodic, (void *)3);
PRINTF("step2\r\n");
led_1_timer.start(2000);
led_2_timer.start(1000);
led_3_timer.start(500);
led_4_timer.start(250);
PRINTF("step3\r\n");
Thread thread(send_thread);
PRINTF("step4\r\n");
// IRQ
Ticker ticker0;
Ticker ticker1;
ticker0.attach(queue_isr0, TIME_BASE_S);
ticker1.attach(queue_isr1, RATE);
// rotor.set_max_speed(TIMEBASE);
PRINTF("step5\r\n");
// Starts 1st thread
osThreadCreate(osThread(update_angle), NULL);
// Starts 2nd thread
osThreadCreate(osThread(rotor_control), NULL);
// Starts 3rd thread
osThreadCreate(osThread(monitor), NULL);
// Starts 4th thread
osThreadCreate(osThread(display), NULL);
PRINTF("step6\r\n");
while (true) {
osEvent evt = mail_box.get();
if (evt.status == osEventMail) {
mail_t *mail = (mail_t*)evt.value.p;
if (show_flag){
PRINTF("This is dummy!, ");
PRINTF("Volt: %.2f V, " , mail->voltage);
PRINTF("Current: %.2f A, " , mail->current);
PRINTF("# of cycles: %u\r\n", mail->counter);
}
mail_box.free(mail);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.