/* * usermain.c (usermain) * User Main */ #include #include #include #include "utk_config.h" #define GPIOBase 0x40033000 #define PFR0 ((_UW *)(GPIOBase + 0x000)) #define PCR0 ((_UW *)(GPIOBase + 0x100)) #define DDR0 ((_UW *)(GPIOBase + 0x200)) #define PDIR0 ((_UW *)(GPIOBase + 0x300)) #define PFR3 ((_UW *)(GPIOBase + 0x00c)) #define DDR3 ((_UW *)(GPIOBase + 0x20c)) #define PDOR3 ((_UW *)(GPIOBase + 0x40c)) #define USER_SW (1 << 15) /* P0F */ #define LED_BLUE (1 << 14) /* P3E */ #define LED_GREEN (1 << 12) /* P3C */ #define LED_RED (1 << 10) /* P3A */ LOCAL ID TskID; LOCAL void task(void) { UW imask; /* task: poll user sw */ while (1) { if (*PDIR0 & USER_SW) { /* release: turn off */ DI(imask); *PDOR3 &= ~LED_BLUE; EI(imask); } else { /* press: turn on */ DI(imask); *PDOR3 |= LED_BLUE; EI(imask); } tk_dly_tsk(10); } tk_exd_tsk(); } EXPORT INT usermain(void) { UW imask; ER er; T_CTSK ctsk = { .exinf = NULL, .tskatr = TA_HLNG | TA_RNG0, .task = task, .itskpri = INIT_TASK_PRI, .stksz = 512, }; /* GPIO setup */ DI(imask); *PDOR3 &= ~(LED_BLUE | LED_GREEN | LED_RED); // turn off *DDR3 |= (LED_BLUE | LED_GREEN | LED_RED); // select output *PFR3 &= ~(LED_BLUE | LED_GREEN | LED_RED); // select GPIO *DDR0 &= ~USER_SW; // select input *PFR0 &= ~USER_SW; // select GPIO *PCR0 &= ~USER_SW; // disable pull-up EI(imask); /* task setup */ er = tk_cre_tsk(&ctsk); if (er < E_OK) goto fin0; TskID = er; er = tk_sta_tsk(TskID, 0); if (er < E_OK) goto fin1; /* task: blink red LED */ while (1) { DI(imask); *PDOR3 ^= LED_RED; EI(imask); tk_dly_tsk(500); } /*fin2:*/ tk_ter_tsk(TskID); fin1: tk_del_tsk(TskID); fin0: tm_putstring((UB*)"aborted\n"); return 0; }