Tự học lập trình nhúng - tài liệu và hướng học

Tự học lập trình nhúng - tài liệu và hướng học

 
Học lập trình nhúng tạm mình chia làm 2 phần, và mỗi phần điều có các yêu cầu về KIẾN THỨC & KĨ NĂNG riêng:
  • 1. Lập trình: Lập trình nhúng đa phần sử dụng C/C++ để phát triển ứng dụng, việc hiểu sâu về ngôn ngữ và hoạt động của trình biên dịch là rất quan trọng. 
  • 2. Nhúng: Các kiến thức liên quan đến sử dụng ngoại vi của vi điều khiển, hệ điều hành thời gian thực RTOS, hệ thống Linux, các design partten dành cho embedded system.
 

1. Kiến thức và kĩ năng lập trình

Hệ thống nhúng, đa phần sử dụng ngôn ngữ C/C++ để lập trình, đối với các bạn học các ngành điện tử, điện tử viễn thông, tự động hóa thường không có thế mạnh lập trình, do lượng kiến thức xung quanh bộ môn lập trình rất ít, thời lượng thực hành lập trình cũng hạn chế nên khó xây dựng cho mình tư duy lập trình tốt. 
 
Càng ngày, hệ thống nhúng ngày càng phức tạp, lượng code ngày càng lớn. Để phát triển ứng dụng nhúng lập trình viên hay làm việc trên các SDK (Software Development Kit), SDK tổ chức thành các lớp khác nhau, và thường người lập trình sẽ viết ở lớp ứng dụng trên cùng (Application Layer), việc nắm được các Design Pattern của SDK là rất quan trọng để phát triển nhanh ứng dụng.
Tham khảo chuỗi bài viết ở link sau để hiểu rõ ý trên hơn: Tự nghiên cứu kiến thức cơ bản về hệ điều hành thời gian thực - RTOS
 
Để nâng cao kĩ năng lập trình, ngoài các kiến thức và kĩ năng liên quan đến ngôn ngữ lập trình C/C++, các kiến thức xung quanh như cấu trúc dữ liệu và thuật toán cũng như tư duy lập trình cũng cần được rèn luyện thêm, thầy Tùng trường khoa học tự nhiên có mở khóa học này, sau khóa học tư duy lập trình của các bạn sẽ cải thiện rất đáng kể: https://bigocoding.com/
 
Quay lại về kiến thức C/C++, việc nắm vững kiến thức về memory, address và pointer là rất cần thiết, khi nào có thời gian mình sẽ có 1 bài viết về chủ đề này sẽ đơn giản và dễ hiểu. Về phần này có một môn của trường đại học Stanford dạy khá dễ hiểu là: https://www.youtube.com/watch?v=Ps8jOj7diA0 , các bạn học con trỏ (Pointer), nhưng mơ hồ là do phần memory và address thường chỉ được giới thiệu sơ qua xong vào học pointer.
Học C, bạn cần nắm thêm 1 phần cũng rất quan trọng để có thể nắm được cấu trúc của các source lớn đó là hướng đối tượng trong C, nghe có vẻ lạ nhỉ ? Nếu các bạn lập trình vi điều khiển nên xem và thực hành, Link hướng dẫn chi tiết cho phần này: https://www.state-machine.com/oop 
 
Việc hiểu rõ các hoạt động của Startup Code, phân vùng bộ nhớ trên Linker file cũng là khác biệt giữa lập trình nhúng và phần còn lại, kiến thức này rất quan trọng đối với các bạn làm sản phẩm production cho các công ty. Các bạn có thể tham khảo tại: AK Embedded Base Kit - STM32L151 - Application Startup Code
 

2. Kiến thức và kĩ năng về hệ thống nhúng

Đa phần, các chương trình học hiện tại ở VN tập trung chính vào học sử dụng ngoại vi, TIMER, UART, SPI,... và hiện nay có xu hướng sử dụng các trình generate code, như Cube MX, tùy vào dòng chip.
Việc tiếp cận nhúng theo phương pháp này ban đầu tạo sự hào hứng ban đầu tốt, code và chạy thực tế rất nhanh, tuy nhiên khi làm các dự án thực tế việc thiếu các kiến thức cơ bản sẽ là rào cản rất lớn.
Dự án thực tế tùy thuộc vào nhu cầu sản phẩm sẽ lựa chọn loại chip và compiler khác nhau. cũng như effort thực sự khi làm dự án thực tế là xử lý các issue phát sinh.
Kiến thức cơ bản cần nhiều thời gian để học và thực hành, doanh nghiệp cần nhiều thời gian hơn để trainning nhân sự. Hiện tại việc embedded đa phần nằm ở công ty outsource, lực lượng fresher thường ưu tiên tuyển từ các lớp học nội bộ của công ty như FPT academy, hơn là từ các trường đại học.
 
