540 likes | 881 Views
A survey of uC/OS & lwIP. 蔡嘉泰 tai@cis.nctu.edu.tw. MicroC/OS II. Features. Source Code Open Source ,程式碼簡潔易懂 Portable 程式碼大部分皆是利用 ANSI C 所開發的 與 microprocessor 行為有關的則利用組合語言來完成,使得 uC/OS-II 能夠輕易的移植到其他 Processor uC/OS-II 可以在 8/16/32 bits 的 microprocessor 上或是 micro-controller 上運作. Features.
E N D
A survey of uC/OS & lwIP 蔡嘉泰 tai@cis.nctu.edu.tw
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
LOW Priority Task ISR (1) (2) HIGH Priority Task (4) (3) Time ISR makes the high priority task ready (5) (6) (7) Features • Preemptive • uC/OS-II 永遠會讓已經Ready且優先權最高的工作行程先執行 NETLAB
TASK WAITING TASK DORMANT TASK READY TASK RUNNING ISR RUNNING Features NETLAB
Features • Multi-tasking • uC/OS-II最多可支援64個task,其中會為系統保留8個task使用 • 每一個task都有一個唯一的priority,也就是說uC/OS-II無法實現Round Robin排程 NETLAB
TASK #n Stack TASK #1 Stack TASK #2 Stack …… Task Control Block Task Control Block Task Control Block Status Status Status SP SP SP Priority Priority Priority . . . . . . . . . MEMORY CPU SP . . . 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
HIGH AX CX DX BX SP BP SI DI ES DS LOW OS_CPU_C.C • Initialize a Task‘s STACK • 在堆疊增長的方向上定每一個需要保存的Register位址 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
Upper Layer Protocol (ULP) lwIP (TCP/IP Protocol) uC-OS II 嵌入式系統開發板 lwIP簡介 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
Protocol Stack Application/ Management model RTP, RTCP UDP IP MAC Physical NETLAB
TCP/IP與行程間的溝通 NETLAB
SOCKET API bindlisten connect acceptrecvsendwriteclose lwip_APIlwip_bindlwip_listen lwip_connect lwip_acceptlwip_recvlwip_sendlwip_writelwip_close netconn_APInetconn_bindnetconn_listen netconn_connect netconn_acceptnetconn_recvnetconn_sendnetconn_writenetconn_close NETLAB
driver tcpip_thread recv_buf_data api_msg_input ethernetif_input do_bind … low_level_inpit ip_input tcp_input tcp_process TASK 1 TASK 2 TASK 3 application socket API lwip_bind … netconn_bind … NETLAB
Single Application TASK 1(application 1) TASK 2(data input) mbox recvmbox acceptmbox TASK 3(tcpip_thread) NETLAB
Multi Application TASK 1(application 1) recvmbox acceptmbox TASK 2(data input) mbox TASK N(application N) recvmbox acceptmbox TASK 3(tcpip_thread) NETLAB
API types • TYPE 1 • BIND, LISTEN, CLOSE • TYPE 2 • CONNECT • TYPE 3 • SEND. WRITE • TYPE 4 • ACCEPT, RECV NETLAB
TYPE 1 • msg->type • API_MSG_BIND • API_MSG_LISTEN TASK 1 TASK 2 1 2 mbox 4 3 NETLAB
api_msg_post sys_mbox_fetch sys_mbox_fetch sys_mbox_post netconn_bind netconn_bind API_MSG_BIND do_bind mbox tcp_bind NETLAB
api_msg_post sys_mbox_fetch sys_mbox_fetch sys_mbox_post netconn_listen netconn_listen API_MSG_LISTEN do_listen mbox pcb->accpet = accept_function NETLAB
api_msg_post sys_mbox_fetch sys_mbox_fetch sys_mbox_post netconn_close netconn_close API_MSG_CLOSE do_close mbox tcp_close NETLAB
TYPE 2 TASK 2 • msg->type • API_MSG_CONNECT 2 TASK 1 1 mbox 4 3 TASK 3 NETLAB
sys_mbox_fetch api_msg_post sys_mbox_fetch sys_mbox_post netconn_connect do_connect pcb->connected = do_connectedpcb->state = SYN_SENTtcp_enqueue()tcp_output() netconn_connect mbox tcp_input() , tcp_process()switch case: SYNSENTpcb->connected do_connected NETLAB
TYPE 3 • msg->type • API_MSG_SEND • API_MSG_WRITE TASK 1 TASK 2 1 2 mbox 4 3 udp_outputortcp_write NETLAB
api_msg_post sys_mbox_fetch sys_mbox_fetch sys_mbox_post netconn_send netconn_send API_MSG_SEND do_send mbox udp_output NETLAB
api_msg_post sys_mbox_fetch sys_mbox_fetch sys_mbox_post netconn_write netconn_write API_MSG_WRITE do_write mbox tcp_enqueuetcp_output NETLAB
TYPE 4 TASK 1 TASK 3 2 1 acceptmbox orrecvmbox • msg->type • API_MSG_RECV 3 4 TASK 2 mbox 6 5 NETLAB
sys_mbox_fetch sys_mbox_post netconn_accept in tcp_processpcb->accept netconn_accept accept_function acceptmbox NETLAB
api_msg_post sys_mbox_fetch netconn_recv in tcp_input()pcb->recv netconn_recv recv_tcp sys_mbox_fetch sys_mbox_post recvmbox API_MSG_RECV do_recv sys_mbox_fetch mbox sys_mbox_post Let the stack know that we have taken the data NETLAB
Server netconn_new netconn_bind mbox do_bind netconn_listen mbox do_listen netconn_accept acceptmbox accept_function recvmbox recv_tcp netconn_recv do_recv mbox netconn_write mbox do_write netconn_close mbox do_close TASK 1 TASK 2 TASK 3 NETLAB
Client netconn_new netconn_bind mbox do_bind do_connect netconn_connect mbox do_connected recvmbox recv_tcp netconn_recv do_recv mbox netconn_write mbox do_write netconn_close mbox do_close TASK 1 TASK 2 TASK 3 NETLAB
An Implementation of RDMA Student: Chia-Tai Tsai Adviser: Prof. Rong-Hong Jan
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