Hỏi về Lập trình nhúng. Giúp em hiểu về nhúng với ạ
Em hiện là sinh viên năm nhất ngành CNTT ( sắp sang năm 2 tới nơi rồi ). Hiện em đang tìm hiểu về lập trình nhúng. Em Search Google thì ra quá trời các bài viết về lĩnh vực này, hiện trong đầu em đang mường tượng nhúng nó như thế này :
Nhúng chia làm 2 loại : Embedded Hardware and Embedded Software.
Cả 2 mảng này thì đều cần kiến thức điện tử cơ bản thì phải.
Em có đọc vài bài trên daynhauhoc.com và có mail cho 1 anh đang làm trong ngành này, anh ấy nói có 3 hướng đi , em xin đưa nguyên văn mail anh ấy gửi cho em dưới đây.
Em có tìm hiểu về 3 hướng này nhưng vẫn không rõ thực sự mình cần chuẩn bị những kiến thức gì để 3 năm nữa ra trường có thể làm trong lĩnh vực này. Em chỉ biết là phải năm vững C/C++, và hiện tại thì em cũng chỉ biết những kiến thức cơ bản của 2 ngôn ngữ này và áp dụng 1 chút vào lập trình 8051.
Vậy em đăng bài này mong các tiền bối chỉ dạy em cho em hiểu về các thông tin mà em được tiếp cận ở trên, để em biết làm sao để trở thành 1 Embedded SoftWare Engineer. Bởi em không biết gì về điện tử cơ bản vì nguyên năm nhất em học toàn C/C++ cơ bản, rồi Java, Data Structures and Algorithms.
Mong các tiền bối chỉ dạy. Thật sự em đang rất cần những lời dạy bảo của các tiền bối trong lúc này. Em xin cảm ơn.
Ý kiến cá nhân:
Coi thế giới nhúng như 1 cái cây, 2 loại đối tượng có thể làm nhúng là CNTT và điện tử sẽ tiếp cận thế giới này theo 2 hướng khác nhau.
Với điện tử:
Kiến thức điện tử của họ mạnh hơn CNTT, họ bắt đầu đi từ gốc đến ngọn cây bằng việc làm việc với các MCU từ thấp tới cao (8051 > PIC, AVR >ARM) và các hệ điều hành từ đơn giản đến phức tạp (RTOS > uClinux > Linux). Tự build phần cứng của riêng mình. Đây là hướng có thể như bạn nói là Hardware.
Với CNTT:
Kiến thức về phần mềm mạnh hơn điện tử, họ lại đi ngược lại. Họ bắt đầu với việc sử dụng Linux trên máy tính, cấu hình và build các phần mềm, sử dụng các bo nhúng có sẵn OS (để che đi phần khó nuốt của điện tử) như Raspberry pi. Sau đó đi xuống các phần cứng thấp dần như modem, wifi, arduino. Chương trình cũng xuống các tầng thấp dần : App > Driver > Kernel. Đây có lẽ là hướng Software mà bạn muốn làm.
Embedded Software thì cái rất rất quan trọng là Data Structures and Algorithms. Bởi vì hiện nay rất nhiều trường đại học đào tạo ngành này, cho nên về mặt kĩ thuật, người ta hơn thua nhau ở điểm này. Vì lập trình nhúng là lập trình cho board phần cứng (những người viết tool thì mình không nói tới), mà board phần cứng thì tài nguyên hạn chế, Flash, Ram,…ít. Nên cần giải thuật tối ưu để tiết kiệm bộ nhớ và TIẾT KIỆM NĂNG LƯỢNG cho các thiết bị IoT.
Muốn trở thành Embedded Software thì cần phải biết thêm về RTOS (hệ điều hành thời gian thực) mà cái được biết tới nhiều nhất là FreeRTOS, có thể là C, C++, C#, các framework như Qt, … biết Python, Bash Shell, … nói chung là phải biết viết tool và viết script.
Muốn làm về IoT (Internet of Things) thì phải biết về lập trình mạng, phải biết lập trình socket, biết thế nào là giao thức HTTP, cách gửi các package, WIFI, Zigbee,… nói chung là network
Muốn làm về embedded linux thì như mail ở trên của bạn là một hướng.
Bạn có thể lên các trang tìm việc gõ embedded software thì bạn sẽ thấy yêu cầu của họ.
Và cuối cùng, mình khuyên bạn. Trước khi ra trường, bạn good at English (tệ nhất là giao tiếp cơ bản và đọc tài liệu kĩ thuật) mới có thể vô được mấy công ty lớn để intern.
e search thì thấy họ toàn nói chung chung kiểu " nắm chắc C/C++ hoặc embedded " @@, chẳng hiều gì luôn, chỉ biết mỗi cần học chắc C/C++, mà C/C++ ở trường thì dạy toàn cơ bản, k thao tác bit byte quái gì hết.
Kiến thức phần mềm là sao anh ? e thấy n chỉ có C/C++ và CTDLGT thôi mà. Linux là OS, build Software cũng k trên linux cũng k khó lắm.
E chưa hiểu chỗ này, a cho e xin cái link để tìm hiểu vấn đề này với. App > Driver > Kernel. Lập trình nhúng cũng có App ạ ? e tưởng lập trình nhúng là lập trình cho các VDK, VXL chứ nhỉ, à mấy cái ấy thì APP j ạ ? Driver và Kernel thì e có đọc vài bài, nhưng chỉ biết Lập trình Driver để giao tiếp các thiết bị ngoại vi với phần cứng của mình, Kernel thì nó là Nhân gì gì ấy, a nói cho e nghe mấy cái này với.
Ví dụ người ta kêu là nắm chắc C/C++, thì có nghĩa là bạn phải nắm rất rõ các kiến thức như con trỏ, struct, đệ quy, có thể là lập trình hướng đối tượng nữa … Đặc biệt là con trỏ nha, học kĩ con trỏ, con trỏ cấp 1, cấp 2, con trỏ hàm,… Học IT hay kĩ thuật nói chung, đòi hỏi bạn phải tự học rất nhiều. Bạn cứ yên tâm, khi bạn vào chuyên ngành, bạn sẽ được làm đồ án. Lúc đó mới là lúc bạn thực sự phải tự học, đừng nhờ người khác làm dùm hoặc copy của người khác.
Việc bạn thao tác với bit byte, thì chính là lúc bạn lập trình với vi điều khiển đó. Thường dùng các toán tử như: , >> (dịch phải), << (dịch trái), | (OR), & (AND), ^(XOR).
Đúng là lập trình nhúng thì lập trình cho vi điều khiển, vi xử lý, khi người ta muốn xay dựng một hệ thống mạnh mẽ hơn, người ta sẽ làm hẵn một “máy tính nhúng”. Ví dụ một board ARM, có thêm bộ nhớ Flash + các ngoại vi, thì có thể build hẵn một hệ điều hành cho nó. Thường thấy nhất là Ubuntu, và đây là một hệ điều hành không hề có giao diện (GUI). Người dùng muốn xử lý trên hệ điều hành này thì phải kết nối board qua serial port (thường là UART) để có thể thực hiện các command line trên terminal.
Lập trình Driver là để giao tiếp với ngoại vi. Vậy làm sao để bạn có thể điều khiển việc giao tiếp ngoại vi này, thì phải dùng đến APP, ví dụ bạn muốn theo dỏi camera thông qua một giao diện web, thì bạn phải viết được giao diện web này. hay muốn điều khiển board qua một app android thì bạn phải viết app android. Đây người ta hay gọi là lập trình ở lớp cao nhất (application).
anh có thể kể em một vài sản phẩm của 2 hướng embedded software và e-hardware mà họ tạo ra được không ạ
Bạn mới chỉ là năm nhất. Mình thực khuyên bạn nên bỏ 3 năm đầu tiên chỉ tập trung học tiếng anh cho thật tốt. Đến năm thứ 4, 5 quyết định theo hướng nào vẫn chưa muộn.