Lin ShengKun
/
rtos_mutex
NYP
Fork of rtos_mutex by
main.cpp@8:075a9610e2cd, 2018-05-02 (annotated)
- Committer:
- ha731548874
- Date:
- Wed May 02 03:30:28 2018 +0000
- Revision:
- 8:075a9610e2cd
- Parent:
- 7:bd0aa7f21f53
NYP
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emilmont | 1:0f886ffbe0c1 | 1 | #include "mbed.h" |
mbed_official | 7:bd0aa7f21f53 | 2 | #include "rtos.h" |
ha731548874 | 8:075a9610e2cd | 3 | DigitalOut l1(LED1); |
ha731548874 | 8:075a9610e2cd | 4 | DigitalOut l2(LED2); |
ha731548874 | 8:075a9610e2cd | 5 | DigitalOut l3(LED3); |
ha731548874 | 8:075a9610e2cd | 6 | DigitalOut l4(LED4); |
ha731548874 | 8:075a9610e2cd | 7 | Thread servo; |
ha731548874 | 8:075a9610e2cd | 8 | //Mutex stdio_mutex; |
ha731548874 | 8:075a9610e2cd | 9 | RawSerial motor(PC_4,PC_5); |
ha731548874 | 8:075a9610e2cd | 10 | unsigned char tx_buffer[3]; |
ha731548874 | 8:075a9610e2cd | 11 | unsigned char tx_buffer_ptr = 0; |
ha731548874 | 8:075a9610e2cd | 12 | unsigned char tx_buffer_full = false; |
ha731548874 | 8:075a9610e2cd | 13 | unsigned char rx_buffer[6]; |
ha731548874 | 8:075a9610e2cd | 14 | unsigned char rx_buffer_ptr = 0; |
ha731548874 | 8:075a9610e2cd | 15 | unsigned char rx_buffer_full = false; |
ha731548874 | 8:075a9610e2cd | 16 | signed short int motorcp[] = {8500,8500}; |
ha731548874 | 8:075a9610e2cd | 17 | unsigned short int Position; |
ha731548874 | 8:075a9610e2cd | 18 | int MotorID; |
ha731548874 | 8:075a9610e2cd | 19 | void Tx_interrupt(); |
ha731548874 | 8:075a9610e2cd | 20 | void Rx_interrupt(); |
ha731548874 | 8:075a9610e2cd | 21 | void motor_update(unsigned char Id, unsigned short int Position) |
ha731548874 | 8:075a9610e2cd | 22 | { |
ha731548874 | 8:075a9610e2cd | 23 | unsigned char id,lo,hi; |
ha731548874 | 8:075a9610e2cd | 24 | id=0x80|Id; |
ha731548874 | 8:075a9610e2cd | 25 | hi=(Position>>7)&0x007F; |
ha731548874 | 8:075a9610e2cd | 26 | lo=Position&0x007F; |
ha731548874 | 8:075a9610e2cd | 27 | NVIC_DisableIRQ(USART3_IRQn); |
ha731548874 | 8:075a9610e2cd | 28 | tx_buffer[0] = id; |
ha731548874 | 8:075a9610e2cd | 29 | tx_buffer[1] = hi; |
ha731548874 | 8:075a9610e2cd | 30 | tx_buffer[2] = lo; |
ha731548874 | 8:075a9610e2cd | 31 | // wait(0.0008); |
ha731548874 | 8:075a9610e2cd | 32 | NVIC_EnableIRQ(USART3_IRQn); |
emilmont | 1:0f886ffbe0c1 | 33 | } |
ha731548874 | 8:075a9610e2cd | 34 | void tx_thread() |
ha731548874 | 8:075a9610e2cd | 35 | { |
ha731548874 | 8:075a9610e2cd | 36 | // stdio_mutex.lock(); |
ha731548874 | 8:075a9610e2cd | 37 | for(MotorID=0;MotorID<=1;MotorID++) |
ha731548874 | 8:075a9610e2cd | 38 | { |
ha731548874 | 8:075a9610e2cd | 39 | motor_update(MotorID,motorcp[MotorID]); |
ha731548874 | 8:075a9610e2cd | 40 | wait_us(900); |
ha731548874 | 8:075a9610e2cd | 41 | } |
ha731548874 | 8:075a9610e2cd | 42 | // stdio_mutex.unlock(); |
ha731548874 | 8:075a9610e2cd | 43 | } |
ha731548874 | 8:075a9610e2cd | 44 | void SERVO_thread() |
ha731548874 | 8:075a9610e2cd | 45 | { |
ha731548874 | 8:075a9610e2cd | 46 | motor.format(8,Serial::Even,1); |
ha731548874 | 8:075a9610e2cd | 47 | motor.baud(115200); |
ha731548874 | 8:075a9610e2cd | 48 | rx_buffer_ptr = 0; |
ha731548874 | 8:075a9610e2cd | 49 | rx_buffer_full = false; |
ha731548874 | 8:075a9610e2cd | 50 | motor.attach(&Rx_interrupt, Serial::RxIrq); |
ha731548874 | 8:075a9610e2cd | 51 | motor.attach(&Tx_interrupt, Serial::TxIrq); |
ha731548874 | 8:075a9610e2cd | 52 | NVIC_EnableIRQ(USART3_IRQn); |
ha731548874 | 8:075a9610e2cd | 53 | RtosTimer motorposition(tx_thread); |
ha731548874 | 8:075a9610e2cd | 54 | motorposition.start(10); |
ha731548874 | 8:075a9610e2cd | 55 | while(1) |
ha731548874 | 8:075a9610e2cd | 56 | { |
ha731548874 | 8:075a9610e2cd | 57 | motorcp[0]=7500; |
ha731548874 | 8:075a9610e2cd | 58 | motorcp[1]=7500; |
ha731548874 | 8:075a9610e2cd | 59 | Thread::wait(1000); |
ha731548874 | 8:075a9610e2cd | 60 | motorcp[0]=8500; |
ha731548874 | 8:075a9610e2cd | 61 | motorcp[1]=8500; |
ha731548874 | 8:075a9610e2cd | 62 | Thread::wait(1000); |
emilmont | 1:0f886ffbe0c1 | 63 | } |
emilmont | 1:0f886ffbe0c1 | 64 | } |
ha731548874 | 8:075a9610e2cd | 65 | int main() |
ha731548874 | 8:075a9610e2cd | 66 | { |
ha731548874 | 8:075a9610e2cd | 67 | servo.start(SERVO_thread); |
ha731548874 | 8:075a9610e2cd | 68 | while (1) |
ha731548874 | 8:075a9610e2cd | 69 | { |
ha731548874 | 8:075a9610e2cd | 70 | l1=!l1; |
ha731548874 | 8:075a9610e2cd | 71 | Thread::wait(1000); |
ha731548874 | 8:075a9610e2cd | 72 | // printf("Tx : %d %x %x\r\n",tx_buffer[0],tx_buffer[1],tx_buffer[2]); |
ha731548874 | 8:075a9610e2cd | 73 | // printf("RX : %d %x %x %d %x %x \r\n",rx_buffer[0], rx_buffer[1],rx_buffer[2],rx_buffer[3],rx_buffer[4],rx_buffer[5]); |
ha731548874 | 8:075a9610e2cd | 74 | } |
emilmont | 1:0f886ffbe0c1 | 75 | } |
ha731548874 | 8:075a9610e2cd | 76 | void Tx_interrupt() |
ha731548874 | 8:075a9610e2cd | 77 | { |
ha731548874 | 8:075a9610e2cd | 78 | while(motor.writeable()) |
ha731548874 | 8:075a9610e2cd | 79 | { |
ha731548874 | 8:075a9610e2cd | 80 | motor.putc(tx_buffer[tx_buffer_ptr]); |
ha731548874 | 8:075a9610e2cd | 81 | tx_buffer_ptr++; |
ha731548874 | 8:075a9610e2cd | 82 | if(tx_buffer_ptr==3) |
ha731548874 | 8:075a9610e2cd | 83 | tx_buffer_ptr = 0; |
ha731548874 | 8:075a9610e2cd | 84 | } |
ha731548874 | 8:075a9610e2cd | 85 | return; |
ha731548874 | 8:075a9610e2cd | 86 | } |
ha731548874 | 8:075a9610e2cd | 87 | void Rx_interrupt() |
ha731548874 | 8:075a9610e2cd | 88 | { |
ha731548874 | 8:075a9610e2cd | 89 | while(motor.readable()) |
ha731548874 | 8:075a9610e2cd | 90 | { |
ha731548874 | 8:075a9610e2cd | 91 | rx_buffer[rx_buffer_ptr] = motor.getc(); |
ha731548874 | 8:075a9610e2cd | 92 | rx_buffer_ptr++; |
ha731548874 | 8:075a9610e2cd | 93 | if(rx_buffer_ptr==6) |
ha731548874 | 8:075a9610e2cd | 94 | { |
ha731548874 | 8:075a9610e2cd | 95 | rx_buffer_full = true; |
ha731548874 | 8:075a9610e2cd | 96 | rx_buffer_ptr=0; |
ha731548874 | 8:075a9610e2cd | 97 | } |
ha731548874 | 8:075a9610e2cd | 98 | } |
ha731548874 | 8:075a9610e2cd | 99 | } |