Những kiến thức nào cần có để học Embedded System?

Câu hỏi này chắc là bạn muốn hỏi cách tự học, Đạt sẽ trả lời theo hướng tự học.

Học embedded không khó, cái khó là nó yêu cầu nhiều kiến thức ban đầu để có thể bắt đầu làm việc. Đạt làm Embedded Linux nên chỉ có thể đưa ra một số tài liệu có thể tự học Embedded Linux như sau.


Để làm Embedded Linux thì bạn cần phải hiểu về Linux, chọn một distro linux nào đấy mà bạn thấy thích rồi dùng thử. Đạt có viết một trả lời về việc cài đặt Linux cho người lần đầu tiên mới sử dụng.

Để tăng tốc độ học Linux và cũng là một yêu cầu cơ bản để trở thành một Embedded Linux Developer bạn phải biết sử dụng command line và viết Shell Script. Quyển The Linux Command Line hướng dẫn bạn rất chi tiết và cơ bản về cách sử dụng Linux Command Linux, chính xác là trên Ubuntu.

Để hình dung công việc của một Embedded Linux Programmer phải làm hàng ngày bạn nên đọc Embedded Linux Primer: A Practical Real-World Approach (2nd Edition). Quyển này cho bạn khái niệm cơ bản về thế giới Embedded Linux bao gồm Linux cơ bản, cách hệ thống boot, các script được gọi, cách load firmware, cách debug và một số vấn đề chi tiết nho nhỏ khác.

Bạn cần phải biết cách build một hệ thống nhúng, cách tốt nhất là sở hữu một cái board và thực hành. Mình may mắn được học Embedded thông qua công việc hàng ngày nên không phải mua board về thực tập. Để tự học thì bạn có thể mua BeagleBone và thực thành với Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux

Sau khi build được hệ thống, bạn phải viết chương trình cho hệ thống nhúng. Tùy vào mức độ công việc mà bạn cần những kỹ năng khác nhau. Nhưng về cơ bản, bạn cần phải biết C. Nếu bạn chưa biết gì về C thì nên đọc C Primer Plus (6th Edition) (Developer’s Library), nếu bạn đã có cơ bản về lập trình, đọc thêm quyển The C Programming Language

Để lập trình trên Linux, đặt biệt là Embedded Linux có bao gồm Device Driver, bạn phải hiểu cách Kernel hoạt động. Linux Kernel Development (3rd Edition) sẽ cho bạn kiến thức về Kernel, bên cạnh đó một số quyển sách sau sẽ bổ sung thêm kiến thức cho bạn

Hoặc học khóa học CS6210: Advanced Operating Systems

Học Embedded Linux không khó, nó chỉ khó ban đầu

Học Android sẽ dễ hơn ở bước đầu, bạn không cần nhiều kiến thức về Android vẫn có thể viết ứng dụng đầu tiên, sau đó độ khó sẽ tăng dần. Để master, bạn phải bỏ ra rất nhiều công sức.

Học Embedded Linux sẽ khó hơn, vì bạn cần phải hiểu rất nhiều thứ mới có thể viết được “hello world”. Có thể thấy bước đầu sẽ khó, nhưng về sau sẽ dễ hơn.

Nhưng không có nghĩa là Android hay các ngành khác dễ hơn, nếu có thì chỉ là dễ hơn lúc đầu.

46 Likes

Ngoài C thì Assembly có giúp ích gì không?

Có nhưng không nhiều, Assembly được dùng rất ít ngày nay kể cả trong hệ thống nhúng.

4 Likes

Cảm ơn anh đã chia sẽ những góp ý quan trọng này. :grinning: Hiện tại em chỉ có kiến thức nền về Vi điều khiển và nguyên lý hoạt động của phần cứng, Còn về ngôn ngữ C thì cũng tàm tạm. Vì em thấy bên hệ thống nhúng phải học thêm Linux. Trước đây em học cũng có thực hành trên KIT nhưng chỉ build trên hệ điều hành OS, vậy em sẽ học thêm Linux . Tks anh! :blush:

1 Like

câu trả lời của anh @ltd quá đầy đủ rồi, mình bổ sung thêm là nếu ở trường bạn không được học về Operating System thì mình khuyên bạn kiếm sách đọc hoặc kiếm course trên coursera hay udacity học về OS. Mình cũng đang học nhúng linux nhưng lúc trước học điện tử không được học OS nên chả biết mấy khái niệm như thread, process, deadlocks này nọ

2 Likes

Đạt mới bổ sung thêm khóa học CS6210: Advanced Operating Systems theo gợi ý của @mrmike612 :+1:

2 Likes

Mình cũng đang theo ngành này. Mình có thể liên lạc với bạn qua facebook hay skype ?

1 Like

Xin chào!
Em đang đinh hướng học và làm về nhúng sau khi ra trường, hiên nay em đang là sinh viên năm cuối ngành cơ điện tử.
Em có tìm hiểu về nhúng nhưng còn nhiều cái chưa rõ.
Em muốn mua board về thực hành cũng để làm đồ án tốt nghiệp, em nên mua board gì hợp lý để học.
Ngoài ra em nên học trên Fedora, ubuntu…?
Một vấn đề nữa, em không học IT, nên cũng khá mông lung khi định hướng qua nhúng, có anh chị nào hiện đang làm nhúng mà xuất phát không từ IT không ạ, có thể chia sẻ cho em môt vài kinh nghiệm, cũng là để em thấy vững tin hơn!
Em cảm ơn!

ở post #3 ltd nói rồi mà:

Về lập trình thì tuỳ nền tảng, tuỳ phần cứng nhưng đều phải biết ASM, C và có thể cả C++.
Nếu biết về phần cứng có thể tự xây dựng hệ thống cho riền mình. Nếu không thường phải sử dụng phần cứng có sẵn và lệ thuộc vào nó.

2 Likes

Dạ em cảm ơn anh.
vẫn còn 1 vấn để em cũng đang rất tò mò đó là.
“Một vấn đề nữa, em không học IT, nên cũng khá mông lung khi định hướng qua nhúng, có anh chị nào hiện đang làm nhúng mà xuất phát không từ IT không ạ, có thể chia sẻ cho em môt vài kinh nghiệm, cũng là để em thấy vững tin hơn!”
anh Long có thể cho em biết cơ hội cho người không học IT làm nhúng? Anh đã gặp nhiều người như vây chưa a, lơi thế và bất lợi của những người anh chị đó.
Em cảm ơn anh.

Mình cũng không học IT và cũng không làm IT nên không rõ, chờ bạn khác trả lời :joy:

Nhúng với IT thì hơi nhọc vì trang bị ít kiến thức.
Và thường là phát triển phần mềm dựa vào nền tảng phần cứng nào đó (thường tương đối khủng để chạy được OS nào đó ). Những nền tảng khác thường khó làm hơn.

1 Like

Em chào anh, em cũng đang tìm hiểu về hệ thống nhúng.
Em có thể liên lạc với anh như thế nào?
Mail của em: [email protected]

Em đang là sinh viên năm 2 hệ Việt Nhật Bách Khoa Hà Nội, đọc xong các bài viết của anh em thấy tràn đầy động lực học tập :slight_smile: cảm ơn anh rất nhiều ạ! mong anh chỉ giáo nhiều hơn ạ!

2 Likes

@ltd
Anh Đạt cho em hỏi : Embedded Linux thì có khác so với Unix không ạ , em muốn làm vè Linux , nhưng đọc quyển ANSI C phần cuối lại nói về Unix , không biết là đọc cái Unix thì cách thức hoạt động có tương tự như bên Linux k ạ ? :grinning:

Tương tự đấy, nhưng dù tương tự thì cũng phải khác chỗ này chỗ kia. Có điều học lập trình thì không quan trọng là nền tảng hay kiến thức mình có. Cái chủ yếu là khả năng tiếp thu cái mới. Thế nên đừng quan tâm lắm về việc này :slight_smile:

3 Likes

@ltd Hiện tại, em sử dụng thành thạo các loại vi điều khiển. Với embedded linux, em có thể lập trình C được. Anh có thể tư vấn kĩ hơn cho em về lộ trình để phát triển tiếp trong lĩnh vực này không ạ. Mục tiêu của em là có thể build được được linux, lập trình driver, app cho một board bất kì. Em cảm ơn anh ạ :slight_smile:

1 Like

anh ơi, anh làm 1 bài chi tiết về vấn đề này đi ạ. đọc thấy hấp dẫn quá. :smiley:

2 Likes

Sau một thời gian ngâm cứu với lĩnh vực Embedded. Mình xin chia sẽ một số features như sau:

Một kỹ sư, hay một ai muốn theo ngành này thì mình sẽ chia ra thành các mảng để mọi người dễ hình dung:

  1. Platform
  2. Conectivity
  3. Cloud
  4. Security

I. Platform
1.1. Hardware
VD:
MCU: PIC, AVR, ARM, 8051, …
Board: Raspberry pi, Arduino, mbed, …
=> Nếu mình cần lập trình cho con nào thì phải tìm hiểu qua datasheet của chúng

1.2. Software
1.2.1. Driver Stack:
Hay còn gọi là Device Driver: như TCP/IP, I2C, SPI, USB, CAN, …
=> Driver Stack sẽ được chia thành 2 tầng chính

  • Tầng HAL: tầng này sẽ lập trình theo từng dòng vi điều khiển, tần này gần với phần cứng nhất
  • Tầng API: Tâng này là tầng common sẽ dùng để gọi tầng HAL phía dưới

1.2.2. OS (Hệ điều hành)
Hệ thống nhúng có thể ko cần phải dùng tới hệ điều hành. Nhưng đa số các ứng dụng ngày nay cần phải xữ lý nhiều chức năng, cũng như cần có sự tin cậy và độ ổn định cao,đáp ứng thời gian thực thì cần phải có hệ điều hành (OS)

  • Trong các hệ thống lớn hay người ta thường dùng linux OS
  • Ngày nay OS rất đa dạng, mà đặc biệt là các OS thời gian thực và tương lai sẽ hướng tới OS thời gian thực có tính nhỏ gọn để ướng dụng trong IoT
    VD: VxWord, RTX, Free RTOS, micro kernel, Tkernel, contiky, …

II. Conectivity
Các thiết bị cần phải liên lạc với nhau: wire and wireless

  • Wire: Dùng mạng lan (TCP/IP protocol)
  • Wireless: rất đa dạng
    VD: Wifi, Bluetooth, Cellurla, Zigbee, RF, …
    Mỗi loại có một giao thức riêng:
    VD:
  • Wifi: TCP/IP (IPv4 and IPv6), 6loWPAN
  • Bluetooth: GAP, GATT.

III. Cloud
Embedded ngày nay, Cloud rất quan trọng trong trong việc quản lý, điều khiển thiết bị từ xa.
Một số giao thức có thể thấy là: HTTP, CoAP, Lighweight M2M, …

IV. Security
Bảo mật thông tin là một phần không thể thiếu trong thời đại thông tin ngày nay: Một hề thống có tín bảo mật cao sẽ đem lại sự an toàn cho người dùng.
Khái niệm bảo mật được biết đến trước đây trong embedded là TLS (Transport Layer Security), và trong IoT là DTLS (đang phát triển)

Trên đây là một số khái niệm tổng quan về Embedded mà mình biết. Vì chưa có kinh nghiệm nhiều trong lĩnh vực này nên vẫn còn nhiều thiếu sót. Mình cũng đang học hỏi thêm

Ai có nhiều kinh nghiệm trong lĩnh vực này có thể chia sẽ cho mọi người được học hỏi thêm nhé!

21 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?