Download presentation
Presentation is loading. Please wait.
Published byMadlyn Cole Modified over 9 years ago
1
ucosii porting on pxa270 粘家華 R96922041 林育佳 R96922062
2
Demo on PXA270 Drivers driver.c driver.h (Platform Specific Code) CPUTimer7-segment Software Hardware Application demo.c (DEMO_HUHU()) boot head.s (Platform Specific Code)
3
head.s .vector ResetHandler reset_irq Initial GPIO, Mmory_Controller enable APD Set up a stack [for calling C code] Create MMU tables Enable MMU InitStacks (IRQMode, FIQMode, SVC_MODE) bl main
4
tools Environment Cygwin + WinXP Compiler GNU arm-elf-tools-cygwin v2.95.3 Platform PXA 270
5
Ucosii on PXA270 OS-II OS_CORE.C OS_MBOX.C OS_MEM.C OS_Q.C OS_SEM.C OS_TASK.C OS_TIME.C … etc (Processor Independent Code) OS-II Port OS_CPU.h OS_CPU_A.s OS_CPU_C.c (Processor Specific Code) Drivers driver.c driver.h (Platform Specific Code) CPUTimerSerial I/O Software Hardware Application demo.c ( task1() task2() ) boot head.s (Platform Specific Code)
6
Goal step Step 1 : task1 can run correctly and display something on serial I/O. OSTaskStkInit in OS_CPU_C.c OSStartHighRdy in OS_CPU_A.s Step 2 : task1 call delay function, task2 run OS_TASK_SW in OS_CPU_A.s
7
OS_CPU_C.c 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 = 0; /* 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; /* spsr YYY+ */ *--stk = SVC32MODE; /* psr */ return ((void *)stk); }
8
OS_CPU_A.s OSStartHighRdy
9
OS_CPU_A.s OS_TASK_SW
10
Goal step Step 3 : interrupt handler can run correctly. Initial_TIMER0 in driver.c IrqHnd in head.s Step 4 : task1 can resume IrqHnd in head.s OSIntCtxSw in OS_CPU_A.s _IntCtxSw in OS_CPU_A.s
11
driver.c void Initial_TIMER0(void) { tick_on = UM; tick_ms = 0; tick_sec = 0; tick_min = 0; tick_hour = 0; OIER = 0;/* disable any timer interrupts */ OSCR = LATCH*2;/* push OSCR out of the way */ OSMR0 = LATCH;/* set initial match */ OSSR = 0xf;/* clear status on all timers */ OIER = OIER_E0;/* enable match on timer 0 to cause interrupts */ OSCR = 0; /* initialize free-running timer */ }
12
head.s IrqHnd bl Chandler
13
OS_CPU_A.s OSIntCtxSw IntCtxSw
14
head.s IrqHnd IrqHnd: STMFDsp!,{r0-r3,r12,lr} bl OSIntEnter bl OSTimeTick bl OSIntExit LDRr0,=OSIntCtxSwFlag LDRr1,[r0] CMPr1,#1 BEQ_IntCtxSw LDMFDsp!, {r0-r3,r12,lr} SUBSpc, lr, #4
15
DEMO
16
Thanks 戴偉堯 涂堂訓 EOS 助教
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.