Một quan điểm khác: Vi điều khiển không hết bộ nhớ.
Ít nhất, không phải khi được lập trình đúng. Lập trình một vi điều khiển không hoàn toàn giống như lập trình cho mục đích chung, để thực hiện đúng cách, bạn phải nhận thức được các ràng buộc và chương trình của nó. Có các công cụ để giúp đảm bảo điều này. Tìm kiếm chúng và tìm hiểu chúng - ít nhất là làm thế nào để đọc các đoạn script và cảnh báo của trình liên kết.
Tuy nhiên, như Majenko và những người khác nói, một bộ vi điều khiển được lập trình kém có thể hết bộ nhớ, và sau đó làm bất cứ điều gì kể cả vòng lặp vô hạn (ít nhất là cho bộ đếm thời gian theo dõi cơ hội để thiết lập lại. Bạn đã kích hoạt bộ đếm thời gian theo dõi, phải không? )
Các quy tắc lập trình phổ biến cho vi điều khiển tránh điều này: ví dụ: tất cả bộ nhớ được phân bổ trên ngăn xếp hoặc phân bổ tĩnh (toàn cầu); "Mới" hoặc "malloc" đều bị cấm. Đệ quy cũng vậy, sao cho độ sâu tối đa của lồng con có thể được phân tích và hiển thị để phù hợp với ngăn xếp có sẵn.
Do đó, dung lượng lưu trữ tối đa cần thiết có thể được tính khi chương trình được biên dịch hoặc liên kết và so sánh với kích thước bộ nhớ (thường được mã hóa trong tập lệnh liên kết) cho bộ xử lý cụ thể mà bạn đang nhắm mục tiêu.
Sau đó, vi điều khiển có thể không hết bộ nhớ, nhưng chương trình của bạn có thể. Và trong trường hợp đó, bạn có thể
- viết lại nó, nhỏ hơn, hoặc
- chọn một bộ xử lý lớn hơn (chúng thường có sẵn với các kích thước bộ nhớ khác nhau).
Một bộ quy tắc chung cho lập trình vi điều khiển là MISRA-C , được ngành công nghiệp ô tô áp dụng.
Thực tiễn tốt nhất theo quan điểm của tôi là sử dụng tập hợp con SPARK-2014 của Ada. Ada thực sự nhắm mục tiêu các bộ điều khiển nhỏ như AVR, MSP430 và ARM Cortex một cách hợp lý và vốn cung cấp một mô hình tốt hơn cho lập trình vi điều khiển so với C. Nhưng SPARK thêm chú thích vào chương trình, dưới dạng nhận xét, mô tả những gì chương trình đang làm.
Bây giờ các công cụ SPARK sẽ phân tích chương trình, bao gồm các chú thích đó và chứng minh các thuộc tính về nó (hoặc báo cáo các lỗi tiềm ẩn). Bạn không phải lãng phí thời gian hoặc không gian mã xử lý các truy cập bộ nhớ sai hoặc tràn số nguyên vì chúng đã được chứng minh là không bao giờ xảy ra.
Mặc dù có nhiều công việc trực tiếp hơn liên quan đến SPARK, nhưng kinh nghiệm cho thấy nó có thể đến với một sản phẩm nhanh hơn và rẻ hơn vì bạn không dành thời gian để theo đuổi các khởi động lại bí ẩn và hành vi kỳ lạ khác.
So sánh MISRA-C và SPARK