cuốn sách gpt4 ai đã làm

Thay đổi kích thước mã khi sử dụng con trỏ xa trong C

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 08:15:32 hai mươi bốn 4
mua khóa gpt4 Nike

Tôi làm việc trong bộ phận của một công ty phần mềm tập trung vào thiết kế mạng ô tô. Chúng tôi chủ yếu sử dụng C để viết ngăn xếp giao thức mạng. Gần đây, tôi được giao một dự án yêu cầu sử dụng Bộ điều khiển HC12 của Freescale. Ngăn xếp giao thức ban đầu được viết để hỗ trợ việc sử dụng RAM không có ngân hàng cũng như bộ nhớ flash có ngân hàng và không có ngân hàng. Trong dự án được giao cho tôi, khách hàng đã yêu cầu RAM có ngân hàng thay vì RAM không có ngân hàng (tôi không biết tại sao). Khi tôi đang phát triển dự án này, tôi nhận ra rằng tôi có thể sử dụng con trỏ xa để truy cập (đọc/ghi) RAM được lưu trữ.

câu hỏi của tôi là:Kích thước mã thư viện của tôi tăng thêm 10kbyte khi tôi sử dụng con trỏ xa để truy cập RAM ngân hàng bộ nhớ. Điều này có bình thường không? Trong tài liệu tham khảo về trình biên dịch tôi đang sử dụng (codewarrior), kích thước của con trỏ xa được đề cập là 3 byte, trong khi kích thước của con trỏ bình thường là 2 byte. Liệu 1 byte bổ sung này có thực sự gây ra sự khác biệt lớn về kích thước mã không? Có cách nào khác không liên quan đến việc sử dụng con trỏ xa mà tôi vẫn có thể truy cập vào RAM được lưu trữ không?

Bất kỳ câu trả lời hữu ích cho câu hỏi của tôi sẽ được đánh giá rất cao.

câu trả lời hay nhất

Ban đầu, bộ nhớ được phân vùng trên HCS12 chỉ được sử dụng cho mã chương trình trong bộ nhớ flash, trong trường hợp đó bạn sẽ không nhận thấy sự khác biệt lớn về kích thước chương trình. Điểm khác biệt duy nhất là các lệnh gọi chương trình con yêu cầu sử dụng các lệnh bộ nhớ lưu trữ (CALL, RTC thay vì JMP, RTS) và mỗi lệnh gọi hàm yêu cầu thêm một vài byte bộ nhớ chương trình.

Sau đó, họ phát hành các thiết bị có cả flash ngân hàng và RAM ngân hàng (một số HCS12X, v.v.). RAM rõ ràng là dành cho dữ liệu chứ không phải bộ nhớ chương trình.

Vấn đề là HCS12 là CPU 16 bit nên không thể dễ dàng xử lý các con trỏ dữ liệu 24 bit. Điều này có nghĩa là tất cả các mã xử lý dữ liệu trong bộ nhớ ngân hàng sẽ trở nên khá kém hiệu quả: đối với mỗi lần truy cập (thông qua con trỏ "xa", v.v.), nó sẽ phải đặt thanh ghi trang, đại diện cho mức cao nhất của 24-bit. địa chỉ 8 bit. Sau khi hoàn thành, nó có thể sử dụng các hướng dẫn thông thường để đọc/ghi dữ liệu vào phần 16 bit của địa chỉ và phần cứng sẽ ánh xạ nó tới đúng trang. Sau khi hoàn thành, chương trình cũng phải khôi phục thanh ghi trang.

Có vẻ như trình biên dịch không tối ưu hóa tốt quyền truy cập vào dữ liệu được phân trang - về lý thuyết, bạn có thể đặt thanh ghi trang và sau đó truy cập tất cả dữ liệu trong trang đó trước khi cần khôi phục nó. Nhưng tại thời điểm biên dịch, trình biên dịch có thể không biết chính xác biến được phân bổ ở đâu.

Bạn có thể dễ dàng xem mã được tạo thực tế bằng cách sử dụng trình dịch ngược của Codewarrior. Cũng lưu ý rằng Codewarrior luôn hoạt động không ổn định khi nói đến tối ưu hóa: không bao giờ rõ ràng tối ưu hóa nào phải được kích hoạt rõ ràng và tối ưu hóa nào được "tích hợp sẵn". Đảm bảo rằng bạn thực sự kích hoạt tất cả các tối ưu hóa có liên quan.

Nói chung, tránh lưu trữ bộ nhớ càng nhiều càng tốt. Bạn có thể sử dụng các mô hình bộ nhớ không phân vùng lên tới 64k bộ nhớ. Bộ nhớ phân trang chỉ cần thiết nếu bạn vượt quá giới hạn đó. Có thể đó là lý do tại sao khách hàng của bạn cần nó, họ có thể sắp hết RAM.

Về việc thay đổi kích thước mã khi sử dụng con trỏ xa trong C, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/35998194/

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress