Tĩnh ngụ ý biến được tách biệt với tệp / hàm / vùng mã đó. Nơi được định nghĩa, cả hai chỉ hiển thị ở đó và khi được sử dụng trên các phi toàn cầu về cơ bản biến biến đó thành toàn cầu từ góc độ lưu trữ. Biến cục bộ có định nghĩa tĩnh có nghĩa là tôi muốn không mất giá trị đó từ một cuộc gọi của hàm này sang hàm khác, vì vậy nó phải được lưu trữ trên toàn cầu cho hàm đó, thông thường một biến cục bộ nằm trên ngăn xếp để hàm có thể được tái entrant (một bản sao mới của các biến cục bộ cho mỗi mục nhập vào hàm). Vì vậy, toàn cầu tĩnh là toàn cầu, dù sao thì địa phương tĩnh là cục bộ nhưng được lưu trữ cùng với toàn cầu. Trong những gì thường được gọi là .data nhưng bộ công cụ có thể có tên khác nhau.
int x = 7;
được cất giữ. Biến toàn cục hoặc cục bộ tĩnh không được khởi tạo khi được xác định
int y;
là trong những gì thường được gọi là .bss. Đây là một đoạn khác của bộ nhớ đọc / ghi, nhưng bộ nhớ này trước khi bắt đầu hàm main () là 0 đối với bạn để theo thông số kỹ thuật hoặc mỗi giả định các biến đó bằng 0 khi chương trình của bạn bắt đầu.
const là một cách để nói rằng tôi đang tuyên bố đây là một biến chỉ đọc, tôi không có kế hoạch cho mọi lưu trữ cho nó chỉ đọc từ nó. Vì vậy, trình biên dịch có thể chọn (thực ra đó là lập trình viên vì cuối cùng họ chỉ ra những gì trình liên kết thực hiện, thường để cho tập lệnh liên kết mặc định được sử dụng và không đảm nhận công việc đó) cho dù đó là flash hay ram, nó có thể đi vào và làm việc bình thường.
Đối với vi điều khiển và những nơi khác mà bạn cần khởi động và bắt đầu chạy từ bộ nhớ không bay hơi (flash / rom / vv). Trước hết, chương trình phải được lưu trữ trong một cái gì đó không dễ bay hơi. Tiếp theo công cụ .data, những thứ bạn đã khởi tạo trong mã của mình khi xác định biến, những thứ mà tại thời gian biên dịch có thể được xác định. cũng phải ở trong bộ lưu trữ không bay hơi, nhưng cuối cùng dữ liệu đó được đọc / ghi để mã bootstrap chạy trước hàm main () được thực hiện, thực hiện công việc sao chép các khối .data vào bộ nhớ đọc / ghi. Mã .bss hoặc các biến cục bộ toàn cục hoặc tĩnh không được khởi tạo và được coi là 0 khi bạn bắt đầu, chúng không cần bộ nhớ không bay hơi, chỉ cần vị trí và bao nhiêu, và từ đó bootstrap có thể đọc / ghi nhớ.
Có nhiều lý do tại sao chúng ta giao tiếp bằng các thuật ngữ như .text, .data, .bss, .rodata, v.v. Bởi vì chúng ta thấy rằng các công cụ đặt các yếu tố của chương trình của chúng ta vào những nơi đó và sau đó chúng ta có thể thấy những nơi đó phải sống ở đâu lưu trữ dễ bay hơi và sau đó trong thời gian chạy nếu điều đó là khác nhau. .text mặc dù ngớ ngẩn, là chương trình của chúng tôi, mã máy và dữ liệu liên quan khác. .data là các biến từ chương trình của chúng tôi được khởi tạo trước khi bắt đầu khác không, vì vậy chúng phải được lưu trữ trong bộ lưu trữ không bay hơi sau đó chuyển sang đọc / ghi trước khi sử dụng chúng. .bss là các biến từ chương trình của chúng tôi được coi là 0 khi chúng tôi bắt đầu, do đó, số lượng và vị trí cần được lưu trữ trong trạng thái không bay hơi và boostrap có thể thực hiện zeroing (hoặc đôi khi chúng chỉ được lưu trữ dưới dạng một số không trong đèn flash / rom là tốt). .
Sau đó, có các thuật ngữ heap và stack, thường sau chương trình của bạn nếu cần, .bss và .data tiêu thụ một lượng ram, thường là từ các địa chỉ thấp hơn trở lên. sau đó phần còn lại của ram được chia thành đống và chồng, đôi khi không có một đường thẳng chắc chắn giữa chúng, các chương trình hành vi xấu có thể có đống và đống va chạm gây ra sự cố. ngăn xếp thường là từ trên xuống và đống thường là từ dưới lên, nhưng đây không phải là quy tắc cứng và nhanh.
Những thứ này ở đâu trên bảng của bạn? tốt, nó phụ thuộc cả vào chip và bo mạch vì các tùy chọn là gì sau đó tùy thuộc vào bạn lập trình viên quyết định khi bạn điều khiển quá trình biên dịch và liên kết. Hầu hết mọi người đều lấy một ví dụ hoặc một chuỗi công cụ biết về hệ thống của bạn và bạn để các cài đặt mặc định. Nhưng bạn có trách nhiệm hoàn toàn. Để vi điều khiển khởi động, bạn phải có cách để làm điều đó, thường là flash hoặc tắt chip tùy thuộc vào mcu, và những thứ không bay hơi được đề cập ở trên phải được lưu trữ ở đó hoặc ở một nơi không bay hơi khác . Tương tự như vậy, bạn có một số ram, bạn phải chia nó ra với những thứ đọc / ghi bạn cần bao gồm cả stack và heap nếu bạn đủ can đảm để sử dụng nó trong một hệ thống như vậy (không khôn ngoan). Một số bộ xử lý ngăn xếp là một phần của thiết kế và bạn không phải lo lắng về, những người khác bạn làm. Nếu bạn có bội số của những thứ này, ram không biến động hoặc đọc / ghi thì thật tuyệt, bạn có thể chọn và chọn nơi đặt đồ.
nếu bạn sử dụng một toolchain từ ai đó hoặc có quyền truy cập vào những cái khác nhau, không có lý do gì để cho rằng họ sẽ làm điều tương tự chính xác với chương trình của bạn với tập lệnh liên kết mặc định của họ. thông thường các bộ công cụ cung cấp các tệp bản đồ hoặc các cách khác để xem nơi họ đã đặt mọi thứ cho bạn.
chắc chắn có thể có một hệ thống dựa trên vi điều khiển không có đèn flash, mỗi lần nghe thấy chuột hay bàn phím? Một số cùng với nhiều sản phẩm khác có thể hoạt động mà không cần những thứ như vậy. Ví dụ, một số có thể có logic của chip để quản lý bảng liệt kê usb, sau đó trình điều khiển hệ điều hành cho sản phẩm đó chứa phần sụn, tải phần sụn để ram trên thiết bị và khởi động bộ xử lý và có thể liệt kê lại usb rằng bây giờ nó là một con chuột hoặc bất cứ điều gì. không phải ai cũng làm điều đó nhưng đôi khi nó được thực hiện Tương tự như vậy, bạn có thể có một số thiết kế khác trong đó một số phần cứng hoặc giải pháp khác tải chương trình vào chip / ram trước khi khởi động bộ xử lý một cách hiệu quả khiến nó có cảm giác như bộ xử lý đó không có đèn flash. Nhưng bạn vẫn có cùng .text, .data,.