uc/os 1
uc/os-ii Source Code ANSI C, uc/os-ii 8/16/32 bits microprocessor Preemptive real-time Task 64 Stack Size ROMable (C compiler, assembler and linker/locator) uc/os-ii Mailboxes, Queues, Semaphores, fixed-sized memory partitions, timerelated functions Interrupt 255 levels 2
uc/os uc/os os_core. c os_mbox. c os_mem. c os_q. c os_sem. c os_task. c i os_cpu. h os_cpu_c. c C uc/os os_cfg. h includes. h os_cpu_a. asm 3
uc/os Task task C main() Preemptive Task Ready Task Control Block(OS_TCB) OS_TCB RAM 4
Task TASK #1 Stack TASK #2 Stack TASK #n Stack TCB Status TCB Status TCB Status SP SP SP Priority... Priority... Priority... 5
uc/os OSTaskCreate() OSTaskCreateExt() OSTaskDel() OSTaskDelReq() OSTaskChangePrio() OSTaskSuspend() OSTaskResume() OSTaskStkChk() OSTaskQuery() 6
uc/os OSSemCreate() SSemPend() OSSemPost() OSSemAccept() OSSemQuery() OSMboxCreate() OSMboxPend() OSMboxPost() OSMboxAccept() OSMboxQuery() OSQCreate() OSQPend() OSQPost() OSQAccept() OSQFlush() OSQQuery() 7
OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() OSMemCreate() OSMemGet() OSMemPut() OSMemQuery() 8
uc/os-ii uc/os-ii register OS_CPU.H, OS_CPU_C.C, OS_CPU_A.S 9
OS_CPU.H DATA TYPE Compiler Compiler byte DATA TYPE Stack Entry TASK Stack CPU Resgister From HIGH to LOW Low to HIGH 10
OS_CPU.H /* ********************************************************************************************************* * DATA TYPES * (Compiler Specific) ********************************************************************************************************* */ typedef unsigned char BOOLEAN; typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ typedef signed char INT8S; /* Signed 8 bit quantity */ typedef unsigned short INT16U; /* Unsigned 16 bit quantity */ typedef signed short INT16S; /* Signed 16 bit quantity */ typedef unsigned long INT32U; /* Unsigned 32 bit quantity */ typedef signed long INT32S; /* Signed 32 bit quantity */ typedef float FP32; /* Single precision floating point */ typedef double FP64; /* Double precision floating point */ typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */ #define BYTE INT8S /* Define data types for backward compatibility... */ #define UBYTE INT8U /*... to uc/os V1.xx. Not actually needed for... */ #define WORD INT16S /*... uc/os-ii. */ #define UWORD INT16U #define LONG INT32S #define ULONG INT32U 11
OS_CPU.H ********************************************************************************************************* * ARM, various architectures * ********************************************************************************************************* */ #define OS_ENTER_CRITICAL() ARMDisableInt() //use this pair to globally disable interrupts #define OS_EXIT_CRITICAL() ARMEnableInt() //cation - ArmenableInt re-enables interrupts ready or not /* * Definitions specific to ARM/uHAL */ #define SVC32MODE 0x13 /* stack stuff */ #define OS_STK_GROWTH 1 //define the stack to grow from high to low /* idle task stack size (words) */ #ifdef SEMIHOSTED #define OS_IDLE_STK_SIZE (64+SEMIHOSTED_STACK_NEEDS) #else #define OS_IDLE_STK_SIZE 64 #endif 12
OS_CPU.H /* * Functions specific to uhal */ /* defined in os_cpu_c.c */ extern void IrqStart(void); extern void* IrqFinish(void); extern void ARMTargetInit(void); extern void ARMTargetStart(void); /* defined in os_cpu_a.s */ extern void OS_TASK_SW(void); // task switch routine extern void ARMDisableInt(void); // disable global interrupts extern void ARMEnableInt(void); // enable global interrupts 13
OS_CPU_C.C OS_CPU_C.C 6 OSTaskStkInit( ) OSTaskCreateHook( ) OSTaskDelHook( ) OSTaskSwHook( ) OSTaskStatHook( ) OSTimeTickHook( ) OSTaskStkInit OSTaskStkInit 14
OS_CPU_C.C-OSTaskStkInit void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt) { unsigned int *stk ; opt = opt; /* 'opt' is not used, prevent warning */ stk = (unsigned int *)ptos; /* Load stack pointer */ /* build a context for the new task */ *--stk = (unsigned int) task; /* pc */ *--stk = (unsigned int) task; /* lr */ *--stk = 0; /* r12 */ *--stk = 0; /* r11 */ *--stk = 0; /* r10 */ *--stk = 0; /* r9 */ *--stk = 0; /* r8 */ *--stk = 0; /* r7 */ *--stk = 0; /* r6 */ *--stk = 0; /* r5 */ *--stk = 0; /* r4 */ *--stk = 0; /* r3 */ *--stk = 0; /* r2 */ *--stk = 0; /* r1 */ *--stk = (unsigned int) pdata; /* r0 */ *--stk = (SVC32MODE 0x0); /* cpsr IRQ, FIQ disable*/ *--stk = (SVC32MODE 0x0); /* spsr IRQ, FIQ disable */ return ((void *)stk); } 15
OS_CPU_A.S OSStartHighRdy OSStartHighRdy OS_TASK_SW OSSched OSSched _CON_SWAP TickHandler TickHandler 16
TickHandler TickHandler: STMDB sp!,{r0-r11,lr} #interrupt disable(not nessary) mrs r0, CPSR orr r0, r0, #0x80 @ and set IRQ disable flag msr CPSR_cxsf, r0 #End of interrupt #(Clear pending bit of INTPEND that don't accessed it.) # ri_ispc= BIT_TIMER0; LDR r0, =I_ISPC LDR r1, =BIT_TIMER0 STR r1, [r0] BL IrqStart BL OSTimeTick BL IrqFinish @a1= return value 0:not context switch, otherwise:context switch CMP a1, #0 LDRNE pc, =_CON_SWAP 17
OS_CPU_A - _CON_SWAP _CON_SWAP: #now context switching LDMIA sp!,{r0-r11,lr} SUB lr, lr, #4 STR lr, SAVED_LR @STR lr, [pc, #SAVED_LR-.-8] #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #Change Supervisor mode #!!!r12 register don't preserved. (r12 that PC of task) MRS lr, SPSR AND lr, lr, #0xFFFFFFE0 ORR lr, lr, #0x13 MSR CPSR_cxsf, lr #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #Now Supervisor mode #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STR r12, [sp, #-8] @ saved r12 LDR r12, SAVED_LR @LDR r12, [pc, #SAVED_LR-.-8] STMFD sp!, {r12} @ r12 that PC of task SUB sp, sp, #4 @ inclease stack point LDMIA sp!, {r12} @ restore r12 STMFD sp!, {lr} @ save lr STMFD sp!, {r0-r12} @ save register file and ret address MRS r4, CPSR STMFD sp!, {r4} @ save current PSR MRS r4, SPSR @ YYY+ STMFD sp!, {r4} @ YYY+ save SPSR # OSPrioCur = OSPrioHighRdy LDR r4, addr_ospriocur LDR r5, addr_ospriohighrdy LDRB r6, [r5] STRB r6, [r4] # Get current task TCB address LDR r4, addr_ostcbcur LDR r5, [r4] STR sp, [r5] @ store sp in preempted tasks's TCB # Get highest priority task TCB address LDR r6, addr_ostcbhighrdy LDR r6, [r6] LDR sp, [r6] @ get new task's stack pointer # OSTCBCur = OSTCBHighRdy STR r6, [r4] @ set new current task TCB address LDMFD sp!, {r4} @ YYY+ # AND r4, r4, #0xFFFFFF20 # ORR r4, r4, #0x13 MSR SPSR_cxsf, r4 @ YYY+ LDMFD sp!, {r4} @ YYY+ # AND r4, r4, #0xFFFFFF20 # ORR r4, r4, #0x13 MSR CPSR_cxsf, r4 @ YYY+ LDMFD sp!, {r0-r12, lr, pc} @ YYY+ 18
OS_CPU_A - OS_TASK_SW.GLOBAL OS_TASK_SW OS_TASK_SW: STMFD sp!, {lr} @ save pc STMFD sp!, {lr} @ save lr STMFD sp!, {r0-r12} @ save register file and ret address MRS r4, CPSR STMFD sp!, {r4} @ save current PSR MRS r4, SPSR @ YYY+ STMFD sp!, {r4} @ YYY+ save SPSR # OSPrioCur = OSPrioHighRdy LDR r4, addr_ospriocur LDR r5, addr_ospriohighrdy LDRB r6, [r5] STRB r6, [r4] @ Get current task TCB address LDR r4, addr_ostcbcur LDR r5, [r4] STR sp, [r5] @ store sp in preempted tasks's TCB # Get highest priority task TCB address LDR r6, addr_ostcbhighrdy LDR r6, [r6] LDR sp, [r6] @ get new task's stack pointer # OSTCBCur = OSTCBHighRdy STR r6, [r4] @ set new current task TCB address LDMFD sp!, {r4} @ YYY+ MSR SPSR_cxsf, r4 @ YYY+ LDMFD sp!, {r4} @ YYY+ MSR CPSR_cxsf, r4 @ YYY+ LDMFD sp!, {r0-r12, lr, pc} @ YYY+ 19
OS_CPU_A - OSStartHighRdy.GLOBAL OSStartHighRdy OSStartHighRdy: LDR r4, addr_ostcbcur @ Get current task TCB address LDR r5, addr_ostcbhighrdy @ Get highest priority task TCB address LDR r5, [r5] @ get stack pointer LDR sp, [r5] @ switch to the new stack STR r5, [r4] @ set new current task TCB address LDMFD sp!, {r4} @ YYY MSR SPSR_cxsf, r4 LDMFD sp!, {r4} @ get new state from top of the stack MSR CPSR_cxsf, r4 @ CPSR should be SVC32Mode LDMFD sp!, {r0-r12, lr, pc } @ start the new task 20
uc/os http://www.ucos-ii.com/ Official web site of ucos-ii http://penguin.cs.ccu.edu.tw/~uos2ta/ucos2/all.zip Source code of ucos-ii and Port for Hitech Pacific C compiler http://penguin.cs.ccu.edu.tw/~uos2ta/ucos2/software.zip Source code of ucos-ii http://penguin.cs.ccu.edu.tw/~uos2ta/ucos2/hitech-pacific-c- 80x86-V111.zip Port for Hitech Pacific C compiler http://www.exposecorp.com/embedded/portx86p-2.htm Porting ucos-ii to the x86 (PM) 21