A survey of uC/OS & lwIP
NETLAB
MicroC/OS II
NETLAB
Features
Source Code Open Source,程式碼簡潔易懂
Portable 程式碼大部分皆是利用 ANSI C所開發的 與 microprocessor行為有關的則利用組合語言來完成,使得 uC/OS-II能夠輕易的移植到其他 Processor
uC/OS-II可以在 8/16/32 bits 的 microprocessor上或是micro-controller上運作
NETLAB
Features
ROMable 只要有適當的工具 (C compiler, assembler and
linker/locator)就可將 uC/OS-II嵌入成為產品一部分 Scalable
可以很簡單的選用程式 /產品所需要的特性 也就是說可以依照自己的需求減少程式的大小,以便可以放入 ROM/RAM中
NETLAB
HIGH Priority Task
LOW Priority Task
ISR(1) (2)
(3)(4)
(5)
(6)
(7)
ISR makes the high priority task ready
Time
Features
Preemptive uC/OS-II 永遠會讓已經 Ready且優先權最高的工作行程先執行
NETLAB
TASKWAITING
TASKDORMANT
TASKREADY
TASKRUNNING
ISRRUNNING
Features
NETLAB
Features
Multi-tasking uC/OS-II最多可支援 64 個 task,其中會為系統保留8 個 task使用
每一個 task都有一個唯一的 priority,也就是說uC/OS-II無法實現 Round Robin排程
NETLAB
Status
SP
Priority...
Task Control Block
TASK #1Stack
SP
.
.
.
Status
SP
Priority...
Task Control Block
TASK #2Stack
Status
SP
Priority...
Task Control Block
TASK #nStack
……
MEMORY
CPU
Features
NETLAB
Features
Deterministic 在 uC/OS-II內的各項服務所需要的執行時間都是可明確預先得知的
Task Stacks uC/OS-II允許每一個 task擁有不一樣的 stack size 根據需要增減 task 的 stack size減少 RAM的使用
NETLAB
Features
Services Mailbox, Queues, Semaphores, Fixed-sized
memory partitions, Time related function, etc. Interrupt Management
Interrupts can suspend the execution of a task 256 levels
Robust and Reliable
NETLAB
uC/OS-II移植分析
只要有相對應的 C Compiler,即可將 uC/OS-II移植到特定的處理器上
大部分移植工作都在多任務的切換上 用來儲存以及恢復 register的值 利用組合語言完成
需修改的檔案 OS_CPU.H, OS_CPU_C.C, OS_CPU_A.S
NETLAB
OS_CPU.H
定義DATA TYPE 與所使用的 Compiler相關 不同的 Compiler會使用不一樣的 byte來表示同一
DATA TYPE X86平台 , Integer:
• GNU (gcc): 4 bytes• MicroSoft (VC++): 2 bytes
NETLAB
OS_CPU.H
Stack Entry 定義 TASK 的 Stack長度,必須要和 CPU 的
Register的長度一致堆疊增長方向
定義 Stack grows from HIGH to LOW or Low to HIGH Memory
NETLAB
OS_CPU.H
NETLAB
OS_CPU.H
中斷、 Content Switch
NETLAB
OS_CPU_C.C
Initialize a Task‘s STACK 在堆疊增長的方向上定每一個需要保存的 Register位址
AX
CX
DX
BX
SP
BP
SI
DI
ES
DS
HIGH
LOW
NETLAB
OS_CPU_C.C
NETLAB
OS_CPU_A.S
OSStartHighRdy( ) 在 OSStart()啟動之後,負責從最高優先權任務的
TCB Control Block中獲得該任務的 Stack Point (SP)
OSCtxSw( ) 將前一 task 的 register保存到堆疊中,獲得最高優先
權 task 的 SP,將此 task 的 register恢復,使之繼續執行
OSIntCtxSw( ) 中斷級的 Content Switch
NETLAB
Handbook
NETLAB
Hardware Abstraction Layer (HAL) Real-time kernel Interrupt handling Exception handling Choice of schedulers Thread support Rich set of synchronization primitives Timers, counters and alarms Choice of memory allocators Debug and instrumentation support
μITRON 3.0 compatible API POSIX compatible API ISO C and math libraries Serial, ethernet, wallclock and watchdog device drivers USB slave support TCP/IP networking stacks GDB debug support
NETLAB
light weight IP (lwIP)
NETLAB
lwIP簡介
lwIP一套可用於 embedded system 的 TCP/IP protocol
lwIP可以移植到各OS上,在沒有OS情形下也可以獨立運作
lwIP主要是為了保持 TCP Protocol的主要功能並減少對 RAM的使用
只需要幾十 K 的 RAM和約 40K 的 ROM就可以運作,使得 lwIP很適合在嵌入式系統中運作
NETLAB
lwIP簡介
嵌入式系統開發板
lwIP (TCP/IP Protocol)
uC-OS II
Upper Layer Protocol (ULP)
NETLAB
lwIP特性
IP including packet forwarding over multiple network interfaces
ICMP for network maintenance and debugging
UDP for datagram data TCP with congestion control, RTT estimation
and fast recovery/fast retransmit Specialized no-copy API for enhanced
performance Optional Berkeley socket API
NETLAB
lwIP特性
lwIP將所有與硬體、OS 、 Compiler相關的部分獨立出來放置在 /src/arch下
修改這一些相關檔案將 lwIP移植到 uC/OS-II上
NETLAB
Application/ Management modelApplication/ Management model
Protocol Stack
RTP, RTCPRTP, RTCP
UDPUDP
IPIP
MACMAC
PhysicalPhysical
NETLAB
TCP/IP與行程間的溝通
NETLAB
SOCKET APIbindlistenconnectacceptrecvsendwriteclose
SOCKET APIbindlistenconnectacceptrecvsendwriteclose
lwip_APIlwip_bindlwip_listenlwip_connectlwip_acceptlwip_recvlwip_sendlwip_writelwip_close
lwip_APIlwip_bindlwip_listenlwip_connectlwip_acceptlwip_recvlwip_sendlwip_writelwip_close
netconn_APInetconn_bindnetconn_listennetconn_connectnetconn_acceptnetconn_recvnetconn_sendnetconn_writenetconn_close
netconn_APInetconn_bindnetconn_listennetconn_connectnetconn_acceptnetconn_recvnetconn_sendnetconn_writenetconn_close
NETLAB
applicationapplication
socket APIsocket API
lwip_bind …lwip_bind …
netconn_bind …netconn_bind …
driverdriver
recv_buf_datarecv_buf_data
ethernetif_inputethernetif_input
low_level_inpitlow_level_inpit
ip_inputip_input
tcp_inputtcp_input
tcp_processtcp_process
tcpip_threadtcpip_thread
api_msg_input api_msg_input
do_bind …do_bind …
TASK 1 TASK 2 TASK 3
NETLAB
TASK 1(application 1)
TASK 1(application 1) TASK 2
(data input)
TASK 2(data input)
TASK 3(tcpip_thread)
TASK 3(tcpip_thread)
mboxmboxrecvmbox acceptmbox
Single Application
NETLAB
TASK 2(data input)
TASK 2(data input)
TASK 3(tcpip_thread)
TASK 3(tcpip_thread)
mboxmbox
TASK 1(application 1)
TASK 1(application 1)
recvmbox acceptmbox
TASK N(application N)
TASK N(application N)
recvmbox acceptmbox
Multi Application
NETLAB
API types
TYPE 1 BIND, LISTEN, CLOSE
TYPE 2 CONNECT
TYPE 3 SEND. WRITE
TYPE 4 ACCEPT, RECV
NETLAB
TASK 1TASK 1
TYPE 1
TASK 2TASK 2mboxmbox
1 2
34
msg->type• API_MSG_BIND• API_MSG_LISTEN
NETLAB
netconn_bindnetconn_bind do_binddo_bind
API_MSG_BIND
netconn_bind
mboxmboxapi_msg_post sys_mbox_fetch
sys_mbox_postsys_mbox_fetch
tcp_bind
NETLAB
netconn_listennetconn_listen do_listendo_listen
API_MSG_LISTEN
netconn_listen
mboxmboxapi_msg_post sys_mbox_fetch
sys_mbox_postsys_mbox_fetch
pcb->accpet = accept_function
NETLAB
netconn_closenetconn_close do_closedo_close
API_MSG_CLOSE
netconn_close
mboxmboxapi_msg_post sys_mbox_fetch
sys_mbox_postsys_mbox_fetch
tcp_close
NETLAB
TYPE 2
TASK 1TASK 1
TASK 2TASK 2
mboxmbox
1
2msg->type• API_MSG_CONNECT
TASK 3TASK 3
34
NETLAB
netconn_connectnetconn_connect
do_connectdo_connect
pcb->connected = do_connectedpcb->state = SYN_SENTtcp_enqueue()tcp_output()
netconn_connect
tcp_input() , tcp_process()switch case: SYNSENTpcb->connected
do_connecteddo_connected
mboxmboxapi_msg_post
sys_mbox_fetch
sys_mbox_post
sys_mbox_fetch
NETLAB
TYPE 3
TASK 1TASK 1 mboxmbox
1 2
34
msg->type• API_MSG_SEND• API_MSG_WRITE
TASK 2TASK 2
udp_outputor
tcp_write
NETLAB
netconn_sendnetconn_send do_senddo_send
API_MSG_SEND
netconn_send
mboxmboxapi_msg_post sys_mbox_fetch
sys_mbox_postsys_mbox_fetch
udp_output
NETLAB
netconn_writenetconn_write do_writedo_write
API_MSG_WRITE
netconn_write
mboxmboxapi_msg_post sys_mbox_fetch
sys_mbox_postsys_mbox_fetch
tcp_enqueuetcp_output
NETLAB
TYPE 4
TASK 3TASK 3TASK 1TASK 112 acceptmbox
orrecvmbox
acceptmbox orrecvmbox
TASK 2TASK 2mboxmbox
3 4
56
msg->type• API_MSG_RECV
NETLAB
netconn_accept
in tcp_processpcb->accept
accept_functionaccept_functionnetconn_acceptnetconn_accept acceptmboxsys_mbox_postsys_mbox_fetch
NETLAB
netconn_recv
recv_tcprecv_tcpnetconn_recvnetconn_recv recvmbox
do_recvdo_recvmboxmbox
API_MSG_RECV
in tcp_input()pcb->recv
sys_mbox_postsys_mbox_fetch
api_msg_post sys_mbox_fetch
sys_mbox_postsys_mbox_fetch
Let the stack know that we have taken the data
NETLAB
Server
netconn_new
netconn_bind
netconn_listen
netconn_accept
netconn_recv
netconn_write
netconn_close
do_bind
do_listen
accept_function
recv_tcp
do_write
do_recv
do_close
mbox
acceptmbox
recvmbox
mbox
mbox
mbox
mbox
TASK 1 TASK 2 TASK 3
NETLAB
Client
netconn_new
netconn_bind
netconn_connect
netconn_recv
netconn_write
netconn_close
do_bind
do_connect
do_connected
recv_tcp
do_write
do_recv
do_close
mbox
recvmbox
mbox
mbox
mbox
mbox
TASK 1 TASK 2 TASK 3
An Implementation of RDMA
Student: Chia-Tai TsaiAdviser: Prof. Rong-Hong Jan
NETLAB
Introduction 1/3
Network bandwidth bottlenecks Network hardware Network Protocol Performance End station performance
• CPU• The I/O bottlenecks
– Interrupts– TCP/IP checksum– Copies
NETLAB
DMA
NETLAB
RDMA
NETLAB
Protocol Stack
NETLAB
Experimental Model
Click to edit company slogan .