Chiến lược quản lý kích thước mã - PIC18 XC8


7

Tôi chưa quen với phát triển C nhúng và tôi đang tìm kiếm một số nguyên tắc / hướng dẫn chung để quản lý kích thước của mã được tạo.

Trong ví dụ cụ thể của tôi, tôi đang sử dụng XC8 trên PIC18F4550. Mã của tôi cho đến nay sử dụng khoảng 13% dung lượng. Khi tôi sử dụng "time.h" và 1/2 chức năng từ nó, mức sử dụng sẽ tăng lên 45%! Tôi nhận ra rằng trình biên dịch XC8 miễn phí không tối ưu hóa nhưng tôi vẫn rất ngạc nhiên khi thấy có bao nhiêu dung lượng được sử dụng.

Những gì tôi đang tìm kiếm một mẹo / điểm nhìn chằm chằm dọc theo dòng

  • Các lựa chọn thay thế cho các thư viện tiêu chuẩn thực hiện trên các tập hợp con mục tiêu nhỏ của chức năng. Ví dụ: ngày / giờ lib. tức là có vị trí lại tôi có thể có được thói quen hữu ích từ đâu?
  • Làm thế nào để xem những gì đang sử dụng tất cả các không gian. (Liệt kê / tệp bản đồ - và mẹo để phân tích chúng)
  • Bất kỳ lời khuyên / tài nguyên khác.

EDIT : Tôi đã tìm thấy một triển khai tốt mà không cần sử dụng stdlib tại đây: /codereview/38275/convert-b between-date-time-and-time-stamp-without-use-std-l Library-routines

Các câu hỏi chung vẫn đứng mặc dù. Có hướng dẫn, nguồn lưu trữ tốt vv


Không được phép chọn cấp 1? Để biết thêm, bạn có thể có được một trong những dòng pic32 mới với nhiều đèn flash hơn. Có vẻ như xc8 bị hạn chế hơn so với trình biên dịch 16 và 32.
Erik Friesen

1
@ErikFriesen Cảm ơn tôi chắc chắn sẽ thử phạm vi pic32 sau này. Bây giờ tôi muốn thử làm cho nó hoạt động với pic18. Tôi cũng quan tâm đến điều này một cách chung chung. Tức là sẽ luôn có một số hạn chế về không gian và tôi muốn hiểu cách cải thiện mọi thứ
Andre

1
Chúng tôi có một giấy phép của XC8 pro mà anh chàng firmware chính của chúng tôi sử dụng. Phần còn lại của chúng tôi phát triển với phiên bản miễn phí cho những thứ nhỏ hơn, và anh ấy kéo và biên dịch nếu cần thiết để tối ưu hóa. Dường như với tôi, trình biên dịch áp dụng tất cả tối ưu hóa trong phiên bản miễn phí, nhưng chèn một loạt các hướng dẫn chi nhánh. Vì vậy, việc tháo gỡ từ các phiên bản pro và miễn phí trông giống nhau, phiên bản miễn phí chỉ có một loạt các nhánh nhảy xung quanh. Bạn có thể lấy bất cứ chức năng nào bạn cần từ thư viện thời gian và tự quay. Hầu như luôn luôn tiết kiệm không gian để có được ở đó.
Matt Young

Cảm ơn @MattYoung, vâng tôi nghĩ rằng câu trả lời cho các thư viện sẽ có khá nhiều chỉ là google cho các giải pháp hiện có / các stdlib khác và sửa đổi từ đó. Có vẻ như tiết kiệm không gian sẽ là đáng kể. Tôi ngạc nhiên rằng không có nhiều sự khác biệt giữa các đầu ra miễn phí và chuyên nghiệp. Tôi đã thấy rất nhiều ý kiến ​​/ khiếu nại ngược lại. Rất thú vị.
Andre

Tôi chỉ so sánh rộng rãi hai trong một vài ứng dụng trong đó thời gian là rất quan trọng, nhưng đó là những phát hiện của tôi. Nó chắc chắn sẽ có giá trị đọc thêm.
Matt Young

Câu trả lời:


2

