Bắt đầu với DevOps cho Hệ thống Nhúng sử dụng ATmega328P

Ari Mahpour
|  Created: Tháng Năm 29, 2024  |  Updated: Tháng Bảy 1, 2024
Bắt đầu với DevOps cho Hệ thống Nhúng sử dụng ATmega328P

DevOps và các phương pháp Agile đã biến đổi ngành phát triển phần mềm bằng cách nhấn mạnh vào sự hợp tác, tự động hóa và cải tiến liên tục. Việc áp dụng các nguyên tắc DevOps vào thiết kế và dự án của tôi đã là một bước ngoặt, nâng cao hiệu quả và độ tin cậy. Trong bài viết này, chúng ta sẽ đi qua việc thiết lập một quy trình tích hợp liên tục (CI) cho một dự án hệ thống nhúng hiện có sử dụng vi điều khiển ATmega328P. Đến cuối bài viết này, bạn sẽ thấy cách những phương pháp này có thể tối ưu hóa quy trình phát triển của bạn và cung cấp sản phẩm chất lượng cao hơn.

Hiểu về DevOps và Agile cho Hệ thống Nhúng

DevOps là một tập hợp các phương pháp, được phổ biến bởi thế giới phần mềm, kết nối phát triển phần mềm (Dev) và hoạt động IT (Ops) thành một dòng chảy liên tục. Trong thế giới phần mềm, việc phát triển phần mềm và “ném nó qua bức tường” cho nhóm vận hành để triển khai cho khách hàng từng là điều phổ biến. DevOps đã giới thiệu một cách không chỉ phá bỏ bức tường đó mà còn tự động hóa toàn bộ quy trình từ đầu đến cuối. Trong thế giới phần cứng, chúng ta tìm thấy sự tương đồng giữa việc phát triển sản phẩm và sản xuất, liên tục ném thiết kế “qua bức tường” cho các đội kỹ sư sản xuất để đảm bảo mọi thứ sẵn sàng cho sản xuất.

Trong thiết kế sản phẩm nhúng, chúng ta vẫn phải đưa phần mềm qua quá trình sản xuất nhưng đối mặt với thách thức di chuyển nhanh hơn bao giờ hết và cung cấp với chất lượng cao nhất có thể. Với các nguyên tắc DevOps, chúng ta nhắm đến giải quyết một số thách thức đó.

  • Phụ thuộc vào Phần cứng: Hệ thống nhúng phụ thuộc vào phần cứng và các phiên bản cụ thể của các PCB. Điều này có thể làm cho việc kiểm tra và triển khai trở nên phức tạp nếu không được tối ưu hóa để tự động hóa và có khả năng mở rộng cao. Các phương pháp DevOps giúp tự động hóa các quy trình này bằng cách sử dụng cùng một cấu hình cho cả phần cứng và phần mềm và đưa nó qua các hệ thống tích hợp liên tục (CI) tự động.
  • Thời gian Xây dựng Dài: Việc xây dựng phần mềm nhúng có thể khó thiết lập và dẫn đến thời gian xây dựng dài. CI tự động hóa và tăng tốc quá trình này bằng cách chuyển việc xây dựng sang đám mây, sử dụng các thể hiện mạnh mẽ hơn mà các nhà phát triển thường không có quyền truy cập.
  • Kiểm tra Thủ công: Việc kiểm tra trên phần cứng thực tế là cần thiết nhưng thường xuyên là thủ công, tẻ nhạt và tốn thời gian. Tự động hóa thông qua kiểm tra phần cứng trong vòng lặp (HIL) cải thiện hiệu quả và độ chính xác và có thể được chuyển giao cho một cấu hình của thiết bị kiểm tra tự động được cấu hình với hệ thống CI của bạn.

Bằng cách áp dụng các nguyên tắc DevOps, chúng ta có thể lặp lại nhanh chóng sử dụng các phương pháp Agile trong khuôn khổ xây dựng-kiểm tra-triển khai cho mỗi tính năng bổ sung mà chúng ta muốn phát hành cho sản xuất.

Cách Tất cả Hoạt động

“Xây dựng, kiểm tra và triển khai” là một bộ từ phổ biến mà bạn thường nghe khi thảo luận về DevOps. Trong hệ thống nhúng, chúng tôi cũng làm điều tương tự vì việc triển khai của chúng tôi cũng được đưa vào sản xuất (và sau đó là đến khách hàng cuối). Trong kho lưu trữ của dự án chúng tôi sử dụng Gitlab CI để điều khiển quy trình làm việc từ đầu đến cuối cho Embedded DevOps. Chúng tôi sử dụng cái gọi là “pipelines” để tạo ra các công việc nhằm đạt được một số nhiệm vụ như biên dịch phần mềm, chạy các bài kiểm tra trên mục tiêu, hoặc phát hành nó như một gói chính thức. Trong Gitlab, một pipeline là một tập hợp các công việc chạy theo một dòng tuần tự như thế này:

Ví dụ về pipeline

Hình 1: Ví dụ về pipeline được sử dụng với quy trình làm việc DevOps ATmega328P trong Gitlab

Dưới đây là bản tóm tắt về kịch bản CI (.gitlab-ci.yml file) để bạn có thể hiểu cách thức hoạt động.

  • Docker: Như đã thảo luận trong Containerizing Build and Runtime Environments for Hardware in the Loop Testing, giai đoạn này xây dựng các hình ảnh Docker để tạo ra một môi trường nhất quán cho việc xây dựng, kiểm tra và flash code. Điều này đảm bảo quá trình xây dựng có thể tái tạo được trên các máy và kiến trúc khác nhau (như máy tính để bàn so với Raspberry Pi).
  • Test: Giai đoạn này chạy các bài kiểm tra đơn vị để xác minh rằng mã của bạn đang làm những gì bạn muốn nó làm. Các bài kiểm tra tự động là nhanh chóng và quan trọng khi chỉnh sửa hoặc tái cấu trúc mã hiện có.
  • Build: Giai đoạn này biên dịch mã nguồn thành các tệp nhị phân. Trong dự án này, nó tạo ra các sản phẩm như tệp .elf và .hex, được sử dụng để flash chip ATmega328P.
  • HIL (Hardware-in-the-Loop): Giai đoạn này liên quan đến việc kiểm tra phần mềm trên phần cứng thực tế để đảm bảo nó hoạt động chính xác trong điều kiện thực tế. Nó tải phần mềm lên phần cứng và chạy các bài kiểm tra để xác minh chức năng mà chúng tôi thiết kế thực sự hoạt động trên sản phẩm cuối cùng.
  • Deploy: Giai đoạn này xử lý việc xuất bản các sản phẩm đã xây dựng vào một kho lưu trữ gói, làm cho chúng có sẵn để sử dụng.
  • Release: Giai đoạn này tạo ra một bản phát hành phần mềm mới, tự động hóa quá trình giao hàng để đảm bảo cập nhật nhanh chóng và đáng tin cậy. Đây là những gì đội ngũ sản xuất sẽ sử dụng để lấy phiên bản phần mềm cần thiết cho toàn bộ việc lắp ráp sản phẩm của họ.

Chi tiết Tinh tế

Có một số chi tiết nhỏ làm cho quy trình làm việc này từ một triển khai DevOps cơ bản trở thành một hệ thống hoạt động mượt mà, được tài liệu hóa tốt và dễ dàng quan sát. Có một vài chi tiết tinh tế trong quy trình làm việc CI quan trọng cần được chỉ ra.

  • Phiên bản Ngữ nghĩa: Đặt một phiên bản, dù thông qua một cơ chế tự động hoặc thủ công, là cực kỳ quan trọng cho chu kỳ phát hành, đặc biệt là khi làm việc với sản xuất. Ví dụ, điều này được thiết lập như một biến trong kịch bản CI và sau đó được sử dụng trong các công việc xuất bản và phát hành.
  • Logic xây dựng Docker: Bạn sẽ nhận thấy có một khối logic được sử dụng cho việc xây dựng container Docker:

 


