uc/os 1

Similar documents
CC213

<4D F736F F F696E74202D204D34D1D0CCD6BBE F55434F534949D4DA4C4D3446D6D0B5C4D2C6D6B2D3EBD3A6D3C3>

UCOS时间片轮转调度算法详解

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

51 C 51 isp 10 C PCB C C C C KEIL

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

新版 明解C言語入門編

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

untitled

2/80 2

学习MSP430单片机推荐参考书

新・解きながら学ぶC言語

P4V88+_BIOS_CN.p65

C/C++程序设计 - 字符串与格式化输入/输出

c_cpp

C/C++ - 文件IO

Microsoft Word - MSP430 Launchpad 指导书.docx

目录

目 录

mvc

PowerPoint 演示文稿

P4VM800_BIOS_CN.p65

3.1 num = 3 ch = 'C' 2

新版 明解C++入門編

新・明解C言語入門編『索引』

P4Dual-915GL_BIOS_CN.p65

EK-STM32F

775i65PE_BIOS_CN.p65

P4i45GL_GV-R50-CN.p65

C/C++ - 函数

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

C

C语言的应用.PDF

FY.DOC

C/C++ - 字符输入输出和字符确认


C/C++语言 - C/C++数据

PTS7_Manual.PDF

Microsoft Word - 01.DOC

bingdian001.com

Microsoft Word - 澎湖田調報告_璉謙組.doc

投影片 1

TwinCAT 1. TwinCAT TwinCAT PLC PLC IEC TwinCAT TwinCAT Masc

ARM JTAG实时仿真器安装使用指南

Gerolor Motors Series Dimensions A,B C T L L G1/2 M8 G1/ A 4 C H4 E

untitled

ebook50-15

6020

Microsoft Word - Index.doc

Bus Hound 5

JLX

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

华恒家庭网关方案

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Gerotor Motors Series Dimensions A,B C T L L G1/2 M G1/ A 4 C H4 E

ICD ICD ICD ICD ICD

Microsoft Word - uCOS51ÒÆÖ²ÐĵÃ.doc

<4D F736F F D20B5DA36D5C F532DA2F2B2D9D7F7CFB5CDB3BBF9B4A1BCB0C6E4D2C6D6B2BFAAB7A2B3F5B2BD2E646F6378>

nooog

(Guangzhou) AIT Co, Ltd V 110V [ ]! 2

untitled


C 1

C/C++ - 数组与指针

untitled

untitled

untitled

新・解きながら学ぶJava

uCOS-II的移植与编译

System Design and Setup of a Robot to Pass over Steps Abstract In the research, one special type of robots that can pass over steps is designed and se

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

coverage2.ppt

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

CHAPTER VC#

Microsoft Word - 11.doc

untitled

CC213

Microsoft PowerPoint - os_4.ppt

AN INTRODUCTION TO PHYSICAL COMPUTING USING ARDUINO, GRASSHOPPER, AND FIREFLY (CHINESE EDITION ) INTERACTIVE PROTOTYPING

一个开放源码的嵌入式仿真环境 ― SkyEye

C++ 程式設計

ARP ICMP

C35_RG_E.book

untitled

投影片 1

Microsoft Word - CIN-DLL.doc

PIC_SERVER (11) SMTP ( ) ( ) PIC_SERVER (10) SMTP PIC_SERVER (event driven) PIC_SERVER SMTP 1. E-

最新执法工作手册(二百六十七)

C C

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

Microsoft PowerPoint - ds-1.ppt [兼容模式]

C/C++ - 字符串与字符串函数

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

untitled

Transcription:

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