Giáo Trình Cơ Sở Lập Trình Nhúng – Phạm Văn Hà (Chủ Biên), Nguyễn Thành Hải

Tổng quan về giáo trình

Giáo trình Cơ sở lập trình nhúng do TS. Phạm Văn Hà (chủ biên) cùng ThS. Nguyễn Thành Hải biên soạn, được Nhà xuất bản Thống kê ấn hành năm 2019. Tài liệu được thiết kế nhằm phục vụ chương trình đào tạo bậc đại học chuyên ngành Công nghệ thông tin tại Khoa Công nghệ thông tin, Trường Đại học Công nghiệp Hà Nội. Trong sơ đồ đào tạo, học phần này đóng vai trò bản lề, tiếp nối sau các môn học nền tảng là Kiến trúc máy tính và Kỹ thuật lập trình, đồng thời cung cấp kiến thức tiền đề để sinh viên tiếp thu học phần chuyên sâu Lập trình nhúng ở giai đoạn kế tiếp.

Mục tiêu học tập (learning outcomes) của giáo trình tập trung vào việc trang bị cho người học:

  1. Hệ thống khái niệm và nguyên lý hoạt động của các hệ thống máy tính nhúng;
  2. Đặc trưng cú pháp và kỹ thuật tối ưu hóa mã nguồn C chuyên biệt cho môi trường tài nguyên hạn chế;
  3. Kiến trúc vi xử lý 32-bit ARM Cortex-M4 thông qua dòng vi điều khiển thương mại STM32;
  4. Kỹ năng thiết lập phần cứng, cấu hình thanh ghi và lập trình điều khiển các khối ngoại vi cơ bản trên KIT vi điều khiển thực tế.

Cấu trúc giáo trình gồm 5 chương, được tổ chức theo phương pháp tiếp cận từ vĩ mô đến vi mô: khởi đầu từ bức tranh tổng quan của ngành kỹ thuật nhúng, phân tích các thành phần phần cứng/phần mềm, chuẩn hóa kỹ thuật lập trình C nhúng, đi sâu vào kiến trúc vi điều khiển ARM Cortex-M4 và kết thúc bằng việc triển khai ứng dụng thực hành trên dòng chip STM32F407VGT6. Điểm đặc sắc của tài liệu là việc giải quyết mối liên kết giữa kiến trúc phần cứng máy tính và kỹ thuật lập trình phần mềm cấp thấp, hướng dẫn sinh viên phân tích bản chất mã máy Assembly được sinh ra từ trình biên dịch C trên thanh ghi vi xử lý.


Nội dung kiến thức cốt lõi

Các chương và chủ đề chính

