Tôi đang tìm cách chuyển thanh ghi thiết bị nhúng vào mẫu C++, sử dụng gcc 4.8.4. Trong các bảng dữ liệu mô tả các thiết bị nhúng, các địa chỉ của thanh ghi thường được cho là các vị trí bộ nhớ thô (ví dụ 0x40008000).Đăng ký làm thông số mẫu
Khi tôi kiểm tra phần mềm, tôi muốn sử dụng số nguyên tĩnh làm thanh ghi để xem liệu giá trị đăng ký có được đặt chính xác hay không.
Vì vậy, về cơ bản một wrapper xung quanh một số thiết bị ngoại vi nắm để một lớp học với nó địa chỉ đăng ký được cho là mẫu tham số:
template < volatile std::uint32_t* Reg >
struct peripheral {};
Kiểm tra hoạt động tốt:
std::uint32_t reg;
peripheral< ® > mocked;
Nhưng khi tôi muốn nhanh chóng mẫu có địa chỉ cố định, bảng dữ liệu được cung cấp:
peripheral< reinterpret_cast< std::uint32_t* >(0x40008000) > mocked;
gcc than phiền: could not convert template argument '1073774592u' to 'volatile uint32_t* {aka volatile long unsigned int*}
. clang không phàn nàn về điều này.
Nếu tôi sử dụng địa chỉ đưa ra là số nguyên như mẫu tham số, tôi có vấn đề để nhanh chóng các mẫu trong thử nghiệm của tôi với địa chỉ của thanh ghi chế giễu:
template < std::intptr_t Reg >
struct peripheral {};
std::uint32_t reg;
peripheral< reinterpret_cast<std::intptr_t>(®) > mocked;
kết quả này trong error: conversion from pointer type 'uint32_t* {aka long unsigned int*}' to arithmetic type 'intptr_t {aka int}' in a constant-expression
.
tôi có thể nghĩ đến hai giải pháp này:
1) Sử dụng con trỏ như tham số mẫu, sử dụng các biến toàn cầu như đăng ký và sửa chữa các địa chỉ của các thanh ghi với một số mối liên kết kịch bản kỳ diệu.
2) Sử dụng các loại đăng ký đặc biệt có giao diện chung cho mẫu ngoại vi nhưng có hai cách triển khai rất khác nhau để thử nghiệm và cho ứng dụng thực.
Nhưng tôi đang tìm cách dễ dàng hơn để thực hiện việc này. Bất kỳ ý tưởng, con trỏ hoặc ý kiến?
Hãy nhớ rằng loại con trỏ phải luôn biến động. Điều này có thể là nguyên nhân của một số vấn đề. – Lundin
Cảm ơn bạn đã chỉ ra điều này. –
Nhưng đó không phải là vấn đề gây ra lỗi biên dịch. Mỗi Pointer to T sẽ được chuyển đổi thành 'volatile T'. –