- vừa được xem lúc

Từ khoá volatile trong lập trình C

0 0 17

Người đăng: Hoang Vo

Theo Viblo Asia

Trong lập trình nhúng chắc hẵn bạn đã từng gặp phải tình huống khi chương trình C của bạn cho ra kết quả không đúng, mặc dù mã code có vẻ đúng? Một nguyên nhân có thể gây ra vấn đề này là việc tối ưu hóa được thực hiện bởi trình biên dịch. Khi tối ưu mã, trình biên dịch có thể đưa ra giả định về hành vi của chương trình và tối ưu hóa một số lệnh hoặc sắp xếp chúng một cách dẫn đến hành vi không mong muốn.

Từ khóa "volatile" được sử dụng để cho biết cho trình biên dịch rằng một biến hoặc vị trí bộ nhớ cụ thể có thể được thay đổi bên ngoài sự kiểm soát của chương trình. Điều này có nghĩa là trình biên dịch không thể đưa ra bất kỳ giả định nào về giá trị của biến và luôn phải tải và lưu trữ biến như nó có thể thay đổi bất cứ lúc nào.

Ví dụ, giả sử chúng ta có một biến "count" được tăng lên bởi một hàm dịch vụ ngắt (ISR) được kích hoạt bởi một bộ định thời gian phần cứng. Nếu chúng ta không sử dụng từ khóa "volatile" để khai báo "count", trình biên dịch có thể tối ưu mã và lưu trữ giá trị của "count" trong một thanh ghi, giả định rằng nó sẽ không bao giờ thay đổi bên ngoài sự kiểm soát của chương trình. Tuy nhiên, vì ISR có thể sửa đổi "count" bất cứ lúc nào, điều này có thể dẫn đến hành vi không mong muốn và lỗi trong chương trình.

Để ngăn chặn vấn đề này, chúng ta có thể sử dụng từ khóa "volatile" để khai báo "count" là volatile, cho biết cho trình biên dịch rằng nó có thể thay đổi bất kỳ lúc nào và luôn phải được tải và lưu trữ từ bộ nhớ.

volatile int count; void ISR() {
count++;
} int main() {
while (1) {
// do something
}
return 0;
}

Trong ví dụ này, chúng ta khai báo biến "count" là volatile để cho biết rằng nó có thể được thay đổi bởi một ISR. Nếu không có từ khóa volatile, trình biên dịch có thể tối ưu mã và giả định rằng "count" sẽ không bao giờ thay đổi, dẫn đến hành vi không mong muốn.

Tóm lại, từ khóa volatile là một công cụ quan trọng trong lập trình C để đảm bảo rằng trình biên dịch không đưa ra giả định về hành vi của các biến hoặc vị trí bộ nhớ có thể thay đổi bên ngoài sự kiểm soát của chương trình. Nó đặc biệt hữu ích khi làm việc với các thiết bị phần cứng hoặc các hàm dịch vụ ngắt. Hãy đảm bảo sử dụng nó khi cần thiết để ngăn chặn lỗi và hành vi không mong muốn trong chương trình của bạn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Design Patterns trong ngôn ngữ lập trình C - bài 1

Design Patterns trong C. Design Patterns (Thiết Kế Mẫu) không phải là một khái niệm quá xa lạ với người lập trình.

0 0 118

- vừa được xem lúc

Thao tác với Process

1. Giới thiệu.

0 0 32

- vừa được xem lúc

Quản lý Process

1. Giới thiệu.

0 0 47

- vừa được xem lúc

Thao tác với Thread

1. Giới thiệu.

0 0 49

- vừa được xem lúc

Giải mã AUTOSAR: Kiến trúc tiêu chuẩn ngành Automotive

Giới thiệu. AUTOSAR có vẻ khá xa lạ đối với người làm về công nghệ thông tin, nhưng đối với những bạn làm về Embedded System, đặc biệt là trong lĩnh vực Automotive, thì cũng.

0 0 18

- vừa được xem lúc

Giải mã AUTOSAR: Kiến trúc để đời ngành Automotive - Phần 2

Updating. Trong bài viết này, ta cùng tìm hiểu kỹ hơn về lớp trên cùng của kiến trúc, chính là lớp Application Layer (ASW).

0 0 13