/* Led线程3的主函数 */ static void ThreadLed3Entry(TArgument data) { TError error; TState state; TLedMail* pMail; while (eTrue) { /* Led线程以阻塞方式接收邮件 */ state = TclReceiveMail(&LedMailbox, (TMail*)(&pMail), TCLO_IPC_WAIT, TCLM_MLS2TICKS(1000), &error); if ((state != eSuccess) && (error & TCLE_IPC_FLUSH)) { EvbLedControl(LED3, LED_ON); } /* Led线程以阻塞方式接收邮件 */ state = TclReceiveMail(&LedMailbox, (TMail*)(&pMail), TCLO_IPC_WAIT, TCLM_MLS2TICKS(1000), &error); if ((state != eSuccess) && (error & TCLE_IPC_FLUSH)) { EvbLedControl(LED3, LED_OFF); } } }
/* Led线程2的主函数 */ static void ThreadLed2Entry(TArgument arg) { TState state; TError error; while (eTrue) { /* Led线程2点亮Led2 */ EvbLedControl(LED2, LED_ON); /* Led线程2延时1秒后关闭Led2 */ state =TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); EvbLedControl(LED2, LED_OFF); /* Led线程2以非阻塞方式释放信号量1 */ state =TclReleaseSemaphore(&LedSemaphore1, TCLO_IPC_DUMMY, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led线程2以阻塞方式获取信号量2 */ state = TclObtainSemaphore(&LedSemaphore2, TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* Led2线程的主函数 */ static void ThreadLed3Entry(TArgument data) { TState state; TError error; TBitMask pattern; TOption option; while (eTrue) { /* Led线程以阻塞方式获取事件,当发现事件标记flush后点亮Led */ pattern = 0xa2; option = TCLO_IPC_WAIT | TCLO_IPC_OR | TCLO_IPC_CONSUME; state = TclReceiveFlags(&LedFlags, &pattern, option, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_RESET)) { EvbLedControl(LED3, LED_ON); } /* Led线程以阻塞方式获取事件,当发现事件标记flush后熄灭Led */ pattern = 0xa2; option = TCLO_IPC_WAIT | TCLO_IPC_OR | TCLO_IPC_CONSUME; state = TclReceiveFlags(&LedFlags, &pattern, option, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_RESET)) { EvbLedControl(LED3, LED_OFF); } } }
/* Led3线程的主函数 */ static void ThreadLed3Entry(TArgument data) { TState state; TError error; TLedMsg* pMsg; while (eTrue) { /* Led3线程以阻塞方式接收消息,如果发现消息队列FLUSH则熄灭Led3 */ state = TclReceiveMessage(&LedMQ, (void**)(&pMsg), TCLO_IPC_WAIT, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_RESET)) { EvbLedControl(LED3, LED_ON); } /* Led3线程以阻塞方式接收消息,如果发现消息队列FLUSH则点亮Led3 */ state = TclReceiveMessage(&LedMQ, (void**)(&pMsg), TCLO_IPC_WAIT, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_RESET)) { EvbLedControl(LED3, LED_OFF); } } }
/* Led1线程的主函数 */ static void ThreadLed1Entry(TArgument data) { TState state; TError error; TLedMail* pMail1; TLedMail* pMail2; pMail2 = &Led2Mail; while (eTrue) { /* Led1线程以阻塞方式接收Led1控制邮件 */ state = TclReceiveMail(&Led1MailBox, (TMail*)(&pMail1), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led1线程控制Led1的点亮或熄灭 */ EvbLedControl(pMail1->Index, pMail1->Value); /* Led1线程延时1秒 */ state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* Led1线程以阻塞方式发送Led2点亮邮件 */ pMail2->Index = LED2; pMail2->Value = LED_ON; state = TclSendMail(&Led2MailBox, (TMail*)(&pMail2), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led1线程以阻塞方式接收Led1控制邮件 */ state = TclReceiveMail(&Led1MailBox, (TMail*)(&pMail1), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led1线程控制Led1的点亮或熄灭 */ EvbLedControl(pMail1->Index, pMail1->Value); /* Led1线程延时1秒 */ state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* Led1线程以阻塞方式发送Led2熄灭邮件 */ pMail2->Index = LED2; pMail2->Value = LED_OFF; state = TclSendMail(&Led2MailBox, (TMail*)(&pMail2), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* 用户定时器2的回调函数,间隔1秒,点亮或熄灭Led2 */ static void BlinkLed2(TArgument data) { static TIndex index = 0; if (index % 2) { EvbLedControl(LED2, LED_OFF); } else { EvbLedControl(LED2, LED_ON); } index++; }
/* Led线程的主函数 */ static void ThreadLedEntry(TArgument data) { TState state; TError error; TLedMail* pMail; while (eTrue) { /* Led线程以阻塞方式接收邮件 */ state = TclReceiveMail(&LedMailbox, (TMail*)(&pMail), TCLO_IPC_WAIT, 0, &error); if (state == eSuccess) { /* Led线程控制Led的点亮和熄灭 */ EvbLedControl(pMail->Index, pMail->Value); /* Led线程延时1秒 */ state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* Led线程释放信号量 */ state = TclReleaseSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } } }
/* Led熄灭线程的主函数 */ static void ThreadLedOffEntry(TArgument data) { TError error; TState state; while (eTrue) { /* Led熄灭线程以阻塞方式锁定互斥量,如果成功则熄灭Led */ state = TclLockMutex(&LedMutex, TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); EvbLedControl(LED1, LED_OFF); /* Led熄灭线程延时1秒 */ state = TclDelayThread(&ThreadLedOff, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* Led熄灭线程释放互斥量 */ state = TclFreeMutex(&LedMutex, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* Led1\Led2\led3线程的主函数 */ static void ThreadLedEntry(TArgument data) { TError error; TState state; while (eTrue) { state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); EvbLedControl(data, LED_ON); state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); EvbLedControl(data, LED_OFF); } }
/* Led2线程的主函数 */ static void ThreadLed2Entry(TArgument data) { TState state; TError error; TLedMail* pMail1; TLedMail* pMail2; pMail1 = &Led1Mail; while (eTrue) { /* Led2线程以阻塞方式发送Led1点亮邮件 */ pMail1->Index = LED1; pMail1->Value = LED_ON; state = TclSendMail(&Led1MailBox, (TMail*)(&pMail1), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led2线程以阻塞方式接收Led2控制邮件 */ state = TclReceiveMail(&Led2MailBox, (TMail*)(&pMail2), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led2线程控制Led2的点亮或熄灭 */ EvbLedControl(pMail2->Index, pMail2->Value); /* Led2线程以阻塞方式发送Led1熄灭邮件 */ pMail1->Index = LED1; pMail1->Value = LED_OFF; state = TclSendMail(&Led1MailBox, (TMail*)(&pMail1), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led2线程以阻塞方式接收Led2控制邮件 */ state = TclReceiveMail(&Led2MailBox, (TMail*)(&pMail2), TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* Led1线程控制Led1的点亮或熄灭 */ EvbLedControl(pMail2->Index, pMail2->Value); } }
/* Led线程的线程主函数 */ static void ThreadLed2Entry(TArgument data) { TError error; TState state; while (eTrue) { state = TclDelayThread(TCLM_SEC2TICKS(200), &error); if(state == eSuccess) { EvbLedControl(LED2, LED_OFF); } state = TclDelayThread(TCLM_SEC2TICKS(200), &error); if(state == eSuccess) { EvbLedControl(LED2, LED_ON); } } }
/* Led线程的线程主函数 */ static void ThreadLedEntry(TArgument data) { TError error; TState state; TThread* pThread; /* 参数2为线程的内核参数,由内核自动设置为当前线程的地址 */ pThread = (TThread*)data; while (eTrue) { EvbLedControl(LED1, LED_ON); state = TclDelayThread(pThread, TCLM_SEC2TICKS(1), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); EvbLedControl(LED1, LED_OFF); state = TclDelayThread(pThread, TCLM_SEC2TICKS(1), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); } }
/* Led线程的主函数 */ static void ThreadLedEntry(TArgument arg) { TState state; TError error; while (eTrue) { /* Led线程以阻塞方式获取信号量,如果成功则点亮Led */ state = TclObtainSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); if (state == eSuccess) { EvbLedControl(LED1, LED_ON); EvbLedControl(LED2, LED_ON); EvbLedControl(LED3, LED_ON); } /* Led线程以阻塞方式获取信号量,如果成功则熄灭Led */ state = TclObtainSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); if (state == eSuccess) { EvbLedControl(LED1, LED_OFF); EvbLedControl(LED2, LED_OFF); EvbLedControl(LED3, LED_OFF); } } }
/* Led线程的主函数 */ static void ThreadLed3Entry(TArgument arg) { TState state; TError error; while (eTrue) { /* Led线程以阻塞方式获取信号量,如果阻塞被强制解除则点亮Led */ state = TclObtainSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_FLUSH)) { EvbLedControl(LED3, LED_ON); } /* Led线程以阻塞方式获取信号量,如果阻塞被强制解除则熄灭Led */ state = TclObtainSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_FLUSH)) { EvbLedControl(LED3, LED_OFF); } } }
/* Led线程3的主函数 */ static void ThreadLed3Entry(TArgument data) { TState state; TError error; while (eTrue) { /* Led线程以阻塞方式获取互斥量,当发现互斥量reset后点亮Led3 */ state = TclLockMutex(&LedMutex, TCLO_IPC_WAIT, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_RESET)) { EvbLedControl(LED3, LED_ON); } /* Led线程以阻塞方式获取互斥量,当发现互斥量reset后熄灭Led3 */ state = TclLockMutex(&LedMutex, TCLO_IPC_WAIT, 0, &error); if ((state != eSuccess) && (error & TCLE_IPC_RESET)) { EvbLedControl(LED3, LED_OFF); } } }
/* Led3线程的主函数 */ static void ThreadLed3Entry(TArgument data) { TState state; TError error; TLedMsg* pMsg; while (eTrue) { /* Led3线程以阻塞方式接收消息,按照消息内容来点亮或者熄灭Led3 */ state = TclReceiveMessage(&LedMQ, (void**)(&pMsg), TCLO_IPC_WAIT, 0, &error); if (state == eSuccess) { EvbLedControl(LED3, pMsg->Value); } } }
/* Led3线程的主函数 */ static void ThreadLed3Entry(TArgument arg) { TState state; TError error; TLedMail* pMail; while (eTrue) { /* Led3线程以阻塞方式接收邮件,并根据邮件内容控制Led3的点亮或者熄灭 */ state = TclReceiveMail(&LedMailbox, (TMail*)(&pMail), TCLO_IPC_WAIT, 0, &error); if (state == eSuccess) { EvbLedControl(LED3, pMail->Value); } } }
/* 线程Led的入口函数 */ static void ThreadLedEntry(TArgument data) { while (eTrue) { delay(0x8FFFFF); EvbLedControl(LED1, LED_ON); delay(0x8FFFFF); EvbLedControl(LED1, LED_OFF); delay(0x8FFFFF); EvbLedControl(LED2, LED_ON); delay(0x8FFFFF); EvbLedControl(LED2, LED_OFF); delay(0x8FFFFF); EvbLedControl(LED3, LED_ON); delay(0x8FFFFF); EvbLedControl(LED3, LED_OFF); } }