🌱 Embedded C - Các câu lệnh điều khiển luồng chương trình - Flow Control Statements

🌱 Embedded C - Các câu lệnh điều khiển luồng chương trình - Flow Control Statements

    Trong lập trình nói chung và lập trình C nhúng nói riêng, các câu lệnh điều khiển luồng chương trình (Flow Control Statements) được sử dụng để điều khiển thứ tự thực thi các lệnh trong chương trình, cho phép thực hiện các quyết định logic, lặp lại các tác vụ, hoặc nhảy đến các phần mã khác. Đây là một phần rất cơ bản của lập trình và cần hiểu rõ để có thể sử dụng linh hoạt.

    Trong C, chúng ta có thể chia các câu lệnh flow control thành 3 loại: Conditional Statements (if, switch), Iteration Statments (for, while, do-while), Jump Statements (break, continue, goto, return).


Mục Lục


Câu lệnh điều kiện - Conditional Statements

    Conditional Statements - câu lệnh điều kiện, là các câu lệnh với mục đích kiểm tra điều kiện và quyết định chương trình sẽ tiếp tục thực thi đoạn code nào?

    C hỗ trợ 2 câu lệnh điều kiện là ifswitch với các đặc điểm khác nhau. Câu lệnh if sử dụng để kiểm tra một điều kiện trả về là True hay False, trong khi đó switch dùng để kiểm tra giá trị của một biến/biểu thức.

Embedded-C-Flow-Control

  • Câu lệnh if thường sử dụng để kiểm tra điều kiện trả về True/False, nên thường sử dụng để kiểm tra các điều kiện phức tạp, tham số đầu vào trong hàm, ...
  • Trong khi đó switch thường sử dụng để kiểm tra các biến/biểu thức có thể trả về nhiều giá trị khác nhau, và được dùng rất nhiều trong Embedded để kiểm tra các biến trạng thái, và thiết kế các State Machine.

    Về cú pháp và ví dụ sử dụng mình mô tả trong video này:

Câu lệnh vòng lặp - Iteration Statements

    Iteration Statements - Câu lệnh vòng lặp, là các câu lệnh để thực hiện lặp lại cùng một đoạn code nhiều lần. Các lập trình viên Embedded đã quá quen thuộc với vòng while(1) - nhằm giúp chương trình cho các thiết bị luôn chạy cho đến khi bị tắt nguồn.

    C hỗ trợ 3 câu lệnh vòng lặp: for, while, do-while.

for loop

for (initialization; condition; update) {
    // Block of code executed in each loop
}

    Vòng lặp for thường tạo ra một biến đếm với giá trị khởi tạo (initialization) và một điều kiện để kết thúc vòng lặp (condition). Về cú pháp và ví dụ mình đã nói đến trong video này:

    Với một biến đếm, for loop thường sử dụng cho các vòng lặp mà người lập trình dễ dàng biết trước số lần lặp, ví dụ như quét led chạy 10 lần, vòng lặp xử lý mảng, ...

while/do-while loop

while (condition) {
    // Block of code to execute if condition is true
}

do {
    // Block of code executed at least once
} while (condition);

    Khác với for thì hai vòng lặp while và do-while không sử dụng biến đếm, chúng sẽ liên tục kiểm tra xem điều kiện lặp còn đúng hay không, và thoát khi điều kiện đó sai. Vì vậy while và do-while thường sử dụng cho các vòng lặp mà dev không biết trước số lần lặp.

    Ví dụ như việc đợi một sự kiện từ người dùng (giả sử đợi người dùng bấm nút), hoặc đợi một sự kiện phần cứng (đợi một cờ set lên 1), hoặc chính vòng lặp while(1).

Câu lệnh nhảy - Jump Statements

    Jump Statements - các câu lệnh nhảy thường được sử dụng để điều hướng chương trình theo những cách "bất ngờ" hơn:

  • break: Thoát ngay lập tức khỏi vòng lặp hoặc switch-case chứa nó.

Embedded-C-Flow-Control

    Ví dụ: Chương trình tính tổng các số (tối đa 10 số), nếu người dùng nhập số âm, vòng lặp sẽ kết thúc.

  1. #include <stdio.h>
  2. int main() {
  3. int i;
  4. double number, sum = 0.0;
  5. for (i = 1; i <= 10; ++i) {
  6. printf("Enter n%d: ", i);
  7. scanf("%lf", &number);
  8. // if the user enters a negative number, break the loop
  9. if (number < 0.0) {
  10. break;
  11. }
  12. sum += number; // sum = sum + number;
  13. }
  14. printf("Sum = %.2lf", sum);
  15. return 0;
  16. }
  • continue: Bỏ qua phần còn lại của vòng lặp hiện tại và chuyển đến vòng lặp tiếp theo.

Embedded-C-Flow-Control

    Ví dụ: Chương trình tính tổng các số (tối đa 10 số), nếu người dùng nhập số âm, số đó sẽ không được cộng vào kết quả.

  1. #include <stdio.h>
  2. int main() {
  3. int i;
  4. double number, sum = 0.0;
  5. for (i = 1; i <= 10; ++i) {
  6. printf("Enter a n%d: ", i);
  7. scanf("%lf", &number);
  8. if (number < 0.0) {
  9. continue;
  10. }
  11. sum += number; // sum = sum + number;
  12. }
  13. printf("Sum = %.2lf", sum);
  14. return 0;
  15. }
  • goto: Nhảy trực tiếp đến một nhãn (label) trong cùng hàm.

Embedded-C-Flow-Control

    goto thường được sử dụng với các hàm phức tạp (nhiều nhánh) để xử lý lỗi khi cần, ít được sử dụng trong các hoàn cảnh khác do việc kiểm soát chương trình sẽ khá phức tạp.

    Ví dụ: Xử lý lỗi khẩn cấp

  1. #include <stdio.h>
  2. #define ERROR 1
  3. #define NO_ERROR 0
  4. int main() {
  5. int status = ERROR;
  6. if (status == ERROR) {
  7. printf("Critical error detected\n");
  8. goto error_handler;
  9. }
  10. printf("Normal operation\n");
  11. error_handler:
  12. printf("Handling error...\n");
  13. return 0;
  14. }
  • return: Thoát khỏi hàm hiện tại và trả về giá trị (nếu có).

    ➥ Sẽ được nhắc đến trong bài viết về Function.

Kết Luận

    Các câu lệnh điều khiển luồng (if, switch, for, while, do-while, break, continue, goto, return) trong Embedded C là công cụ thiết yếu để điều khiển luồng thực thi, đáp ứng yêu cầu thời gian thực và quản lý tài nguyên hạn chế.

    Chúng cho phép xử lý logic phức tạp, từ kiểm tra cảm biến, điều khiển thiết bị, đến quản lý lỗi. Trong hệ thống nhúng, cần tối ưu hóa hiệu suất, đảm bảo an toàn, và tránh các cấu trúc như goto để mã dễ bảo trì.

    Hiểu rõ và sử dụng hợp lý các câu lệnh này giúp xây dựng các ứng dụng nhúng hiệu quả và đáng tin cậy.

>>>>>> Follow ngay <<<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn
//