Giáo trình phân bố nội dung qua 5 chương chuyên đề:

  • Chương 1: Tổng quan về các hệ thống nhúng (trang 9–18): Trình bày các định nghĩa học thuật về hệ thống nhúng; lược sử phát triển từ hệ thống máy tính dẫn đường Apollo (Apollo Guidance Computer) của Charles Stark Draper tại MIT, máy tính Autonetics D-17 trên tên lửa Minuteman II (1961), vi xử lý thương mại Intel 4004 đến sự hình thành vi điều khiển đơn chip thập niên 1980. Chương này phân tích các thuộc tính vận hành (độ tin cậy, hiệu quả tài nguyên, kích thước mã, năng lượng), phổ ứng dụng (ô tô có từ 60 đến hơn 100 vi điều khiển, hàng không, y tế, hệ chứng thực SMARTpen) và xu hướng tính toán khắp nơi (Ubiquitous/Pervasive computing), Internet of Things (IoT).
  • Chương 2: Các thành phần chính của hệ thống nhúng (trang 19–35): Phân loại phần cứng gồm máy tính nhúng (CPU, MCU, DSP), các kiến trúc xử lý (ARM, MIPS, x86, PIC, 8051, AVR...), cảm biến (tương tự, số) và cơ cấu chấp hành. Phân tích chi tiết nguyên lý lấy mẫu, lượng tử hóa của bộ chuyển đổi tương tự - số (ADC), cấu tạo mảng điện trở của bộ chuyển đổi số - tương tự (DAC). Về phần mềm, chương phân định rõ ba tầng: trình điều khiển thiết bị (architecture-specific và generic), nhân hệ điều hành (kernel quản lý tiến trình, ngắt, bộ nhớ, vào/ra) và phần mềm trung gian (middleware hướng thông điệp MOM, RPC, JVM).
  • Chương 3: Ngôn ngữ C cho các hệ thống nhúng (trang 36–55): Phân tích lý do chọn ngôn ngữ C làm ngôn ngữ trung gian ("Assembly bậc cao"); các bước xây dựng dự án nhúng (tạo dự án, thiết lập tham số, viết mã, biên dịch, mô phỏng ảo, nạp mạch và gỡ lỗi trên KIT). Phân loại 4 mô hình cấu trúc chương trình nhúng: siêu vòng lặp (super loop/polling), super loop cải tiến, cấu trúc điều khiển bằng ngắt (interrupt-driven) và cấu trúc lai (hybrid). Khảo sát hệ thống kiểu dữ liệu chuẩn (int8_t đến uint32_t), kỹ thuật sử dụng từ khóa volatile và các phép toán thao tác trên bit (set, reset).
  • Chương 4: Kiến trúc dòng vi điều khiển ARM Cortex-M4 và họ STM32 (trang 56–67): Giới thiệu kiến trúc tập lệnh RISC của ARM; cơ cấu phân nhánh của họ vi điều khiển STM32; cấu hình phần cứng của vi điều khiển STM32F407VGT6 và sơ đồ khối KIT phát triển STM32F4Discovery.
  • Chương 5: Lập trình với vi điều khiển STM32 (trang 68–122): Hướng dẫn ứng dụng thư viện chuẩn CMSIS (Cortex Microcontroller Software Interface Standard) và công cụ phát triển phần mềm; kỹ thuật cấu hình các cổng vào/ra (GPIO); thiết lập thời gian định thời qua bộ đếm SysTick timer; lập trình ngắt ngoại vi (EXTI) kết nối nút bấm; lập trình các bộ định thời (Timer); kỹ thuật phát xung điều chế độ rộng xung (PWM) và các thao tác đọc/ghi dữ liệu trên bộ nhớ Flash nội.

Progression logic (tiến trình phát triển nội dung) đi từ nhận thức hệ thống (Chương 1–2), chuyển sang công cụ ngôn ngữ và kỹ thuật tối ưu hóa mã nguồn (Chương 3), sau đó định vị vào một kiến trúc phần cứng chuẩn tắc (Chương 4) và kết thúc bằng việc lập trình điều khiển trực tiếp từng khối ngoại vi (Chương 5).

Kiến thức nền tảng được xây dựng

Giáo trình xây dựng hệ thống tri thức thông qua các lý thuyết và nguyên lý kỹ thuật:

  • Mô hình kiến trúc máy tính: So sánh sự khác biệt giữa kiến trúc von Neumann (bộ nhớ dữ liệu và bộ nhớ chương trình dùng chung một bus) và kiến trúc Harvard (hệ thống bus dữ liệu và bus chương trình tách biệt, gia tăng băng thông và hỗ trợ thực thi kỹ thuật đường ống - pipeline hiệu quả).
  • Nguyên lý chuyển đổi tín hiệu vật lý: Thiết lập điều kiện lấy mẫu tín hiệu tương tự dựa trên định lý lấy mẫu ($f_s \ge 2f_{max}$), cơ chế nhớ mẫu, lượng tử hóa và mã hóa nhị phân trong bộ ADC; nguyên lý mạch mảng điện trở và các chỉ tiêu sai số toàn thang (full-scale error), sai số tuyến tính (linearity error), thời gian ổn định (settling time) trong bộ DAC.
  • Thuộc tính tin cậy của hệ thống: Mô hình hóa 5 tiêu chuẩn an toàn kỹ thuật: Reliability (độ tin cậy), Maintainability (khả năng bảo trì), Availability (độ sẵn sàng), Safety (an toàn vận hành) và Security (bảo mật dữ liệu).
  • Khung kiến trúc phần mềm phân tầng: Cấu trúc hệ thống phần mềm nhúng bao gồm Hardware Layer, Device Driver Layer (phân định rõ generic driver và architecture-specific driver), Operating System Layer / Middleware Layer và Application Software Layer.

