104 #define LC_RESUME(lc) 172 #ifndef __LC_ADDRLABELS_H__ 173 #define __LC_ADDRLABELS_H__ 178 #define LC_INIT(s) s = NULL 180 #define LC_RESUME(s) \ 187 #define LC_CONCAT2(s1, s2) s1##s2 188 #define LC_CONCAT(s1, s2) LC_CONCAT2(s1, s2) 192 LC_CONCAT(LC_LABEL, __LINE__): \ 193 (s) = &&LC_CONCAT(LC_LABEL, __LINE__); \ 230 #define PT_INIT(pt) LC_INIT((pt)->lc) 250 #define PT_THREAD(name_args) char name_args 265 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) 277 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ 278 PT_INIT(pt); return PT_ENDED; } 298 #define PT_WAIT_UNTIL(pt, condition) \ 317 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) 342 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) 356 #define PT_SPAWN(pt, child, thread) \ 359 PT_WAIT_THREAD((pt), (thread)); \ 379 #define PT_RESTART(pt) \ 396 #define PT_EXIT(pt) \ 421 #define PT_SCHEDULE(f) ((f) < PT_EXITED) 441 #define PT_YIELD(pt) \ 445 if(PT_YIELD_FLAG == 0) { \ 461 #define PT_YIELD_UNTIL(pt, cond) \ 465 if((PT_YIELD_FLAG == 0) || !(cond)) { \ 497 #define PT_SEM_INIT(s, c) (s)->count = c 515 #define PT_SEM_WAIT(pt, s) \ 517 PT_WAIT_UNTIL(pt, (s)->count > 0); \ 536 #define PT_SEM_SIGNAL(pt, s) ++(s)->count 550 #define PT_YIELD_TIME_msec(delay_time) \ 551 do { static unsigned int time_thread ;\ 552 time_thread = time_tick_millsec + (unsigned int)delay_time ; \ 553 PT_YIELD_UNTIL(pt, (time_tick_millsec >= time_thread)); \ 557 #define PT_GET_TIME() (time_tick_millsec) 562 #define PT_RATE_INIT() int pt_pri_count = 0; 565 #define PT_RATE_LOOP() pt_pri_count = (pt_pri_count+1) & 0xf ; 573 #define PT_RATE_SCHEDULE(f,rate) \ 575 (rate==1 && ((pt_pri_count & 0b1)==0) ) | \ 576 (rate==2 && ((pt_pri_count & 0b11)==0) ) | \ 577 (rate==3 && ((pt_pri_count & 0b111)==0)) | \ 578 (rate==4 && ((pt_pri_count & 0b1111)==0))) \ 586 #define PT_DEBUG_VALUE(level, duration) \ 587 do { static int i ; \ 588 CVRCON = CVRCON_setup | (level & 0xf); \ 590 for (i=0; i<duration*7; i++){};\ 591 CVRCON = CVRCON_setup; \ 596 #define PT_SEM_SET(s) (s)->count=1 597 #define PT_SEM_CLEAR(s) (s)->count=0 598 #define PT_SEM_READ(s) (s)->count 599 #define PT_SEM_ACCEPT(s) \ 601 if (s->count) s->count-- ; \ 609 #define PB_DIVISOR (1 << OSCCONbits.PBDIV) // read the peripheral bus divider, FPBDIV 610 #define PB_FREQ sys_clock/PB_DIVISOR // periperhal bus frequency 611 #define clrscr() printf( "\x1b[2J") 612 #define home() printf( "\x1b[H") 613 #define pcr() printf( '\r') 614 #define crlf putchar(0x0a); putchar(0x0d); 615 #define backspace 0x7f // make sure your backspace matches this! 616 #define max_chars 64 // for input/output buffer 624 static char character;
638 character = UARTGetDataByte(UART2);
640 UARTSendDataByte(UART2, character);
646 if(character ==
'\r'){
650 UARTSendDataByte(UART2,
'\n');
656 UARTSendDataByte(UART2,
' ');
706 DmaChnEnable(DMA_CHANNEL1);
709 PT_YIELD_UNTIL(pt, DmaChnGetEvFlags(DMA_CHANNEL1) & DMA_EV_BLOCK_DONE);
729 void __ISR(_TIMER_5_VECTOR, IPL2AUTO) Timer5Handler(
void)
743 SYSTEMConfig(
sys_clock, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
748 #ifdef use_uart_serial 750 PPSInput (2, U2RX, RPB11);
751 PPSOutput(4, RPB10, U2TX);
752 UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
753 UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
754 UARTSetDataRate(UART2,
pb_clock, BAUDRATE);
755 UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
756 printf(
"\n\r..protothreads start..\n\r");
759 DmaChnOpen(DMA_CHANNEL1, DMA_CHN_PRI2, DMA_OPEN_MATCH);
761 DmaChnSetEventControl(DMA_CHANNEL1, DMA_EV_START_IRQ_EN|DMA_EV_MATCH_EN|DMA_EV_START_IRQ(_UART2_TX_IRQ));
765 DmaChnSetEvEnableFlags(DMA_CHANNEL1, DMA_EV_BLOCK_DONE);
767 DmaChnSetMatchPattern(DMA_CHANNEL1, 0x00);
768 #endif //#ifdef use_uart_serial 773 OpenTimer5(T5_ON | T5_SOURCE_INT | T5_PS_1_1 ,
pb_clock/1000);
775 ConfigIntTimer5(T5_INT_ON | T5_INT_PRIOR_2);
781 #ifdef use_vref_debug 784 CVREFOpen( CVREF_ENABLE | CVREF_OUTPUT_ENABLE | CVREF_RANGE_LOW | CVREF_SOURCE_AVDD | CVREF_STEP_0 );
789 #endif //#ifdef use_vref_debug
#define PT_YIELD_UNTIL(pt, cond)
Yield from the protothread until a condition occurs.
int PT_GetSerialBuffer(struct pt *pt)
int PT_DMA_PutSerialBuffer(struct pt *pt)
void __ISR(_TIMER_5_VECTOR, IPL2AUTO) Timer5Handler(void)
volatile unsigned int time_tick_millsec
char PT_term_buffer[max_chars]
char PT_send_buffer[max_chars]
int PutSerialBuffer(struct pt *pt)