Hệ thống nhúng là một phần không thể thiếu trong thế giới công nghệ ngày nay. Dù là một chiếc máy cạo râu kết nối internet hay một chiếc ô tô phức tạp, các thiết bị nhúng là trái tim của hầu hết các thiết bị điện tử mà chúng ta sử dụng ngày nay. Bao gồm một hoặc nhiều vi xử lý, hệ thống nhúng có thể đơn giản hóa điện tử bằng cách chuyển giao độ phức tạp để được xử lý bởi phần mềm. Khi các thiết bị nhúng trở nên lớn hơn và phức tạp hơn thì các bảng mạch in (PCB) cũng vậy. Thường thì những thiết bị này phát triển thành nhiều bảng mạch và trở thành các hợp phần lớn hơn so với ban đầu dự định.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về các sự đánh đổi và xem xét kiến trúc cho hệ thống nhúng bao gồm nhiều PCB. Chúng ta sẽ đề cập đến các lợi ích, xem xét thiết kế, và thách thức liên quan đến hệ thống nhiều PCB.
Mặc dù giữ thiết bị của bạn trên một PCB duy nhất là lựa chọn lý tưởng (cả về sự đơn giản và chi phí), đôi khi chúng ta phải chấp nhận chia thiết kế của mình thành hai hoặc nhiều PCB để đạt được mục tiêu thiết kế của mình. Một số lý do tại sao chúng ta muốn chia sản phẩm thành nhiều bảng mạch bao gồm:
Vì những lý do này (và nhiều hơn nữa) chúng ta xem xét thiết kế một hợp phần bao gồm nhiều PCB nhưng những thách thức với phía firmware nhúng không phải không có độ phức tạp của chúng.
Bây giờ chúng ta đã thiết lập lý do sử dụng nhiều PCB (khi áp dụng), điều quan trọng là phải hiểu các xem xét thiết kế khi kiến trúc hệ thống nhúng. Cả từ góc độ phần cứng và phần mềm có những điểm tinh tế mà chúng ta không có xu hướng cân nhắc một cách cẩn thận khi đặt tất cả vào một bảng mạch duy nhất.
Điều đầu tiên cần được xem xét là giao tiếp giữa các bảng mạch. Làm thế nào mỗi bảng mạch sẽ giao tiếp với nhau? Loại sức mạnh xử lý nào (nếu có) tồn tại trên mỗi bảng mạch? Có thể một bảng mạch bao gồm bộ não trong khi các bảng mạch khác bao gồm các cảm biến? Khi chúng ta cẩn thận lựa chọn các giao thức truyền thông, dù là I2C, SPI, UART, Ethernet, v.v., chúng ta cũng phải cân nhắc đến đường truyền, tính toàn vẹn tín hiệu và quan trọng nhất là việc chuyển tín hiệu qua các kết nối giữa các bảng mạch. Điều tồi tệ nhất có thể xảy ra với một nhà thiết kế (và tin tôi đi, tôi đã từng trải qua) là thiết kế toàn bộ hệ thống và nhận lại PCB từ nhà sản xuất chỉ để nhận ra rằng bạn đã bỏ sót một hoặc hai tín hiệu đồng hồ. Chúng ta cũng thường quên giữ chân dự phòng trên các kết nối giữa các bảng mạch, cố gắng tận dụng tối đa số chân. Điều này thực sự có thể gây rắc rối cho chúng ta vào cuối cùng. Thiết kế với dự án nhiều bảng mạch trong tâm trí, như tính năng Lắp ráp nhiều bảng mạch vật lý trong Altium Designer, là điều bắt buộc khi định tuyến nhiều đường truyền thông giữa các PCB.
Chúng ta cũng cần suy nghĩ về cách chúng ta dự định phân phối điện, đặc biệt nếu chúng ta sẽ theo dõi các bus điện với vi xử lý của mình. Chúng ta muốn có khả năng tiếp cận "bộ não" để cho phép nó theo dõi bất kỳ sự kiện thảm khốc nào, nhưng chúng ta cũng cần xem xét tiếng ồn của nguồn cung cấp chuyển đổi, phân phối điện cho các tải nặng, và nếu các chân kết nối giữa các bảng mạch của chúng ta có đánh giá cho loại điện đó hay không.
Cuối cùng, mặc dù không trực tiếp liên quan đến phần mềm của hệ thống nhúng, thiết kế cơ khí cũng đóng một vai trò quan trọng. Nút nhấn, màn hình cảm ứng và các giao diện vật lý khác với người dùng vẫn kết nối với vi xử lý và phải được xem xét. Có thể định tuyến dây điện một cách nào đó để vi xử lý có thể truy cập vào các đầu vào của nó không? Chúng ta đã xem xét đến tính toàn vẹn tín hiệu của đầu ra số tốc độ cao khi chúng ta truyền nó từ bảng mạch này sang bảng mạch khác chưa? Đây là những điều chúng ta phải suy nghĩ khi thiết kế thiết bị nhúng của mình.
Một trong những thách thức ít được nhắc đến mà tôi đã thấy đi đi lại lại trong các startup đang phát triển (và thậm chí là các công ty lớn) là nạn của các phương pháp phiên bản giữa phần mềm và phần cứng. Quản lý các bản phát hành phần mềm đối với các phiên bản PCB trở thành cuộc chiến không bao giờ kết thúc thường dẫn đến sự nhầm lẫn, trì hoãn, và thậm chí là thất bại của sản phẩm.
Ví dụ, trong một startup tôi đã làm việc, một sự thay đổi nhỏ trong PCB yêu cầu một lần chỉnh sửa và do đó, cập nhật firmware (mặc dù là tối thiểu). Do kiểm soát phiên bản kém, đội ngũ kỹ thuật đã triển khai firmware mới trên các phiên bản PCB cũ gây ra sự cố mất điện đột ngột và đám khói định kỳ. May mắn thay chúng tôi đã phát hiện ra trước khi sản phẩm được giao nhưng đó thực sự là một cơn ác mộng kéo dài hàng ngày..
Để tránh những rủi ro này, việc thiết lập một phương pháp phiên bản vững chắc và đảm bảo giao tiếp rõ ràng giữa các đội ngũ phần cứng và phần mềm là rất quan trọng. Ngay cả một phương pháp phiên bản đơn giản như một mã hash Git (hoặc phiên bản ngữ nghĩa) cho firmware, cùng với một bảng tra cứu hỗ trợ cơ bản cho các phiên bản phần cứng, cũng đủ tốt để bắt đầu. Khi thời gian trôi qua, các cơ chế phức tạp hơn như phát hiện phiên bản phần cứng trong firmware (do đó kiểm tra tính tương thích) cũng giảm thiểu sự nhầm lẫn.
Ngoài việc quản lý phiên bản phần mềm, việc suy nghĩ về tính mô-đun của mã cũng rất quan trọng. Với mã spaghetti, việc thay thế một bảng cảm biến với các chip hoặc cảm biến mới có thể trở thành một cơn ác mộng tái cấu trúc. Việc mô-đun hóa trình điều khiển thiết bị của bạn và tạo các lớp trừu tượng phần cứng cho phép dễ dàng thay thế các thành phần trong nhiều năm tới. Đây là điều đã trở nên phổ biến hơn khi các hệ thống nhúng ngày càng phức tạp hơn theo thời gian.
Khi chúng ta nghĩ về kiến trúc hệ thống nhúng, chúng ta không nhất thiết phải nghĩ nhỏ. Tàu vũ trụ và ô tô là những hệ thống nhúng cực kỳ phức tạp nhưng điện thoại thông minh cũng vậy. Dù chúng ta đang thiết kế một chiếc thìa kết nối internet hay vệ tinh tiếp theo, việc hiểu rõ các sự đánh đổi cho kiến trúc hệ thống nhúng là cực kỳ quan trọng khi thiết kế cho nhiều PCB. Chúng ta đã khám phá nhiều khái niệm trong bài viết này nhưng vẫn còn nhiều điều mà, không nghi ngờ gì nữa, bạn sẽ tìm thấy trong hành trình của mình.