Mỗi khi nhắc đến xe hơi hiện đại, nhiều người nghĩ ngay đến động cơ hay kiểu dáng thân vỏ. Ít ai biết rằng bên trong một chiếc xe ngày nay có hàng chục đến hàng trăm bộ điều khiển điện tử (ECU), và phần lớn đều đang chạy phần mềm gần như liên tục. Lập trình automotive vì thế đang trở thành hướng đi được nhiều bạn sinh viên CNTT quan tâm. Mỗi tháng, đội ngũ chúng tôi nhận được khá nhiều câu hỏi về mảng này.
Bài viết này được đúc kết từ những gì chúng tôi đã làm, và cả những lần vấp ngã khi làm việc với AUTOSAR, C/C++ và automation test. Mỗi phần bên dưới đều bắt nguồn từ một tình huống cụ thể trong dự án. Nếu bạn đang loay hoay tìm hướng đi, hy vọng nội dung sẽ giúp bạn hình dung rõ hơn.
Lập trình automotive là gì, nói đơn giản?
Nói ngắn gọn, lập trình automotive là viết phần mềm cho các hệ thống trên ô tô. Ví dụ điển hình là điều khiển phanh, quản lý động cơ hay hiển thị thông tin lên cụm đồng hồ táp-lô. Phần mềm này không chạy trên máy tính văn phòng mà chạy trên vi điều khiển có tài nguyên rất khiêm tốn. Bạn phải tính từng kilobyte bộ nhớ và từng chu kỳ xung nhịp.
Điểm khác biệt lớn nhất nằm ở độ an toàn. Một lỗi nhỏ trên trang web có thể chỉ khiến người dùng bực mình rồi tải lại trang. Nhưng một lỗi trong hệ thống phanh thì hậu quả có thể rất nặng nề. Vì vậy, từ khâu viết code, review cho đến kiểm thử đều được siết chặt hơn nhiều so với phần mềm thông thường. Bạn sẽ thấy điều này rõ ngay khi tham gia dự án đầu tiên.
AUTOSAR: chuẩn chung để các ECU hiểu nhau
Trước đây, mỗi hãng xe thường tự viết phần mềm theo cách riêng. Đoạn code chạy tốt ở dự án này gần như không thể tái sử dụng ở dự án khác. AUTOSAR ra đời để giải quyết chính vấn đề đó. Đây là một kiến trúc phần mềm chuẩn, chia hệ thống thành các lớp có vai trò rõ ràng, nhờ vậy các thành phần từ nhiều nhà cung cấp có thể ghép lại với nhau.
Khi bắt đầu làm việc với AUTOSAR, bạn sẽ gặp đi gặp lại vài khái niệm sau:
- Application layer: nơi chứa logic nghiệp vụ, chẳng hạn thuật toán điều khiển ga hoặc phanh.
- RTE: lớp trung gian giúp các thành phần trao đổi dữ liệu mà không phụ thuộc vào phần cứng cụ thể bên dưới.
- BSW: phần nền tảng gồm driver, quản lý bộ nhớ và các giao thức truyền thông trên mạng xe.
Hồi mới học, chúng tôi thường nhầm lẫn giữa ba lớp này, nhất là khi đọc tài liệu tiếng Anh dày đặc thuật ngữ. Cách thoát khỏi tình trạng đó khá đơn giản: chọn một tín hiệu cụ thể, ví dụ tín hiệu tốc độ xe, rồi vẽ đường đi của nó từ cảm biến đến màn hình. Vẽ đi vẽ lại vài lần, kiến trúc sẽ dần trở nên dễ hình dung.
Vì sao C/C++ vẫn là ngôn ngữ chủ lực
Thỉnh thoảng có bạn hỏi sao không dùng Python hay Java cho nhanh và dễ viết. Câu trả lời nằm ở tài nguyên phần cứng. Các vi điều khiển trong xe thường chỉ có vài trăm KB bộ nhớ và xung nhịp không quá cao. C và C++ cho phép bạn kiểm soát từng byte, từng thao tác, và điều đó rất quan trọng khi hệ thống phải phản hồi trong giới hạn thời gian nghiêm ngặt.
Tuy vậy, viết C không có nghĩa là cứ thế mà viết. Trong môi trường automotive, người ta thường tuân theo các bộ quy tắc như MISRA C để loại bỏ những cấu trúc dễ sinh lỗi. Có một lần, đội ngũ chúng tôi gặp trường hợp con trỏ bị ép kiểu không đúng cách. Đoạn code chạy hoàn toàn ổn trên máy tính để bàn, nhưng khi nạp vào vi điều khiển thật thì kết quả lệch hẳn. Từ đó, chúng tôi luôn bật cảnh báo ở mức nghiêm ngặt nhất ngay từ ngày đầu dự án.
Với C++, bạn cần thận trọng hơn nữa. Cấp phát bộ nhớ động hay cơ chế ngoại lệ thường bị hạn chế, bởi chúng khiến thời gian thực thi khó dự đoán. Nếu bạn đến từ nền C++ phổ thông, đừng vội áp dụng thói quen cũ. Hãy đọc lại xem dự án cho phép dùng những gì, rồi mới bắt tay vào viết.
Automation test trong automotive khác gì với web?
Đây là phần nhiều người mới hay bất ngờ nhất. Với web hay app, bạn có thể test bằng cách mở trình duyệt, bấm nút và kiểm tra kết quả hiển thị. Còn với automotive, việc kiểm thử diễn ra ở nhiều tầng hơn. Thường bắt đầu bằng mô phỏng phần mềm, sau đó chạy trên bo mạch thật, và cuối cùng là kiểm thử trên hệ thống đã lắp vào xe.
Đội ngũ chúng tôi hay dùng công cụ mô phỏng để chạy hàng nghìn kịch bản lỗi mà test tay không bao giờ làm hết được. Chẳng hạn, nếu kết nối CAN giữa hai ECU bị mất trong 50 mili giây thì hệ thống sẽ phản ứng thế nào? Trên bàn test tự động, bạn có thể lặp lại đúng tình huống đó hàng trăm lần chỉ trong một đêm, sáng hôm sau mở báo cáo ra xem.
Nếu muốn hiểu kỹ hơn sự khác nhau giữa hai kiểu test này, bạn có thể đọc bài sự khác nhau giữa automation test automotive và web/app. Trong đó chúng tôi giải thích chi tiết hơn về môi trường và công cụ.
Unit test và integration test theo chuẩn AUTOSAR
Một điều chúng tôi luôn nhắc người mới là đừng bỏ qua unit test. Trong AUTOSAR, từng module được kiểm thử riêng trước khi ghép vào hệ thống lớn. Làm vậy giúp bạn khoanh vùng lỗi nhanh hơn rất nhiều, vì biết ngay lỗi nằm ở module nào.
Integration test kiểm tra các module khi đã được nối với nhau thông qua RTE. Nhiều lỗi chỉ lộ ra ở giai đoạn này, ví dụ kiểu dữ liệu không khớp giữa hai thành phần, hoặc thứ tự gọi hàm bị sai. Loại lỗi này khá khó chịu vì từng module riêng lẻ đều chạy đúng. Nếu muốn phân biệt rõ hai khái niệm, bạn hãy đọc thêm unit test khác integration test trong chuẩn AUTOSAR thế nào.
Lộ trình bắt đầu cho người mới
Nếu bạn đang học năm hai hoặc năm ba ngành CNTT và muốn thử sức với mảng này, chúng tôi gợi ý đi theo thứ tự sau:
- Nắm chắc C, đặc biệt là con trỏ, cấu trúc dữ liệu và cách quản lý bộ nhớ thủ công.
- Làm quen với một bo mạch vi điều khiển phổ thông để thấy phần mềm chạy trên phần cứng thật trông như thế nào.
- Tìm hiểu tổng quan AUTOSAR qua tài liệu chính thức và các ví dụ mẫu.
- Thực hành viết unit test cho một hàm C đơn giản bằng framework như Unity hoặc CUnit.
Bạn không cần học tất cả cùng lúc. Đi từng bước, mỗi bước hoàn thành một mini-project nhỏ, sẽ hiệu quả hơn nhiều so với đọc lý thuyết suông. Trong quá trình đó, bạn sẽ dần biết mình thích phát triển phần mềm hay kiểm thử hơn. Nếu còn băn khoăn về lộ trình, bài viết lập trình embedded automotive, bắt đầu từ đâu trình bày khá chi tiết các bước này.
Vài lưu ý thực tế từ kinh nghiệm dự án
Qua nhiều dự án, chúng tôi đúc kết được vài điều đáng ghi nhớ. Thứ nhất, luôn ghi lại phiên bản tài liệu AUTOSAR bạn đang dùng, vì các bản khác nhau có thể thay đổi cấu trúc khá nhiều. Thứ hai, đừng ngại hỏi lại khi yêu cầu chưa rõ. Trong automotive, hiểu sai một yêu cầu có thể kéo theo vài tuần làm lại. Thứ ba, hãy làm quen với việc đọc log và trace, vì phần lớn lỗi liên quan đến thời gian thực không hiện ngay trên màn hình.
Nếu quan tâm các chủ đề rộng hơn trong mảng này, chúng tôi cũng đã tổng hợp những điểm dễ mắc sai lầm nhất trong bài top 5 lưu ý về công nghệ automotive và AUTOSAR. Bạn nên đọc qua trước khi đặt chân vào dự án thật.
Kết luận
Lập trình automotive không phải lĩnh vực dễ bước vào, nhưng cũng không quá xa vời nếu bạn có nền tảng C và tư duy làm việc có hệ thống. AUTOSAR cho bạn một bộ khung chung, C/C++ giúp kiểm soát phần cứng, còn automation test đảm bảo mọi thứ vận hành đúng trước khi xe lên đường.
Hy vọng bài viết giúp bạn có cái nhìn thực tế hơn về mảng này. Nếu còn thắc mắc, cứ để lại câu hỏi, đội ngũ chúng tôi sẽ cùng trao đổi thêm.


