/* * usermain.c (usermain) * User Main */ #include #include #include #include "utk_config.h" #define GPIOBase 0x40033000 #define PFR3 ((_UW *)(GPIOBase + 0x00c)) #define DDR3 ((_UW *)(GPIOBase + 0x20c)) #define PDOR3 ((_UW *)(GPIOBase + 0x40c)) #define LED_BLUE (1 << 14) /* P3E */ #define LED_GREEN (1 << 12) /* P3C */ #define LED_RED (1 << 10) /* P3A */ #define TimerBase 0x40025000 /* Base Timer ch.0 */ #define PCSR ((_UH *)(TimerBase + 0x000)) #define PDUT ((_UH *)(TimerBase + 0x004)) #define TMR ((_UH *)(TimerBase + 0x008)) #define TMCR ((_UH *)(TimerBase + 0x00c)) #define STC ((_UB *)(TimerBase + 0x010)) #define TMCR2 ((_UB *)(TimerBase + 0x011)) #define TMCR_CKS_DIV1 (0 << 12) #define TMCR_CKS_DIV4 (1 << 12) #define TMCR_CKS_DIV16 (2 << 12) #define TMCR_CKS_DIV128 (3 << 12) #define TMCR_CKS_DIV256 (4 << 12) #define TMCR_FMD_RELOAD (3 << 4) #define TMCR_CTEN (1 << 1) #define TMCR_STRG (1 << 0) #define STC_UDIE (1 << 4) #define TimerVec 31 #define PCSRVal 0x0800 LOCAL ID FlgID; LOCAL ID TskID; LOCAL void handler(void) { *STC = STC_UDIE; tk_set_flg(FlgID, LED_BLUE); return; } LOCAL void task(void) { UW imask; ER er; UINT flgptn; /* task: turn on/off LED */ while (1) { er = tk_wai_flg(FlgID, ~0, TWF_ORW | TWF_BITCLR, &flgptn, TMO_FEVR); if (er < E_OK) goto fin0; DI(imask); *PDOR3 ^= flgptn; EI(imask); } fin0: tk_exd_tsk(); } EXPORT INT usermain(void) { UW imask; ER er; T_DINT dint = { .intatr = TA_HLNG, .inthdr = handler, }; T_CFLG cflg = { .exinf = NULL, .flgatr = TA_TFIFO | TA_WSGL, .iflgptn = 0, }; 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 EI(imask); /* event flag setup */ er = tk_cre_flg(&cflg); if (er < E_OK) goto fin0; FlgID = er; /* interrupt handler setup */ er = tk_def_int(TimerVec, &dint); if (er < E_OK) goto fin1; /* Timer setup */ *TMCR = 0; *TMCR = TMCR_CKS_DIV256 | TMCR_FMD_RELOAD; *STC = STC_UDIE; *PCSR = PCSRVal; *TMCR = TMCR_CKS_DIV256 | TMCR_FMD_RELOAD | TMCR_CTEN | TMCR_STRG; EnableInt(TimerVec); /* task setup */ er = tk_cre_tsk(&ctsk); if (er < E_OK) goto fin2; TskID = er; er = tk_sta_tsk(TskID, 0); if (er < E_OK) goto fin3; /* task: blink red LED */ while (1) { tk_set_flg(FlgID, LED_RED); tk_dly_tsk(500); } /*fin4:*/ tk_ter_tsk(TskID); fin3: tk_del_tsk(TskID); fin2: DisableInt(TimerVec); *TMCR = 0; tk_def_int(TimerVec, NULL); fin1: tk_del_flg(FlgID); fin0: tm_putstring((UB*)"aborted\n"); return 0; }