const
có nghĩa là biến không thể được sửa đổi bởi mã c, không phải biến không thể thay đổi. Nó có nghĩa là không có lệnh nào có thể ghi vào biến, nhưng giá trị của nó có thể vẫn thay đổi.
volatile
có nghĩa là biến có thể thay đổi bất kỳ lúc nào và do đó không có giá trị được lưu trong bộ nhớ cache nào có thể được sử dụng; mỗi truy cập vào biến phải được thực hiện đến địa chỉ bộ nhớ của nó.
Kể từ khi câu hỏi được gắn thẻ "nhúng" và giả temp
là một người dùng tuyên bố thay đổi, không phải là một đăng ký phần cứng liên quan (vì đây là những thường được xử lý trong một file .h riêng), hãy xem xét:
Một bộ xử lý nhúng có bộ nhớ dữ liệu đọc-ghi dễ bay hơi (RAM) và bộ nhớ dữ liệu chỉ đọc không bay hơi, ví dụ bộ nhớ FLASH trong kiến trúc von-Neumann, nơi dữ liệu và không gian chương trình chia sẻ dữ liệu chung và bus địa chỉ. Nếu bạn khai báo const temp
để có giá trị (ít nhất là nếu khác 0), trình biên dịch sẽ gán biến cho địa chỉ trong không gian FLASH, bởi vì ngay cả khi nó được gán cho địa chỉ RAM, nó vẫn cần bộ nhớ FLASH để lưu trữ giá trị ban đầu của biến, làm cho địa chỉ RAM trở nên lãng phí dung lượng vì tất cả các thao tác đều chỉ đọc.
Trong hậu quả:
int temp;
là một biến lưu trữ trong RAM, khởi tạo 0 lúc khởi động (cstart), các giá trị được lưu trữ có thể được sử dụng.
const int temp;
là một biến được lưu trữ trong (read-ony) FLASH, được khởi tạo thành 0 tại thời gian trình biên dịch, các giá trị được lưu trong bộ nhớ cache có thể được sử dụng.
volatile int temp;
là một biến được lưu trữ trong RAM, được khởi tạo thành 0 khi khởi động (cstart), giá trị được lưu trong bộ nhớ cache sẽ KHÔNG được sử dụng.
const volatile int temp;
là một biến lưu trữ trong FLASH (read-ony), khởi tạo 0 vào thời điểm biên dịch, các giá trị được lưu trữ sẽ KHÔNG được sử dụng
Ở đây có phần hữu ích:
Ngày nay các bộ xử lý nhúng nhất có khả năng thay đổi bộ nhớ không bay hơi chỉ đọc của họ bằng mô-đun chức năng đặc biệt, trong trường hợp này const int temp
có thể thay đổi khi chạy, không được trực tiếp thay đổi. Nói theo cách khác, một hàm có thể sửa đổi giá trị tại địa chỉ nơi temp
được lưu trữ.
Ví dụ thực tế sẽ là sử dụng temp
cho số sê-ri của thiết bị. Lần đầu tiên bộ xử lý nhúng chạy, temp
sẽ bằng 0 (hoặc giá trị được khai báo) và một hàm có thể sử dụng thực tế này để chạy thử nghiệm trong quá trình sản xuất và nếu thành công, yêu cầu được chỉ định số sê-ri và sửa đổi giá trị temp
bằng một hàm đặc biệt. Một số bộ xử lý có một dải địa chỉ đặc biệt với bộ nhớ OTP (một lần lập trình) chỉ dành cho điều đó.
Nhưng ở đây có sự khác biệt:
Nếu const int temp
là một ID sửa đổi thay vì một số sê-ri một thời gian có thể lập trình và không được khai báo volatile
, một giá trị được lưu trữ có thể được sử dụng cho đến khi khởi động kế tiếp, có nghĩa là mới ID có thể không hợp lệ cho đến khi khởi động lại tiếp theo hoặc thậm chí tệ hơn, một số chức năng có thể sử dụng giá trị mới trong khi các hàm khác có thể sử dụng giá trị được lưu trữ cũ hơn cho đến khi khởi động lại. Nếu const int temp
IS được khai báo voltaile
, thay đổi ID sẽ có hiệu lực ngay lập tức.
Bạn sẽ không sử dụng 'const dễ bay hơi int temp; 'tại phạm vi khối (tức là bên trong' {} '), nó không sử dụng ở đó. –