/* 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), ""); } } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; TLedMsg* pMsg = &LedMsg; while (eTrue) { /* CTRL线程延时1秒,然后广播消息,把所有Led都点亮 */ state = TclDelayThread(TCLM_MLS2TICKS(1000), &error); pMsg->Index = LEDX; pMsg->Value = LED_ON; TclBroadcastMessage(&LedMQ, (TMessage*)&pMsg, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* CTRL线程延时1秒,然后广播消息,把所有Led都熄灭 */ state =TclDelayThread(TCLM_MLS2TICKS(1000), &error); pMsg->Index = LEDX; pMsg->Value = LED_OFF; state = TclBroadcastMessage(&LedMQ, (TMessage*)&pMsg, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; while (eTrue) { /* CTRL线程延时1秒后强制解除全部线程的阻塞 */ state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); state = TclUnblockThread(&ThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); state = TclUnblockThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); state = TclUnblockThread(&ThreadLed3, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* 用户应用程序入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 设置和KEY相关的外部中断向量 */ state = TclSetIrqVector(KEY_IRQ_ID, &EvbKeyISR, (TThread*)0, (TArgument)0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IRQ_NONE), ""); /* 初始化信号量 */ state = TclCreateSemaphore(&LedSemaphore, 0, 1, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led线程 */ state = TclCreateThread(&ThreadLed, &ThreadLedEntry, (TArgument)0, ThreadLedStack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程 */ state = TclActivateThread(&ThreadLed, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument arg) { TState state; TError error; TLedMail* pMail; pMail = &LedMail; while (eTrue) { /* 控制线程延时1秒后广播所有Led打开的邮件 */ state = TclDelayThread(TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); pMail->Index = LEDX; pMail->Value = LED_ON; state = TclBroadcastMail(&LedMailbox, (TMail*)(&pMail), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 控制线程延时1秒后广播所有Led熄灭的邮件 */ state = TclDelayThread(TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); pMail->Index = LEDX; pMail->Value = LED_OFF; state = TclBroadcastMail(&LedMailbox, (TMail*)(&pMail), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; TLedMail* pMail = &LedMail; while (eTrue) { /* 控制线程以非阻塞方式发送控制Led点亮的邮件 */ pMail->Value = LED_ON; pMail->Index = LED1; state = TclSendMail(&LedMailbox, (TMail*)(&pMail), 0, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 控制线程以非阻塞方式获取信号量 */ state = TclObtainSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 控制线程以非阻塞方式发送控制Led熄灭的邮件 */ pMail->Value = LED_OFF; pMail->Index = LED1; state = TclSendMail(&LedMailbox, (TMail*)(&pMail), 0, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 控制线程以阻塞方式获取信号量 */ state = TclObtainSemaphore(&LedSemaphore, TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument arg) { TState state; TError error; while (eTrue) { /* CTRL线程延时1秒后强制解除全部线程的阻塞 */ state = TclDelayThread(TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); state = TclFlushSemaphore(&LedSemaphore, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; while (eTrue) { /* CTRL线程延时1秒,然后将全部Led线程解除阻塞 */ state = TclDelayThread(TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); state = TclFlushMsgQueue(&LedMQ, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; while (eTrue) { /* CTRL线程延时1秒后将消息队列FLUSH */ state = TclDelayThread((TThread*)0, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); state = TclResetMsgQueue(&LedMQ, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; while (eTrue) { /* CTRL线程延时1秒后FLUSH事件标记 */ state = TclDelayThread(&ThreadCTRL, TCLM_MLS2TICKS(1000), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); state = TclResetFlags(&LedFlags, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* Led线程主函数 */ static void ThreadLedEntry(TArgument data) { TState state; TError error; /* 初始化用户定时器1 */ state = TclCreateTimer(&Led1Timer, TCLP_TIMER_PERIODIC, TCLM_MLS2TICKS(ticks1), &BlinkLed1, (TArgument)0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); /* 初始化用户定时器2 */ state = TclCreateTimer(&Led2Timer, TCLP_TIMER_PERIODIC, TCLM_MLS2TICKS(ticks2), &BlinkLed2, (TArgument)0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); /* 启动用户定时器1 */ state = TclStartTimer(&Led1Timer, TCLM_MLS2TICKS(500), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); /* 启动用户定时器2 */ state = TclStartTimer(&Led2Timer, TCLM_MLS2TICKS(500), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); /* 设置和KEY相关的外部中断向量 */ state = TclSetIrqVector(KEY_IRQ_ID, &EvbKeyISR, (TThread*)0, (TArgument)0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IRQ_NONE), ""); while (eTrue) { } }
/* 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); } }
/* CTRL线程的主函数 */ static void ThreadCtrlEntry(TArgument data) { TState state; TError error; while (eTrue) { /* CTRL线程首先获取互斥量 */ state = TclLockMutex(&LedMutex, TCLO_IPC_WAIT, 0, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* CTRL线程延时1秒后RESET互斥量 */ state = TclDelayThread(&ThreadCTRL, TCLM_MLS2TICKS(1000), &error); state = TclResetMutex(&LedMutex, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); } }
/* 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), ""); } }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TError error; TState state; /* 初始化Led设备控制线程 */ state = TclCreateThread(&ThreadLed, "thread led", &ThreadLedEntry, (TArgument)0, ThreadLedStack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led点亮线程 */ state =TclActivateThread(&ThreadLed, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); TclTrace("example start!\r\n"); }
/* 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), ""); } }
/* 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), ""); } }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化互斥量 */ state = TclCreateMutex(&LedMutex, LED_MUTEX_PRIORITY, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led点亮线程 */ state = TclCreateThread(&ThreadLedOn, &ThreadLedOnEntry, (TArgument)0, ThreadLedOnStack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led熄灭线程 */ state = TclCreateThread(&ThreadLedOff, &ThreadLedOffEntry, (TArgument)0, ThreadLedOffStack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY + 1, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led点亮线程 */ state = TclActivateThread(&ThreadLedOn, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led熄灭线程 */ state = TclActivateThread(&ThreadLedOff, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用程序入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化信号量 */ state = TclCreateSemaphore(&UartSemaphore, "uart semaphore", 1, 1, TCLP_IPC_DEFAULT, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化UART设备控制线程 */ state = TclCreateThread(&ThreadUartLowCase, "thread lowcase", &ThreadUartLowCaseEntry, (TArgument)0, ThreadUartLowCaseStack, THREAD_UART_STACK_BYTES, THREAD_UART_PRIORITY, THREAD_UART_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化UART设备控制线程 */ state = TclCreateThread(&ThreadUartUpCase, "thread upcase", &ThreadUartUpCaseEntry, (TArgument)0, ThreadUartUpCaseStack, THREAD_UART_STACK_BYTES, THREAD_UART_PRIORITY, THREAD_UART_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活UART小写线程 */ state = TclActivateThread(&ThreadUartLowCase, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活UART大写线程 */ state = TclActivateThread(&ThreadUartUpCase, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 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); } }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化互斥量 */ state = TclCreateMutex(&LedMutex, LED_MUTEX_PRIORITY, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led1设备控制线程 */ state = TclCreateThread(&ThreadLed1, &ThreadLed1Entry, (TArgument)0, ThreadLed1Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led2设备控制线程 */ state = TclCreateThread(&ThreadLed2, &ThreadLed2Entry, (TArgument)0, ThreadLed2Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led3设备控制线程 */ state = TclCreateThread(&ThreadLed3, &ThreadLed3Entry, (TArgument)0, ThreadLed3Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化CTRL线程 */ state = TclCreateThread(&ThreadCTRL, &ThreadCtrlEntry, (TArgument)0, ThreadCTRLStack, THREAD_CTRL_STACK_BYTES, THREAD_CTRL_PRIORITY, THREAD_CTRL_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程1 */ state = TclActivateThread(&ThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程2 */ state = TclActivateThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程3 */ state = TclActivateThread(&ThreadLed3, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活CTRL线程 */ state = TclActivateThread(&ThreadCTRL, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用程序入口函数 */ static void AppSetupEntry(void) { TError error; TState state; state = TclCreateMemoryPool(&DataMemoryPool, (void*)DataMemory, 6, DATA_BLOCK_BYTES, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); state = TclMallocPoolMemory(&DataMemoryPool, (void**)(&pThreadLed1), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); state = TclMallocPoolMemory(&DataMemoryPool, (void**)(&pThreadLed2), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); state = TclMallocPoolMemory(&DataMemoryPool, (void**)(&pThreadLed3), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); state = TclMallocPoolMemory(&DataMemoryPool, (void**)(&pThreadStack1), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); state = TclMallocPoolMemory(&DataMemoryPool, (void**)(&pThreadStack2), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); state = TclMallocPoolMemory(&DataMemoryPool, (void**)(&pThreadStack3), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_MEMORY_NONE), ""); /* 初始化Led线程1 */ state = TclCreateThread(pThreadLed1, &ThreadLedEntry, (TArgument)LED1, pThreadStack1, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led线程2*/ state = TclCreateThread(pThreadLed2, &ThreadLedEntry,(TArgument)LED2, pThreadStack2, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led线程3 */ state = TclCreateThread(pThreadLed3, &ThreadLedEntry, (TArgument)LED3, pThreadStack3, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); /* 激活Led线程1 */ state = TclActivateThread(pThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程2 */ state = TclActivateThread(pThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程3 */ state = TclActivateThread(pThreadLed3, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用程序入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化信号量和邮箱 */ state = TclCreateMailBox(&LedMailbox, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); state = TclCreateSemaphore(&LedSemaphore, 0, 1, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led设备控制线程 */ state = TclCreateThread(&ThreadLed, &ThreadLedEntry, (TArgument)0, ThreadLedStack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化CTRL线程 */ state = TclCreateThread(&ThreadCTRL, &ThreadCtrlEntry, (TArgument)0, ThreadCTRLStack, THREAD_CTRL_STACK_BYTES, THREAD_CTRL_PRIORITY, THREAD_CTRL_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程 */ state = TclActivateThread(&ThreadLed, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活CTRL线程 */ state = TclActivateThread(&ThreadCTRL, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化事件标记 */ state = TclCreateFlags(&LedFlags, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化LED1设备线程 */ state = TclCreateThread(&ThreadLED1, &ThreadLED1Entry, (TArgument)0, ThreadLedStack1, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led2设备线程 */ state = TclCreateThread(&ThreadLed2, &ThreadLed2Entry, (TArgument)0, ThreadLedStack2, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led3设备线程 */ state = TclCreateThread(&ThreadLed3, &ThreadLed3Entry, (TArgument)0, ThreadLedStack3, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化CTRL线程 */ state = TclCreateThread(&ThreadCTRL, &ThreadCtrlEntry, (TArgument)0, ThreadCTRLStack, THREAD_CTRL_STACK_BYTES, THREAD_CTRL_PRIORITY, THREAD_CTRL_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程1 */ state = TclActivateThread(&ThreadLED1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程2 */ state = TclActivateThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程3 */ state = TclActivateThread(&ThreadLed3, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活CTRL线程 */ state = TclActivateThread(&ThreadCTRL, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 评估板按键中断处理函数 */ static TBitMask EvbKeyISR(TArgument data) { TState state; TError error; TBase32 keyid; keyid = EvbKeyScan(); if (keyid == 1) { /* 关闭用户定时器 */ state = TclStopTimer(&Led1Timer, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); ticks1 *= 2; ticks1 = (ticks1 > 2000)? 2000:ticks1; /* 配置用户定时器 */ state = TclConfigTimer(&Led1Timer, TCLM_MLS2TICKS(ticks1), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); /* 启动用户定时器 */ state = TclStartTimer(&Led1Timer, 0U, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); } else { /* 关闭用户定时器 */ state = TclStopTimer(&Led1Timer, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); ticks1 /= 2; ticks1 = (ticks1 < 500)? 500:ticks1; /* 配置用户定时器 */ state = TclConfigTimer(&Led1Timer, TCLM_MLS2TICKS(ticks1), &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); /* 启动用户定时器 */ state = TclStartTimer(&Led1Timer, 0U, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_TIMER_NONE), ""); } return TCLR_IRQ_DONE; }
/* 用户应用程序入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化消息队列 */ state = TclCreateMsgQueue(&LedMQ, (void**)(&LedMsgPool), MQ_POOL_LEN, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led设备控制线程 */ state = TclCreateThread(&ThreadLed1, &ThreadLed1Entry, (TArgument)0, ThreadLed1Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led设备控制线程 */ state = TclCreateThread(&ThreadLed2, &ThreadLed2Entry, (TArgument)0, ThreadLed2Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led设备控制线程 */ state = TclCreateThread(&ThreadLed3, &ThreadLed3Entry, (TArgument)0, ThreadLed3Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化CTRL线程 */ state = TclCreateThread(&ThreadCTRL, &ThreadCtrlEntry, (TArgument)0, ThreadCTRLStack, THREAD_CTRL_STACK_BYTES, THREAD_CTRL_PRIORITY, THREAD_CTRL_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程1 */ state = TclActivateThread(&ThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程2 */ state = TclActivateThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程3 */ state = TclActivateThread(&ThreadLed3, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活CTRL线程 */ state = TclActivateThread(&ThreadCTRL, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TError error; TState state; /* 初始化Led1控制线程 */ state = TclCreateThread(&ThreadLed1, "thread led1", &ThreadLed1Entry, (TArgument)(&ThreadLed1), ThreadLed1Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led2控制线程 */ state = TclCreateThread(&ThreadLed2, "thread led2", &ThreadLed2Entry, (TArgument)(&ThreadLed2), ThreadLed2Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led2控制线程 */ state = TclCreateThread(&ThreadCtrl, "thread ctrl", &ThreadCtrlEntry, (TArgument)(&ThreadLed2), ThreadCtrlStack, THREAD_CTRL_STACK_BYTES, THREAD_CTRL_PRIORITY, THREAD_CTRL_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led1控制线程 */ state = TclActivateThread(&ThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led2控制线程 */ state = TclActivateThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led设备控制线程 */ state = TclActivateThread(&ThreadCtrl, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化信号量1 */ state = TclCreateSemaphore(&LedSemaphore1, 0, 1, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化信号量2 */ state = TclCreateSemaphore(&LedSemaphore2, 0, 1, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led线程1 */ state = TclCreateThread(&ThreadLed1, &ThreadLed1Entry, (TArgument)0, ThreadLed1Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led线程2 */ state = TclCreateThread(&ThreadLed2, &ThreadLed2Entry, (TArgument)0, ThreadLed2Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY + 1, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程1 */ state = TclActivateThread(&ThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led线程2 */ state = TclActivateThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 用户应用入口函数 */ static void AppSetupEntry(void) { TState state; TError error; /* 初始化Led邮箱 */ state = TclCreateMailBox(&Led2MailBox, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); state = TclCreateMailBox(&Led1MailBox, TCLP_IPC_DUMMY, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led1设备控制线程 */ state = TclCreateThread(&ThreadLed1, &ThreadLed1Entry, (TArgument)0, ThreadLed1Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 初始化Led2设备控制线程 */ state = TclCreateThread(&ThreadLed2, &ThreadLed2Entry, (TArgument)0, ThreadLed2Stack, THREAD_LED_STACK_BYTES, THREAD_LED_PRIORITY + 1, THREAD_LED_SLICE, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); /* 激活Led设备控制线程 */ state = TclActivateThread(&ThreadLed1, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); state = TclActivateThread(&ThreadLed2, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_THREAD_NONE), ""); }
/* 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), ""); } }