if [ "$CI_COMMIT_REF_SLUG" == "$CI_DEFAULT_BRANCH" ]; then

  export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:latest

else

  export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:$CI_COMMIT_REF_SLUG

fi

 

Logic này thiết lập cơ sở để tag “mới nhất” của chúng tôi chỉ sử dụng hình ảnh Docker được xây dựng trên nhánh chính (tức là sau khi một yêu cầu hợp nhất được thông qua thành công). Điều này đảm bảo rằng chỉ có các yêu cầu hợp nhất thành công mới công bố hình ảnh docker mới nhất và tốt nhất mà mọi người và mọi pipeline đều lấy từ đó.

  • Báo cáo và Phủ sóng: Trong các hệ thống CI hiện đại như Gitlab, chúng tôi có thể trích xuất và hiển thị báo cáo kiểm tra và phủ sóng ngay trong các yêu cầu hợp nhất và pipeline của mình. Ví dụ, trong yêu cầu hợp nhất này, chúng tôi đã ghi lại phủ sóng mã:
Phủ sóng mã trong một yêu cầu hợp nhất

Hình 2: Phủ sóng mã trong một yêu cầu hợp nhất

Trong ảnh chụp màn hình này, Gitlab tóm tắt các bài kiểm tra được thực hiện trên mục tiêu sử dụng phần cứng trong vòng lặp:

Tóm tắt kiểm tra cho các bài kiểm tra được thực hiện trên mục tiêu

Hình 3: Tóm tắt kiểm tra cho các bài kiểm tra được thực hiện trên mục tiêu

Cuối cùng, một khi mã của chúng tôi đã được xác thực cả với kiểm tra đơn vị và trên mục tiêu, các giai đoạn xuất bản và phát hành tạo ra một gói phần mềm đẹp mắt có thể được nhóm sản xuất sử dụng:

Phát hành gói phần mềm

Hình 4: Phát hành gói phần mềm

Với tất cả các bước tự động này, chúng tôi có thể phát hành một tính năng mới một cách lặp đi lặp lại theo phong cách Agile. Không cần phải phát triển nhiều tính năng, gửi chúng đến bộ phận QA, và sau đó là đánh giá để phát hành gói bởi nhóm sản xuất. Mọi thứ ở đây xảy ra trong một quy trình làm việc duy nhất và hoàn toàn tự động.

Kết luận

Trong bài viết này, chúng tôi đã khám phá cách áp dụng phương pháp luận DevOps và Agile vào phát triển hệ thống nhúng, cụ thể là sử dụng vi điều khiển ATmega328P. Chúng tôi đã thảo luận về lợi ích của việc triển khai luồng công việc CI trong Gitlab, bao gồm tự động hóa, thời gian xây dựng nhanh hơn và kiểm thử hiệu quả. Bằng cách phân tích kịch bản CI và giải thích từng giai đoạn, chúng tôi đã chỉ ra cách tạo ra một quy trình phát triển vững chắc và tinh gọn, tăng cường hiệu quả và chất lượng sản phẩm. Bằng cách theo dõi hướng dẫn thực tế này (và mã nguồn trong kho lưu trữ), bạn cũng nên có thể thiết lập luồng công việc Embedded DevOps của riêng mình.

Mã nguồn của dự án có thể được tìm thấy tại đây:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.

About Author

About Author

Ari is an engineer with broad experience in designing, manufacturing, testing, and integrating electrical, mechanical, and software systems. He is passionate about bringing design, verification, and test engineers together to work as a cohesive unit.

Related Resources

Tài liệu kỹ thuật liên quan

Back to Home
Thank you, you are now subscribed to updates.