Kỹ năng phát triển

Nội dung giáo trình trang bị cho sinh viên các nhóm kỹ năng thực hành:

  • Kỹ năng kỹ thuật (Technical skills): Thành thạo các phép toán xử lý bit trực tiếp trên thanh ghi (VAR |= (1 << n), VAR &= ~(1 << n)); sử dụng từ khóa volatile để kiểm soát các ô nhớ phần cứng và biến dùng chung giữa tiến trình chính với ngắt ngắt (ISR); cấu hình thanh ghi ngoại vi GPIO, Timer, EXTI, PWM và Flash thông qua thư viện CMSIS.
  • Kỹ năng phân tích (Analytical skills): Phân tích mã nguồn Assembly sinh ra từ trình biên dịch C (so sánh việc dùng biến lặp kiểu 8-bit char gây phát sinh lệnh ép kiểu AND r1, r1, #0xff so với việc dùng biến kiểu 32-bit unsigned int giúp loại bỏ lệnh thừa và giảm 10% dung lượng mã); đánh giá dung lượng bộ nhớ RAM/ROM và thời gian đáp ứng thời gian thực của hệ thống.
  • Kỹ năng ứng dụng thực tế (Practical competencies): Vận hành chu trình toolchain phát triển phần mềm nhúng hoàn chỉnh: cấu hình project trên IDE, biên dịch, nạp phần mềm qua cổng nạp mạch và gỡ lỗi trực tiếp trên bo mạch phần cứng KIT STM32F4Discovery.

Phương pháp giảng dạy và học tập

Giáo trình triển khai phương pháp sư phạm kết hợp giữa diễn dịch nguyên lý và thực nghiệm kỹ thuật:

  • Phương pháp sư phạm: Nội dung bài giảng kết hợp song song giữa việc mô tả kiến trúc vi xử lý và phân tích các trường hợp mã nguồn C thực tế. Mỗi khái niệm lý thuyết (như cơ chế ngắt, lấy mẫu ADC, bộ định thời) đều được minh họa bằng sơ đồ khối, mã nguồn C tương ứng và kết quả biên dịch sang mã máy Assembly.
  • Bài tập và nghiên cứu tình huống (Case studies): Hệ thống câu hỏi cuối mỗi chương yêu cầu sinh viên giải quyết các vấn đề kỹ thuật mang tính thực tế: phân biệt sự khác nhau giữa vi xử lý (CPU), vi điều khiển (MCU) và bộ xử lý tín hiệu số (DSP); giải thích hiện tượng trình biên dịch tự ý xóa mã kiểm tra biến khi bật chế độ tối ưu hóa (optimization) nếu không có từ khóa volatile; phân tích cấu trúc điều khiển hệ thống bằng ngắt qua hàm IRQHandler().
  • Bài tập thực hành: Chương 5 cung cấp các bài thực hành chi tiết theo từng mô-đun: lập trình xuất tín hiệu số điều khiển hệ thống LED đơn qua cổng GPIO; thiết lập cơ chế định thời chính xác bằng SysTick timer; lập trình bắt sự kiện nút nhấn thông qua ngắt ngoài; tạo dạng sóng PWM điều khiển thiết bị; đọc và ghi cấu hình tham số hệ thống vào ô nhớ Flash nội của vi điều khiển.
  • Phương pháp đánh giá: Giảng viên sử dụng hệ thống câu hỏi cuối chương để đánh giá kiến thức lý thuyết kiến trúc phần cứng, kết hợp đánh giá thực hành thông qua các bài tập lập trình nạp mạch, kiểm tra độ chính xác của tín hiệu điều khiển trên KIT thí nghiệm.
  • Hướng dẫn tự học: Sinh viên cần chuẩn bị môi trường lập trình IDE phù hợp, thực hiện từng bước cấu hình dự án theo sơ đồ quy trình trong Chương 3. Khi viết mã nguồn, người học được hướng dẫn mở cửa sổ dịch mã Assembly của trình biên dịch để quan sát trực tiếp số lượng lệnh máy sinh ra, từ đó hình thành tư duy tối ưu hóa tài nguyên phần cứng.

Điểm nổi bật và cập nhật

  • Chuyển dịch sang kiến trúc vi điều khiển 32-bit: Khác với các tài liệu truyền thống tập trung vào các dòng vi điều khiển 8-bit thế hệ cũ (như họ 8051, PIC hoặc AVR), giáo trình cập nhật hoàn toàn sang kiến trúc ARM Cortex-M4 32-bit. Đây là nền tảng xử lý tiêu chuẩn trong các hệ thống nhúng hiện đại nhờ hiệu năng cao, tập lệnh Thumb-2 và khả năng xử lý dấu phẩy động.
  • Phản ánh tỷ trọng thực tế của công nghệ phần mềm nhúng: Giáo trình chỉ ra sự dịch chuyển cơ cấu chi phí trong phát triển hệ thống nhúng hiện đại: tỷ trọng chi phí phần cứng giảm xuống còn khoảng 5%, trong khi chi phí phát triển phần mềm chiếm tới 95%. Do đó, giáo trình tập trung sâu vào phương pháp lập trình tối ưu hóa phần mềm và cấu trúc mã nguồn.
  • Tích hợp chuẩn thư viện công nghiệp CMSIS: Thay vì lập trình trực tiếp bằng việc gán địa chỉ ô nhớ thủ công hoặc sử dụng các thư viện đóng kín của bên thứ ba, tài liệu hướng dẫn người học sử dụng chuẩn giao tiếp phần mềm CMSIS do chính ARM chuẩn hóa, giúp mã nguồn có tính tái sử dụng và khả chuyển cao giữa các họ vi điều khiển Cortex-M.
  • Gắn kết thực tiễn và xu hướng IoT: Tài liệu liên tục cập nhật dữ liệu ứng dụng thực tế: hệ thống điều khiển túi khí, phanh, động cơ trên ô tô hiện đại; thiết bị phân tích tham số chữ ký vật lý SMARTpen; các hệ thống xác thực sinh trắc học; đồng thời tích hợp các khái niệm công nghệ mới như mạng cảm biến (Sensor Network), lưới điện thông minh (Smart Grid), thành phố thông minh (Smart City) và hệ thống Cyber-Physical Systems (CPS).

Đối tượng sử dụng giáo trình

  • Sinh viên đại học: Giáo trình được biên soạn phục vụ trực tiếp cho sinh viên năm thứ hai hoặc năm thứ ba thuộc các ngành Công nghệ thông tin, Kỹ thuật máy tính, Kỹ thuật điện tử, Điện tử viễn thông và Kỹ thuật điều khiển & Tự động hóa.
  • Điều kiện tiên quyết (Prerequisites): Người học bắt buộc phải hoàn thành hai học phần nền tảng:
    1. Kiến trúc máy tính (nắm vững mô hình bus, tổ chức bộ nhớ, nguyên lý hoạt động của CPU);
    2. Kỹ thuật lập trình (thành thạo ngôn ngữ lập trình C cơ bản, bao gồm cấu trúc điều khiển, mảng, con trỏ và hàm).
  • Giảng viên và cơ sở đào tạo: Tài liệu đóng vai trò là khung chương trình chuẩn cho học phần Cơ sở lập trình nhúng với thời lượng phân bố đều cho cả bài giảng lý thuyết trên lớp và các buổi thực hành phòng thí nghiệm. Giảng viên có thể khai thác các ví dụ mã nguồn và câu hỏi ôn tập để xây dựng đề thi kết thúc học phần.
  • Kỹ sư và người tự học: Tài liệu cung cấp tài liệu tham khảo kỹ thuật cho các kỹ sư phần mềm muốn tiếp cận kiến trúc ARM, cung cấp các quy tắc nền tảng về thao tác bit, lập trình thanh ghi và điều khiển vi xử lý STM32.

Câu hỏi thường gặp

1. Giáo trình này phù hợp với đối tượng người học nào?
Tài liệu được thiết kế cho sinh viên ngành Công nghệ thông tin và Kỹ thuật điện tử đã có kiến thức lập trình C cơ bản, muốn nghiên cứu phương pháp viết mã nguồn tương tác trực tiếp với phần cứng trên các dòng vi xử lý 32-bit.

2. Người học cần chuẩn bị kiến thức nền tảng nào trước khi tiếp cận giáo trình?
Người học cần hoàn thành hai môn học tiên quyết được nêu rõ trong tài liệu là Kiến trúc máy tính và Kỹ thuật lập trình. Người đọc cần nắm vững cú pháp C, khái niệm con trỏ, tổ chức ngăn xếp (stack), bộ nhớ và sơ đồ hoạt động cơ bản của hệ thống máy tính.

3. Điểm khác biệt căn bản giữa giáo trình này và các tài liệu lập trình vi điều khiển khác là gì?
Giáo trình không sử dụng các dòng vi điều khiển 8-bit truyền thống mà tiếp cận thẳng vào kiến trúc ARM Cortex-M4 32-bit qua họ chip STM32. Đồng thời, sách không chỉ dạy cú pháp C đơn thuần mà phân tích sự tương quan giữa mã nguồn C và mã máy Assembly tương ứng nhằm tối ưu hóa việc sử dụng thanh ghi 32-bit.

4. Phương pháp tự học giáo trình như thế nào để đạt hiệu quả cao?
Người học nên học lý thuyết song song với thực hành: sau khi nắm vững cấu trúc chương trình (super loop, ngắt) và thao tác bit ở Chương 3, người học cần trang bị KIT phần cứng STM32F4Discovery để thực hành trực tiếp các bài tập lập trình ngoại vi GPIO, Timer, PWM và Flash ở Chương 5.

5. Giáo trình có tài liệu bổ trợ hoặc phần cứng đi kèm nào không?
Các nội dung thực hành trong giáo trình được xây dựng trên KIT phát triển phần cứng thương mại STM32F4Discovery (trang bị vi điều khiển STM32F407VGT6). Về mặt phần mềm, giáo trình dựa trên bộ thư viện chuẩn CMSIS của ARM và các tài liệu tham khảo chuyên ngành được liệt kê ở trang 123.


Kết luận

Giáo trình Cơ sở lập trình nhúng của nhóm tác giả Khoa Công nghệ thông tin – Trường Đại học Công nghiệp Hà Nội thiết lập một hệ thống tri thức học thuật hoàn chỉnh cho lĩnh vực lập trình cấp thấp. Giá trị cốt lõi của cuốn sách thể hiện ở việc kết nối lý thuyết kiến trúc phần cứng máy tính (ARM Cortex-M4) với kỹ thuật tổ chức mã nguồn C chuyên dụng, tạo nền móng vững chắc cho sinh viên trước khi tiếp cận các kiến thức phức tạp hơn như hệ điều hành thời gian thực (RTOS) hay Linux nhúng ở học phần tiếp theo.

Để hoàn thành lộ trình học tập, sinh viên được khuyến nghị nghiên cứu tuần tự từ Chương 1 đến Chương 5, kết hợp tra cứu tài liệu tham khảo kỹ thuật (Datasheet, Reference Manual của dòng chip STM32F407) và thực hành trực tiếp trên KIT vi điều khiển STM32F4Discovery.