/* 用户应用入口函数 */ 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; /* 初始化信号量和邮箱 */ 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; /* 设置和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), ""); }
/* 用户应用入口函数 */ 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), ""); }
/* 用户应用入口函数 */ 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), ""); }
/* 用户应用入口函数 */ 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"); }
/* 用户应用程序入口函数 */ 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 = 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), ""); }
/* ARGSUSED */ int Tcl_ThreadObjCmd( ClientData dummy, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); int option; static const char *threadOptions[] = { "create", "exit", "id", "join", "names", "send", "wait", "errorproc", NULL }; enum options { THREAD_CREATE, THREAD_EXIT, THREAD_ID, THREAD_JOIN, THREAD_NAMES, THREAD_SEND, THREAD_WAIT, THREAD_ERRORPROC }; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "option ?args?"); return TCL_ERROR; } if (Tcl_GetIndexFromObj(interp, objv[1], threadOptions, "option", 0, &option) != TCL_OK) { return TCL_ERROR; } /* * Make sure the initial thread is on the list before doing anything. */ if (tsdPtr->interp == NULL) { Tcl_MutexLock(&threadMutex); tsdPtr->interp = interp; ListUpdateInner(tsdPtr); Tcl_CreateThreadExitHandler(ThreadExitProc, NULL); Tcl_MutexUnlock(&threadMutex); } switch ((enum options)option) { case THREAD_CREATE: { char *script; int joinable, len; if (objc == 2) { /* * Neither joinable nor special script */ joinable = 0; script = "testthread wait"; /* Just enter event loop */ } else if (objc == 3) { /* * Possibly -joinable, then no special script, no joinable, then * its a script. */ script = Tcl_GetStringFromObj(objv[2], &len); if ((len > 1) && (script [0] == '-') && (script [1] == 'j') && (0 == strncmp (script, "-joinable", (size_t) len))) { joinable = 1; script = "testthread wait"; /* Just enter event loop */ } else { /* * Remember the script */ joinable = 0; } } else if (objc == 4) { /* * Definitely a script available, but is the flag -joinable? */ script = Tcl_GetStringFromObj(objv[2], &len); joinable = ((len > 1) && (script [0] == '-') && (script [1] == 'j') && (0 == strncmp(script, "-joinable", (size_t) len))); script = Tcl_GetString(objv[3]); } else { Tcl_WrongNumArgs(interp, 2, objv, "?-joinable? ?script?"); return TCL_ERROR; } return TclCreateThread(interp, script, joinable); } case THREAD_EXIT: if (objc > 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); return TCL_ERROR; } ListRemove(NULL); Tcl_ExitThread(0); return TCL_OK; case THREAD_ID: if (objc == 2) { Tcl_Obj *idObj = Tcl_NewLongObj((long) Tcl_GetCurrentThread()); Tcl_SetObjResult(interp, idObj); return TCL_OK; } else { Tcl_WrongNumArgs(interp, 2, objv, NULL); return TCL_ERROR; } case THREAD_JOIN: { long id; int result, status; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "id"); return TCL_ERROR; } if (Tcl_GetLongFromObj(interp, objv[2], &id) != TCL_OK) { return TCL_ERROR; } result = Tcl_JoinThread ((Tcl_ThreadId) id, &status); if (result == TCL_OK) { Tcl_SetIntObj (Tcl_GetObjResult (interp), status); } else { char buf [20]; sprintf(buf, "%ld", id); Tcl_AppendResult(interp, "cannot join thread ", buf, NULL); } return result; } case THREAD_NAMES: if (objc > 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); return TCL_ERROR; } return TclThreadList(interp); case THREAD_SEND: { long id; char *script; int wait, arg; if ((objc != 4) && (objc != 5)) { Tcl_WrongNumArgs(interp, 2, objv, "?-async? id script"); return TCL_ERROR; } if (objc == 5) { if (strcmp("-async", Tcl_GetString(objv[2])) != 0) { Tcl_WrongNumArgs(interp, 2, objv, "?-async? id script"); return TCL_ERROR; } wait = 0; arg = 3; } else { wait = 1; arg = 2; } if (Tcl_GetLongFromObj(interp, objv[arg], &id) != TCL_OK) { return TCL_ERROR; } arg++; script = Tcl_GetString(objv[arg]); return TclThreadSend(interp, (Tcl_ThreadId) id, script, wait); } case THREAD_ERRORPROC: { /* * Arrange for this proc to handle thread death errors. */ char *proc; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "proc"); return TCL_ERROR; } Tcl_MutexLock(&threadMutex); errorThreadId = Tcl_GetCurrentThread(); if (errorProcString) { ckfree(errorProcString); } proc = Tcl_GetString(objv[2]); errorProcString = ckalloc(strlen(proc)+1); strcpy(errorProcString, proc); Tcl_MutexUnlock(&threadMutex); return TCL_OK; } case THREAD_WAIT: while (1) { (void) Tcl_DoOneEvent(TCL_ALL_EVENTS); } } return TCL_OK; }
/* 用户应用程序入口函数 */ 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) { 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) { TState state; TError error; /* 初始化信号量 */ state = TclCreateSemaphore(&LedSemaphore, "semaphore", 0, 1, TCLP_IPC_DEFAULT, &error); TCLM_ASSERT((state == eSuccess), ""); TCLM_ASSERT((error == TCLE_IPC_NONE), ""); /* 初始化Led1线程 */ state = TclCreateThread(&ThreadLed1, "thread led1", &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, "thread led2", &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, "thread led3", &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, "thread led ctrl", &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), ""); }