Tối ưu hóa
Lập trình cấp thấp cho các hệ thống nhúng khá khác so với lập trình cho các thiết bị có mục đích chung, chẳng hạn như máy tính và điện thoại di động. Hiệu quả (về tốc độ và không gian) quan trọng hơn nhiều vì tài nguyên ở mức cao. Điều đó có nghĩa là điều đầu tiên cần làm nếu bạn hết dung lượng là xem xét phần nào trong mã bạn có thể tối ưu hóa.
Về việc giảm mức sử dụng không gian chương trình (Flash), kích thước mã có thể khá khó để tối ưu hóa nếu bạn chưa có kinh nghiệm hoặc nếu bạn quen sử dụng lập trình cho máy tính để bàn không có xu hướng cần kỹ năng đó. Thật không may, không có cách tiếp cận 'viên đạn ma thuật' nào sẽ hoạt động trong mọi tình huống, mặc dù nó có ích nếu bạn xem xét nghiêm túc những gì bản phác thảo của bạn thực sự cần phải có. Nếu một tính năng không cần thiết, hãy lấy nó ra.
Đôi khi nó cũng hữu ích để xác định nơi nhiều phần mã của bạn giống nhau (hoặc rất giống nhau). Bạn có thể ngưng tụ chúng thành các chức năng có thể sử dụng lại có thể được gọi từ nhiều nơi. Tuy nhiên, lưu ý rằng đôi khi cố gắng tạo mã quá tái sử dụng thực sự sẽ khiến nó dài dòng hơn. Đó là một sự cân bằng khó khăn để tấn công có xu hướng đi kèm với thực tiễn. Dành thời gian để xem các thay đổi mã ảnh hưởng đến đầu ra của trình biên dịch có thể giúp ích như thế nào.
Tối ưu hóa dữ liệu thời gian chạy (SRAM) có xu hướng dễ dàng hơn một chút khi bạn đã quen với nó. Một cạm bẫy rất phổ biến đối với các lập trình viên mới bắt đầu là sử dụng quá nhiều dữ liệu toàn cầu. Bất cứ điều gì được tuyên bố ở phạm vi toàn cầu sẽ tồn tại trong toàn bộ thời gian của bản phác thảo và điều đó không phải lúc nào cũng cần thiết. Nếu một biến chỉ được sử dụng bên trong một hàm và nó không cần phải tồn tại giữa các cuộc gọi, thì hãy biến nó thành một biến cục bộ. Nếu một giá trị cần được chia sẻ giữa các hàm, hãy xem xét liệu bạn có thể chuyển nó dưới dạng tham số thay vì làm cho nó toàn cầu hay không. Bằng cách đó, bạn sẽ chỉ sử dụng SRAM cho các biến đó khi bạn thực sự cần nó.
Một kẻ giết người khác để sử dụng SRAM là xử lý văn bản (ví dụ: sử dụng String
lớp). Nói chung, bạn nên tránh thực hiện các thao tác Chuỗi nếu có thể. Họ là những con lợn nhớ lớn. Ví dụ: nếu bạn xuất nhiều văn bản thành nối tiếp, hãy sử dụng nhiều cuộc gọi Serial.print()
thay vì sử dụng nối chuỗi. Cũng cố gắng giảm số lượng chuỗi ký tự trong mã của bạn nếu có thể.
Tránh đệ quy nếu có thể là tốt. Mỗi khi một cuộc gọi đệ quy được thực hiện, nó sẽ đưa ngăn xếp một mức độ sâu hơn. Thay vào đó hãy cấu trúc lại các hàm đệ quy của bạn để lặp lại.
Sử dụng EEPROM
EEPROM được sử dụng để lưu trữ lâu dài những thứ chỉ thỉnh thoảng thay đổi. Nếu bạn cần sử dụng danh sách lớn hoặc bảng tra cứu dữ liệu cố định, thì hãy cân nhắc lưu trữ trước trong EEPROM và chỉ rút ra những gì bạn cần khi cần thiết.
Rõ ràng EEPROM khá hạn chế về kích thước và tốc độ, và có số lượng chu kỳ ghi hạn chế. Đây không phải là một giải pháp tuyệt vời cho các giới hạn dữ liệu, nhưng nó có thể đủ để giảm bớt gánh nặng cho Flash hoặc SRAM. Cũng có thể giao tiếp với bộ nhớ ngoài tương tự, chẳng hạn như thẻ SD.
Mở rộng
Nếu bạn đã sử dụng hết tất cả các tùy chọn khác, thì việc mở rộng có thể là một khả năng. Thật không may, việc mở rộng bộ nhớ Flash để tăng không gian chương trình là không thể. Tuy nhiên, nó là tốt để mở rộng SRAM. Điều này có nghĩa là bạn có thể cấu trúc lại bản phác thảo của mình để giảm kích thước mã với chi phí tăng kích thước dữ liệu.
Nhận được nhiều SRAM thực sự khá đơn giản. Một tùy chọn là sử dụng một hoặc nhiều chip 23K256 . Chúng được truy cập thông qua SPI và có thư viện SpiRAM để giúp bạn sử dụng chúng. Chỉ cần cẩn thận rằng họ hoạt động ở 3,3V chứ không phải 5V!
Nếu bạn đang sử dụng Mega, bạn có thể nhận được các lá chắn mở rộng SRAM từ Lagrangian Point hoặc Rugged Circuits .