Đôi khi tôi cần một số mã được CPU thực thi chính xác như khi tôi đặt nó vào nguồn. Nhưng bất kỳ trình biên dịch C nào cũng có các thuật toán tối ưu hóa của nó để tôi có thể mong đợi một số thủ thuật. Ví dụ:Làm cách nào để "thông báo" cho trình biên dịch C rằng mã không được tối ưu hóa?
unsigned char flag=0;
interrupt ADC_ISR(){
ADC_result = ADCH;
flag = 1;
}
void main(){
while(!flag);
echo ADC_result;
}
Một số trình biên dịch chắc chắn sẽ làm cho while(!flag);
loop infinitive vì nó sẽ giả sử flag
bằng false (!flag
do đó phải luôn luôn đúng).
Thỉnh thoảng tôi có thể sử dụng từ khóa volatile
. Và đôi khi nó có thể giúp đỡ. Nhưng thực tế trong trường hợp của tôi (AVR GCC) volatile
trình biên dịch lực từ khóa để định vị biến vào SRAM thay vì các thanh ghi (điều này có hại vì một số lý do). Hơn nữa, nhiều bài viết trên Internet gợi ý sử dụng từ khóa volatile
với sự quan tâm lớn vì kết quả có thể trở nên không ổn định (tùy thuộc vào trình biên dịch, cài đặt tối ưu hóa, nền tảng, v.v.).
Vì vậy, tôi chắc chắn sẽ thích bằng cách nào đó chỉ ra hướng dẫn mã nguồn và nói với trình biên dịch rằng mã này nên được biên dịch chính xác như nó được. Như thế này: volatile while(!flag);
Có bất kỳ hướng dẫn C chuẩn nào để thực hiện việc này không?
Tất nhiên biến 'biến động' sẽ chuyển sang RAM! Đăng ký là dành cho các giá trị tạm thời, Một gián đoạn có thể xảy ra bất cứ lúc nào. Tôi muốn khuyên bạn nên làm một số nghiên cứu thêm về đồng thời, đặc biệt là xử lý ngắt và phát triển phần mềm nhúng.Ví dụ cho một cờ boolean, bạn nên sử dụng kiểu chuẩn boolean. – Olaf
Dễ bay hơi có nghĩa là giá trị biến không thể được lưu trữ giữa các lần đọc (và các ghi đó không thể di chuyển xung quanh). Có, điều đó thường dẫn đến việc giảm tải vào RAM mỗi lần. Nếu bạn nghĩ rằng bạn có thể làm tốt hơn thế, bạn nên thử [inline assembly] (http://www.ethernut.de/en/documents/arm-inline-asm.html). – Cubic
@Cubic: Thay đổi nội tuyến sẽ làm gì cho các biến? OP dường như thậm chí không suy nghĩ về mã được tối ưu hóa kém, nhưng sử dụng tài nguyên. Giải pháp duy nhất cho việc này là viết ** mọi thứ ** trong Assembler, vì vậy anh ta có thể kiểm soát đăng ký CPU và cấp phát bộ nhớ 100%. Micromanagement tốt nhất của nó. Tôi đã làm điều này trong nhiều năm và tôi rất vui vì chúng tôi có những trình biên dịch quan tâm đến điều này. – Olaf