Một chương trình học nhúng vi điều khiển mình thấy khá sát với thực tế dự án, cũng như bao quát nhiều vấn đề là chương trình tranning của state-machine.com:
Trong khóa học này có 1 nội dung rất quan trọng là hướng dẫn các bạn tự viết 1 hệ điều hành thời gian thực RTOS, việc tự viết RTOS giúp các bạn hiểu sâu các hoạt động bên trong RTOS, việc sử dụng các RTOS bản thương mại khi đi làm thực tế như FreeRTOS, Zephyr,... sẽ dễ dàng hơn rất nhiều.
 
state-machine.com cũng giới thiệu cho bạn các kiến thức nâng cao giúp các bạn tổ chức được các dự án phức tạp thông qua event-driven programing, các loại state-machine,... Nếu đã từng làm việc qua các SDK về Zigbee, BLE,... các bạn để ý gần như tất cả stack trên đều sử dụng mô hình event-driven, tùy từng hãng sẽ xây dựng các mô hình khác nhau.
 
Debug trong hệ thống nhúng vi điều khiển có nhiều điểm khác biệt so với các loại lập trình khác, khác biệt chủ yếu là do giới hạn bộ nhớ của MCU (vi điều khiển):
  • Đối với sản phẩm đang chạy thực tế: bạn cần có các phương pháp ghi log đặc biệt, việc ghi log không làm ảnh hưởng đến các task vụ thực thi của thiết bị.
  • Đối với sản phẩm đang trong quá trình dev: Các kĩ năng debug trên trình debug, cũng như sử dụng Logic Analyzer,... 
Debug nội dung khá dài và phức tạp mình sẽ chia sẻ ở các bài viết khác.
 

3. Thực tập càng sớm càng tốt

Nếu bạn là sinh viên thì nên đi thực tập càng sớm càng tốt, không lương cũng được, cốt là tiếp xúc với môi trường làm việc thực tế để học cho tập trung và chủ động, học chủ động chắc chắn các bạn sẽ học nhanh hơn, vì nhu cầu muốn hiểu kiến thức đó thực sự.
Trong một môi trường làm việc IT, có rất nhiều vai trò trong một dự án, nên các bạn yên tâm apply nha, không phải code tốt mới có cơ hội, cứ kiên trì apply CV nhiều công ty nhiều chổ, các giai đoạn bên dưới dành cho các bạn có nỗ lực, và học nghiêm túc:
  • Hè năm nhất các bạn có xin thực tập làm tester chẳn hạn, làm dịch phụ đề tiếng anh cho phim để nâng cao ngoại ngữ,.... (Giai đoạn tìm hiểu)
  • Hè năm 2 nên xin được việc thực tập mà dính đến chuyên ngành xíu để có cơ hội tiếp xúc được các anh đang làm việc và được sự chỉ dẫn của các anh có kinh nghiệm (Giai đoạn định hướng)
  • Hè năm 3 cũng tiếp tục xin thực tập ở các vị trí & chuyên môn mình muốn phát triển: Embedded MCU, Embedded Linux, Embedded Android, Qt App,... (Giai đoạn chuyên môn hóa)
  • Hè năm 4 cũng là đợt thực tập cuối trước khi ra trường, với kinh nghiệm các năm trước đó thì có thể xin thực tập vào các dự án Development với có chuyên môn, và sẵn sàng nhận việc sau khi ra trường. (Giai đoạn chuẩn bị đi làm)
Bạn mà làm như trên thì mình đảm bảo CV của bạn sau khi ra trường sẽ được chấp nhận ở tất cả các chổ có nhu cầu.
 
Khoảng thời gian 4 năm đại học thực sự là khoảng thời gian rất quý để học và trải nghiệm, sau khi đi làm để thu xếp thời gian học thêm như thời còn đại học là rất khó, cả này đi làm mệt, tối học thêm nữa thì bạn phải có động lực hoặc đam mê rất lớn.
 

Lựa chọn tốt hơn nỗ lực

Bạn nỗ lực học đến mấy nhưng không đúng định hướng, không theo nhu cầu của thị trường lao động thì kết quả đạt được sẽ không như ý. Đến một lúc nào đó nhìn lại, sức khỏe và mức độ tập trung của bạn giảm, trên vai với nhiều trách nhiệm hơn, thay đổi sẽ là quyết định rất khó khăn, bạn sẽ thấm thía câu nói trên.
Hãy đi ra ngoài càng sớm càng tốt để có sự lựa chọn đúng đắn, và sau đó nỗ lực với sự lựa chọn của mình.
 
Hiện tại ngành nhúng đang hot với các nhu cầu ở các mảng Automotive và IoT, nhu cầu việc làm là rất lớn, chúc các bạn học tốt và tìm được công việc phù hợp.
 
Các bạn tham khảo thêm các bài viết lập trình nhúng nâng cao tại: AK Embedded Software
 
Các câu hỏi hay thắc mắc các bạn gửi về: