CHƯƠNG 5 TCP/IP STACK
5.2. HOẠT ĐỘNG CỦA TCP/IP STACK
TCP/IP Stack hoạt động gần giống cấu trúc của hệ điều hành thời gian thực, tức là các nhiệm vụ sẽ được chia thành các tác vụ ( ở đây là TCP, UDP, Ping,…). Tất cả hoạt động của TCP/IP sẽ được một đồng hồ chung quản lí theo Time Split. Tức là có một Timer hệ thống (Timer1), cứ 1 khoảng thời gian ngắn sẽ ngắt (gọi là 1 TICK), khi bị ngắt, hệ thống sẽ treo lại, ngữ cảnh của tất cả các tác vụ được bộ lập lịch lôi ra, xem xét tác vụ nào được chạy theo kiểu chia sẻ thời gian (vì khơng có mức ưu tiên cho tác vụ). Sau đó cho phép tác vụ đó chiếm quyền thực thi của CPU. Đến TICK tiếp theo, hệ thống lại treo lại, và lại lôi ngữ cảnh ra, cứ tiếp tục như vậy mãi.
Với cơ chế hoạt động này, vi điều khiển được coi như một lúc có thể vừa thực hiện TCP, vừa thực hiện UDP, Ping,…vừa có thể là Server và Client cùng một lúc.
Vì vậy, PIC nếu được thiết lập ở chế độ TCP Server/Client sẽ hoạt động đồng thời cả 2 hoạt động này. Server lắng nghe kết nối từ Client nào đó trên mạng. Cịn Client thì gửi lệnh mở cổng kết nối tới một Server nào đó cũng ở trên mạng, mà ta có thể xác lập được.
Vì vậy, hoạt động của các tác vụ là độc lập với nhau, không chịu ảnh hưởng lẫn nhau.
5.2.1. Các file cần thiết
- Main file: Lập trình trên file này.
- ARP.c và ARP.h: Các file này được sử dụng bởi Stack để xác định địa chỉ MAC kết hợp với địa chỉ IP.
- Delay.c và Delay.h: Những file này dùng để tạo độ trễ (delay) cho các hàm trong Stack.
- Physical layer files: Những file này dùng để cho phép một lớp vật lý cụ thể. - Helpers.c và Helpers.h: Các file này sẽ giải thích các hàm sử dụng trong Stack. - IP.c và IP.h: Các file này cung cấp các chức năng của lớp IP cho Stack.
- StackTsk.c và StackTsk.h –Các file này chứa code để khởi tạo Stack và thực hiện các hàm callback để cho Stack chạy.
- Tick.c và Tick.h: Các file này tạo ra một bộ đếm thời gian để thực hiện một số chức năng thời gian trong Stack.
- TCPIPConfig.h: Thiết lập cấu hình cho phần mềm.
- MAC.h: Cung cấp các macro và cấu trúc liên quan đến phần cứng của lớp MAC.
- TCPIP.h: Là file đính kèm trong Stack. Main file phải đính kèm file này.
5.2.2. Cấu trúc APP_CONFIG
Hầu hết các biến của ứng dụng liên quan của Stack được lưu trữ trong cấu trúc APP_CONFIG. Chúng bao gồm địa chỉ, cờ, chuỗi tên NBNS/SSID. Ta sẽ phải khai báo cho cấu trúc này và khởi tạo những giá trị mặc định của nó được định nghĩa trong file TCPIPConfig.h.
5.2.3. Main file
5.2.3.1. Khởi tạo
Đầu tiên, cần khởi tạo phần cứng như oscillators, LEDs, LCDs, PPS pins…
Sau đó, ta sẽ gọi các hàm khởi tạo từ thư viện. Đầu tiên là hàm TickInt(), nó khởi tạo tick timer để quản lý việc định thời của Stack. Sau đó là các hàm khởi tạo được thêm vào theo yêu cầu khởi tạo mà phần cứng yêu cầu. ví dụ như MPFSInt() để khởi tạo một cổng SPI (Serial Peripheral Interface Bus) để kết nối với thiết bị lưu trữ bộ nhớ để lưu trang web.
Khi phần cứng được khởi tạo, ta có thể cấu hình cho Stack. Hầu hết các biết của ứng dụng liên quan của Stack được lưu trong cấu trúc AppConfig. Lúc này ta có thể khởi tạo cấu trúc AppConfig theo những giá trị ta chọn.
Kết thúc khởi tạo Stack bằng việc gọi hàm StackInt(). Hàm này sẽ tự động khởi tạo các hàm cho firmware của các giao thức nếu chúng được định nghĩa trong file TCPIPConfig.h (ví dụ: TCPInit() cho TCP protocol, HTTPInt() cho HTTP hoặc HTTP2…).
5.2.3.2 Vịng lặp chính (main loop)
Khi chương trình được khởi tạo, ta sẽ tạo một vịng lặp vơ hạn để thực hiện các nhiệm vụ của ứng dụng. Trong vịng lặp có hai hàm phải được gọi thường xuyên là StackTask() và StackApplications.
Hàm StackTask sẽ được gọi ở bất kỳ thời điểm nào khi Stack yêu cầu và sẽ điều khiển sự truyền nhận các gói dữ liệu.
Hàm StackApplications sẽ gọi những module ứng dụng được gọi. Ví dụ nếu sử dụng HTTP2 server, StackApplications sẽ tự động gọi hàm HTTPServer để thực hiện bất kỳ nhiệm vụ nào của HTTP đang được đợi.
Trong vịng lặp chính, ta có thể hỏi vịng cho bất kỳ sự thay đổi I/O nào và gọi bất kỳ một nhiệm vụ đặc biệt của ứng dụng mà bạn thực hiện. Để tránh tràn bộ đệm
trong phần cứng hoặc vi phạm sự định thời của giao thức, ta sẽ thực hiện các nhiệm vụ trong hàm callback với các trigger định thời cơ sở.
Ta sẽ phải gọi hàm StackTask mỗi khi gọi hàm StackApplications.