[Embedded] Từ Khóa Volatile Trong C
embedded
14
C
29
C++
37
White

binhphuong viết ngày 10/06/2018

Trong lập trình nhúng (embedded system) chúng ta hay bắt gặp từ khóa volatile được khai báo kèm theo biến. Vậy ý nghĩa của nó thế nào?
Việc khai báo biến có thuộc tính volatile là rất cần thiết nhằm tránh các lỗi phát sinh ngoài ý muốn khi tính năng optimization của compiler được bật. Volatile để chỉ một biến có thể bị thay đổi giá trị một cách "bất thường". Có nghĩa là giá trị của biến có thể bị thay đổi mà không được báo trước. Ví dụ sau sẽ cho thấy điều đó

#include <stdio.h>

bool receiveDone = false;

int main(void)
{
  if(receiveDone)
  {
    printf("Interrupt");
  }
}

interrupt void rx_isr(void)
{
  receiveDone = true;
}

Biến receivedDone được khai báo là một biến bình thường(không có thuộc tính volatile) nên compiler sẽ không biết được rằng nó sẽ bị thay đổi một cách bất thường, do đó khi một ngắt xảy ra, bên trong ngắt đã thay đổi giá trị của biến này thành true, nhưng bên trong hàm main biến receivedDone không được làm mới(refresh) nên vẫn giữ giá trị là false, do đó đoạn code bên trong if(receivedDone) không được thực hiện. Để khắc phục vấn đề trên chúng ta chỉ việc thêm thuộc tính volatile cho biến receivedDone. Khai báo sẽ là:

volatile bool receiveDone = false;

Khi có thuộc tính volatile cho biến thì cho dù optimization của compiler có bật lên thì compiler vẫn bị buộc phải check biến có thuộc tính volatile để đảm bảo cập nhật được giá trị mới nhất của biến trước khi tính toán.

binhphuong 09-06-2018

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

binhphuong

1 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
Male avatar
0 0
Constructor của lớp cha luôn được gọi trước constructor của lớp con. class Foo { public: Foo() { cout << "Base class initializing" << endl; ...
phqb viết 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!