Trong suốt tutorial về enc28j60 – ethernet, mình đã hướng dẫn các bạn tìm hiểu về cơ chế hoạt động của hệ thống mạng và giao thức cơ bản. Tuy nhiên trong ứng dụng sản xuất thực tế, để đảm bảo tính ổn định và tin cậy của hệ thống, chúng ta không nên sử dụng các thư viện mạng tự viết mà sẽ dùng bộ thư viện tiêu chuẩn đã được công nhận và sử dụng rộng rãi.
LWIP là thư viện mạng được sử dụng vô cùng phổ biến. Nó được thiết kế để sử dụng trong các hệ thống nhúng với chỉ khoảng 40Kb Flash và 20KB RAM
LWIP hỗ trợ hầu hết các giao thức cơ bản, quá đủ để chúng ta phát triển ứng dụng của mình
DOWNLOAD
Các bạn tải thư viện lwip tại đây Phiên bản mình đang sử dụng trong bài viết này là 2.1.2
Sau khi tải về, các bạn giải nén và để trong thư mục project
Sử dụng thư viện
Bây giờ, các bạn hãy xóa toàn bộ các thư viện mạng mà chúng ta đã tự viết trong các bài trước đi nhé ( Mất công viết giờ bỏ – hahaha) LWIP chỉ là thư viện mạng, do đó tầng vật lí ( tức là thư viện enc28j60 thì chúng ta vẫn phải để lại)
Nhiệm vụ của chúng ta là liên kết thư viện vật lí (ENC28J60 với thư viện mạng LWIP) và cấu hình các thông số cơ bản để lwip hoạt động theo mong muốn của chúng ta
LWIP yêu cầu người dùng cung cấp tối thiểu các thiết lập sau:
- File cc.h chứa các thông tin định nghĩa về trình biên dịch
- File cpu.h chứa thông tin về CPU ( LITTLE_ENDIAN hay BIG_ENDIAN )
- File lwipopts.h chứa các define chỉ dẫn cho lwip ( ví dụ các giao thức ta muốn dùng, bộ nhớ ta muốn cấp phát )
- FIle network interface cung cấp các hàm để truy cập vào bộ đệm của tầng vật lí ( thức là bộ đệm mạng của ENC28J60) mình sẽ gọi file này là ethernetif.h
- Các hàm cung cấp thời gian hệ thống, hàm random ( Mình sẽ viết chúng trong file lwip_user các chức năng khởi tạo lwip mình cũng sẽ viết vào file này luôn
Mình đã viết xong tất cả các file này, các bạn có thể tải về tại đây Sau khi tải về các bạn để vào cùng cấp với thư mục Inc Src của project nhé.
Cùng đừng quên add path vào project ( Nếu dùng keilc ấn f12 -> C/C++ -> Include Path)
Trong cây thư mục project bên trái, các bạn xóa hết các thư viện mạng (tcp udp net arp ….) trong group ENC28J60 vì chúng ta không cần dùng tới chúng nữa ( nhớ để lại thư viện ENC28J60)
Tạo thêm 1 group tên là lwip/user và add các file mà mình đã viết dùng để liên kết thư viện ENC28J60 và thư viện LWIP vào
Bây giờ chúng ta sẽ add thư viện lwip vào project
Add tất cả path của thư viện lwip vào project ( Nếu dùng keilc ấn f12 -> C/C++ -> Include Path) ( Nói chung thằng lwip có bao nhiêu folder các bạn cứ add hết vào)
Tạo thêm 4 group gồm và add các source của thư viện lwip vào group
- lwip/api
- lwip/core
- lwip/netif
- lwip/core/ipv4
Vậy là xong, thiết lập project với lwip đã hoàn tất
Sử dụng thư viện
Trong phần include ở file main, xóa các file thư viện đã include trong project trước ( vì chúng ta k dùng chúng nữa) các bạn add thư viện lwip_user.h vào là được
Hàm main
Biên dịch và nạp, bật debug lên và điền vào ô wath1 biến lwip_netif các bạn có thể thấy lwip đã chạy DHCP và lấy được IP trong mạng cục bộ
Ở đây IP của mình là 0801A8C0 tức 192.168.1.8
Chúng ta cũng có thể ping thử bằng cmd
Tuyệt vời, thư viện hoạt động hoàn hảo, ở đây mình đang cấu hình thư viện hoạt động ở chế độ DHCP, nếu các bạn muốn sử dụng chết độ static IP hãy định nghĩa LWIP_DHCP là 0 trong file lwipopts.h và điền ip tĩnh trong file lwip_user.c
Như vậy trong bài này, mình đã hướng dẫn các bạn cách cấu hình thư viện lwip vào dự án. Trong phần tiếp theo chúng ta sẽ tìm hiểu sau hơn về cách làm việc với các giao thức ở tầng mạng tcp, http, mqtt ..
Các bạn có thể tải toàn bộ source code cho bài này ở đây
sao bạn không dùng github lưu source code.
*** Using Compiler ‘V6.19’, folder: ‘C:\Keil_v5\ARM\ARMCLANG\Bin’
Build target ‘code’
linking…
code\code.axf: Error: L6218E: Undefined symbol sio_open (referred from slipif.o).
code\code.axf: Error: L6218E: Undefined symbol sio_send (referred from slipif.o).
code\code.axf: Error: L6218E: Undefined symbol sio_tryread (referred from slipif.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 3 error messages.
“code\code.axf” – 3 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed: 00:00:01
Batch-Build summary: 0 succeeded, 1 failed, 0 skipped – Time Elapsed: 00:00:01
cho em xin gợi ý sữa lỗi được không ạ