2 điểm bởi GN⁺ 2024-11-12 | 1 bình luận | Chia sẻ qua WhatsApp
  • Truyền gói Ethernet

    • Tác giả muốn tạo ra một series có tên "Networking from scratch" và đã bắt đầu một dự án xây dựng ngăn xếp TCP/IP trên vi điều khiển.
    • Bài viết blog này chia sẻ câu chuyện truyền thành công gói Ethernet đầu tiên, cùng những lỗi và kinh nghiệm gỡ lỗi trong dự án.
  • Vi điều khiển

    • Vi điều khiển được sử dụng là STM32F401, dựa trên ARM Cortex-M4 và chạy ở tốc độ tối đa 84MHz.
    • Thiết bị có 96KiB RAM, cung cấp đủ dung lượng để xử lý nhiều gói.
  • Ethernet

    • Ethernet là một khái niệm bao gồm nhiều công nghệ và tiêu chuẩn, trong đó có phần cứng ở mức vật lý, định dạng tín hiệu, chiến lược xử lý va chạm trên bus, bố cục khung, v.v.
    • Trong dự án này, tác giả sử dụng chip W5100 của Wiznet, con chip này tích hợp sẵn ngăn xếp TCP/IP bằng phần cứng.
  • Vấn đề 1: Gào thét trong khoảng không

    • Tác giả đã viết driver để giao tiếp với chip W5100, nhưng việc giao tiếp không diễn ra do tín hiệu SPI được nối sai.
    • Vấn đề xảy ra vì header ICSP của Arduino shield nối sai tín hiệu SPI, và tác giả đã phải làm lại bo mạch để sửa lỗi.
  • Vấn đề 2: Bản chất của hài kịch

    • Ngay cả sau khi tín hiệu SPI đã được nối đúng, việc truyền gói Ethernet vẫn không hoạt động bình thường.
    • Tác giả dùng logic analyzer để phân tích tín hiệu số, rồi giải quyết vấn đề về timing của tín hiệu chọn chip để giao tiếp thành công.
  • Vấn đề 3: Gói tin không xác định

    • Trong Wireshark xuất hiện những gói sai, không phải gói mà tác giả đã truyền.
    • Sau khi tham khảo thư viện Arduino để phân tích vấn đề, tác giả đã sửa một bug ghi dữ liệu vào địa chỉ bộ nhớ sai và giải quyết được lỗi.
  • Bài học của câu chuyện

    • Việc truyền một gói Ethernet có thể là một thành quả nhỏ, nhưng những lỗi và kinh nghiệm gỡ lỗi trong dự án thì rất đáng giá.
    • Gỡ lỗi và việc viết công cụ là những phần quan trọng trong quá trình phát triển; điều quan trọng là hiểu hệ thống thông qua khám phá và thử nghiệm.
    • Dự án vẫn đang tiếp tục, với việc xử lý các vấn đề và bug ở mức trừu tượng cao hơn.

1 bình luận

 
GN⁺ 2024-11-12
Ý kiến trên Hacker News
  • Việc viết công cụ và khám phá quá trình gỡ lỗi luôn có giá trị. Tuy nhiên, nhiều người không hiểu điều này, và đặc biệt trong các quy trình phát triển như JIRA, họ thường không nhìn thấy giá trị của việc khám phá.

  • Khả năng tạo ra các công cụ nhỏ là cốt lõi của một lập trình viên có năng suất gấp 10 lần, và đó thường là một nghệ thuật được thực hành trong bóng tối.

  • Đây là phần mở đầu của một loạt bài xây dựng ngăn xếp TCP/IP và khung Ethernet từ đầu trên vi điều khiển. Chip W5100 được dùng để xử lý TCP/IP và hỗ trợ các khung Ethernet được dựng sẵn.

  • Có ý kiến cho biết họ đã chuyển hướng sự nghiệp sang kỹ thuật FPGA để tập trung vào Ethernet, và việc hiểu các lớp trừu tượng của mạng là cực kỳ có giá trị.

  • Có ý kiến cho rằng thay vì dùng STM32F401 và Ethernet shield W5100, sẽ tốt hơn nếu dùng bo mạch STM32F407 cùng một bo Ethernet PHY giá rẻ.

  • Chức năng Ethernet thường được tích hợp dưới dạng thiết bị ngoại vi bên trong vi điều khiển.

  • Đây là lần đầu họ thấy cách gọi mới cho MOSI/MISO là main out/subordinate in, và họ không thực sự hiểu phương án thay thế COPI/CIPO.

  • Để viết network stack trên Linux, có thể dùng socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)).

  • Bo mạch STM32 Nucleo có Ethernet 100Mbps tích hợp sẵn, và phần mềm STM32Cube nhận được đánh giá trái chiều nhưng có cung cấp các ví dụ hoạt động được.

  • Ethernet xử lý frame, còn packet là một khái niệm của IP.

  • Có thể cân nhắc ENC28J60, một 'Stand-Alone Ethernet Controller with SPI Interface', và vì nó không có hardware TCP/IP stack nên cần triển khai bằng phần mềm.