Dưới đây là một số điều tôi đã làm khi sử dụng trình biên dịch Microchips C18. Có thể các khái niệm sẽ áp dụng cho trình biên dịch của bạn: - khai báo mỗi chuỗi một lần. Đặt trong một tệp .c riêng và sử dụng tệp .h để tham chiếu chúng. Nói cách khác, không trùng lặp thông báo hiển thị nhiều lần. - khai báo chuỗi để chúng đi trong rom. Điều này sẽ không giúp bạn với ROM (không gian mã) nhưng nó sẽ tiết kiệm bộ nhớ. - Viết mã chặt chẽ. Nếu một vài dòng mã được sao chép, hãy đặt chúng vào một hàm. Sao chép / dán không cần thiết một người bạn tốt nhất của lập trình viên nhúng. - giống như bạn đã nghĩ, thực hiện các chức năng của riêng bạn thay vì bao gồm một thư viện. Tôi đã từng tiết kiệm được một tấn không gian bằng cách tạo hàm itoa () của riêng tôi. Cố gắng không sử dụng printf.


3

Tôi đã thực hiện một số tìm kiếm xung quanh và đây là những lời khuyên tôi có thể tìm thấy

  1. Viết mã tốt hơn. Kích thước mã và tốc độ phải được xem xét ở mỗi bước trên đường đi.
  2. Trình biên dịch / liên kết C sẽ chỉ sử dụng các chức năng bạn thực sự sử dụng. Vì vậy, chỉ bao gồm một .h không nên tăng kích thước mã (nhiều)
  3. Tuy nhiên, các chức năng tiêu chuẩn thường chung chung hơn bạn yêu cầu. Có thể viết các phiên bản nhỏ hơn chỉ làm những gì bạn yêu cầu
  4. Chuỗi được chia sẻ theo câu trả lời của @ BrianK

Sau đó, có một số lựa chọn thay thế không giải quyết được vấn đề cốt lõi về kích thước mã nhưng có thể cần được xem xét nếu tất cả các cách khác đều thất bại

  1. Sử dụng PIC có nhiều không gian hơn
  2. Sử dụng trình biên dịch tối ưu hóa, ví dụ MPLAB Pro
  3. Sử dụng trình biên dịch mã cho một số hoặc tất cả mã

Tôi vẫn muốn một cách dễ dàng để xem các chức năng và các chức năng bao gồm đang sử dụng nhiều không gian nhất. Tôi sẽ cập nhật ở đây nếu tôi tìm thấy một cách dễ dàng để làm như vậy.


2

Việc triển khai phiên bản chức năng tiêu chuẩn của riêng bạn thay vì bao gồm toàn bộ thư viện có thể giúp ích. Có một triệu tối ưu hóa nhỏ hơn, cụ thể hơn mà bạn có thể thực hiện, nhưng một bộ sưu tập tài liệu tham khảo tốt về các loại thủ thuật đó là cuốn sách Hacker's Delight . Điều đó rất thực tế (đặc biệt đối với việc xoay vòng một chút như bạn thường làm trên vi điều khiển) và tôi khuyên bạn nên làm điều đó.


2
Tôi có phiên bản đầu tiên của Hacker's Delight (và thích nó). Bất kỳ ý tưởng về sự khác biệt trong phiên bản thứ hai? Có đáng để nhận nếu tôi có cái đầu tiên không?
tcrosley

Tôi không có phiên bản đầu tiên, nhưng tôi tin rằng phiên bản thứ hai bổ sung một loạt các tài liệu mới cũng như một số tinh chỉnh của bản gốc.
aloishis89

Không có thứ gọi là "bao gồm toàn bộ thư viện", chỉ có các chức năng bạn sử dụng sẽ được liên kết với chương trình. Hãy nhớ rằng thư viện std cho trình biên dịch của bạn có lẽ được tối ưu hóa cho mục tiêu cụ thể. Dường như việc viết phiên bản của các chức năng đó sẽ tiết kiệm không gian. Nhiều khả năng nó sẽ làm điều ngược lại.
Lundin

2
@Lundin đó là sự thật. Tức là khi tôi sử dụng strfmttime, tôi thấy kích thước tăng lên rất nhiều so với chỉ sử dụng gmtime, v.v. Tuy nhiên tôi không đồng ý với tuyên bố chung rằng viết libs của riêng bạn sẽ không giúp ích gì. Không chắc là tôi có thể tạo ra một tính năng hiệu quả hơn để thay thế tính năng. Tuy nhiên tôi chỉ cần một tỷ lệ nhỏ của chức năng được cung cấp. (Mã múi giờ vv được bao gồm dưới dạng gmtime, v.v. giả sử rằng). Tôi đã có thể viết một tập hợp con nhỏ được nhắm mục tiêu của chức năng và tiết kiệm 20% không gian sử dụng. Vì vậy, viết một tập hợp con tối thiểu là khả thi. Điểm tốt về liên kết mặc dù. Cảm ơn
Andre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.