2013-03-09 30 views
8

Tôi có Arduino Uno R3. Tôi đang tạo các đối tượng logic cho mỗi cảm biến của mình bằng cách sử dụng C++. Arduino có bộ nhớ on-board rất hạn chế 32KB *, và, trung bình, các đối tượng được biên dịch của tôi sắp ra mắt khoảng 6KB *.Cờ trình biên dịch g ++ để giảm thiểu kích thước nhị phân

Tôi đã sử dụng các loại dữ liệu nhỏ nhất có thể được yêu cầu, nhằm giảm thiểu dung lượng bộ nhớ của tôi. Có một lá cờ trình biên dịch để giảm thiểu kích thước của nhị phân, hoặc tôi cần phải sử dụng tên biến và chức năng ngắn hơn, ít chức năng hơn, vv để giảm thiểu cơ sở mã của tôi?

Ngoài ra, mọi lời khuyên hoặc lời khuyên khác để giảm thiểu kích thước nhị phân sẽ được đánh giá cao.

* Nó có thể không được đo bằng KB (vì tôi không có nó ngồi trước mặt mình), nhưng 1 đối tượng xấp xỉ 1/5 tổng dung lượng bộ nhớ của tôi, điều này khiến tôi lo lắng.

+1

gcc-O3, -O2 O cho tối ưu hóa –

+0

@Grijesh Không ... O3 sẽ làm cho mã nhị phân lớn hơn nói chung. – us2012

+6

@Zak Tùy chọn gcc tối ưu hóa cho kích thước là '-Os'. Bạn cũng có thể 'strip' các biểu tượng cho các tệp nhị phân của bạn sau khi liên kết. – us2012

Trả lời

21

Có rất nhiều kỹ thuật để giảm kích thước nhị phân, thêm vào những gì us2012 và những người khác đề cập trong các ý kiến, tổng hợp chúng với một số điểm của riêng tôi:

  • Sử dụng -Os để làm cho gcc/g ++ tối ưu hóa cho kích thước.
  • Sử dụng -ffunction-sections -fdata-sections để tách riêng từng chức năng hoặc dữ liệu thành các phần riêng biệt trong đơn vị dịch thuật. Kết hợp nó với tùy chọn trình liên kết -Wl,--gc-sections để loại bỏ bất kỳ phần không được tham chiếu nào.
  • Chạy strip với ít nhất các tùy chọn sau: -s -R .comment -R .gnu.version. Nó có thể được kết hợp với --strip-unneeded để xóa tất cả các ký hiệu không cần thiết để xử lý di chuyển.
7

Nếu mã của bạn không chứa C++ - xử lý ngoại lệ, bạn có thể tiết kiệm rất nhiều dung lượng (tối đa 30k sau tất cả các bước tối ưu được Tuxdude đề cập). Vì vậy, bạn phải cung cấp cờ sau: -fno-exceptions

Nhưng thậm chí nếu bạn không ngoại lệ sử dụng, xử lý ngoại lệ có thể được bao gồm! Kiểm tra các bước sau:

  1. no usage of new, delete. Nếu bạn thực sự cần nó thay thế chúng bằng cách đóng gói malloc/miễn phí. Để tìm kiếm ví dụ về "tinynew.cpp"

  2. cung cấp chức năng cho cuộc gọi ảo thuần túy, ví dụ: extern "C" void __cxa_pure_virtual() { while(1); }

  3. ghi đè __gnu_cxx :: __ verbose_terminate_handler(). Nó xử lý các trường hợp ngoại lệ chưa được xử lý và thực hiện việc khử tên, điều này khá lớn! (Ví dụ d_print_comp.part.10 với 9.5k hoặc d_type với 1.8k)

Cheers Flo

+0

Cảm ơn lời khuyên này! – Zak

Các vấn đề liên quan