2015-07-23 3 views
0

Я пишу свою собственную библиотеку C++ для чипа Atmel ATmega2560 с нуля в качестве упражнения, чтобы узнать, как это работает (и электроника в целом). В качестве части этого я хочу создать новый базовый тип byte на C++, который не является просто псевдонимом другого типа и имеет точный размер 8 бит.Возможно ли создать новый примитивный тип в C++ для встроенных платформ?

Поскольку это встроенная платформа, я хочу избежать создания дополнительных инструкций для обработки микросхем, насколько это возможно, что делает классы и структуры неудовлетворительными. Я знаю, что я мог бы использовать тип char, но размер его неопределенно определен («хотя бы один байт», а размер байта может варьироваться между платформами) по стандартам C++, и я не уверен, как платформа AVR рассматривает его; хотя я подозреваю, что unsigned char будет 8 бит, так как большинство регистров составляет 8 бит. Есть и другие причины, по которым я бы предпочел не использовать unsigned char.

По сути, то, что я хотел бы сделать, как только моя библиотека функционирует что-то вроде:

int main() 
{ 
/* PORTB is global object instantiated in my lib that unifies handling the Data Register and Data Direction Register for PORTB pins on the chip. PORTD is similar, just memory addresses of registers are different */ 
    PORTB.setDDR(0); // All pins are inputs. 
    PORTD.setDDR(0xFF); // All pins are outputs. 
    byte b = PORTB.read(); 
    b |= 0b10011000; 
    PORTD.write(b); 

    return 0; 
} 

Будучи в состоянии неявно в/из междунар и других основных типов будет бонус, но, вероятно, не необходимо. Возможно ли это сделать, если не использовать forr-gcc и писать в новом внутреннем типе?

Примечание: У меня есть полная спецификация для ATmega2560, которая включает в себя список набора инструкций. Я не боюсь использовать встроенную сборку, если это необходимо, но предпочел бы не работать (в конце концов, я только человек) и соображениями лучших практик.

Я смог найти this question, но это все еще просто наложение псевдонимов и не дает никакого контроля над фактическим размером этого типа. В некоторых ответах также упоминается использование Boost lib; Я не уверен, что Boost работает на AVR, и я не хочу полагаться на другие библиотеки, поскольку это побеждает цель писать мои собственные с нуля.

+5

«размер [char'] неопределенно определен», нет, это ровно 1 байт, независимо от платформы. Возможно, вы думаете о октете. Если да, просмотрите . –

+2

Если вы не пишете собственный компилятор, вам не нужно беспокоиться об этом, ваш компилятор уже получил его. –

+0

Я не думаю, что это хорошая идея для программирования AVR на C++. Из-за внешней Гарвардской архитектуры это добавит довольно немного накладных расходов (не говоря о Flash и, возможно, ОЗУ). Для типов: читайте о 'stdint.h'. Там у вас есть профили с нулевым размером. – Olaf

ответ

0

№№ Все типы в C++ либо определяются стандартом («примитивные типы», но также указателями и функциями), расширенными типами, определенными реализацией (__int128) или определяемыми пользователем типами (классы, структуры, объединения) ,

+0

Это вызывает вопрос, исключая определяемые пользователем типы. Никакой тип на C или C++ не является «просто псевдонимом другого типа»; 'typedef' реализует псевдонимы, но не создает типы. – Potatoswatter

1

Перечисления с фиксированным базовым типом может соответствовать вашим требованиям:

enum byte : unsigned char {}; 

Однако ваши концептуальным основы кажется немного шатким:

, и я не знаю, как AVR платформа обрабатывает его

Во встроенном программировании вы обычно уделяете больше времени изучению конкретной платформы. Это безопасная ставка, что char ровно восемь бит на 8-битной платформе, но действительно вы должны найти руководство, которое на самом деле так говорит.

/* PORTB - это глобальный объект, созданный в моей библиотеке, который объединяет обработку регистра данных и регистра данных данных для контактов PORTB на чипе. PORTD аналогичен, только адреса памяти регистров различны */

Это не работа вашей библиотеки. Поставщик чипов, как правило, лучше знает, когда дело доходит до их собственного оборудования и компиляторов, которые они поддерживают. Используйте официальные библиотеки.

Это может быть веселое упражнение для создания вашей собственной библиотеки времени исполнения с использованием компилятора в качестве основы, но вы действительно не хотите развивать и поддерживать это на бесконечность.

+0

Исправьте меня, если я ошибаюсь, но IIRC, 'enum' в C++ разрешил бы назначать свои константы, как определено. Таким образом, вы не можете комбинировать биты и т. Д., Как вы можете сделать на C (где вы не можете указать базовый тип otoh.На самом деле вам придется предоставить константы для всех возможных значений. – Olaf

+0

@Olaf Нет, перечисления C++ - совместимый с C. Стандарт C++ даже перечисляет благословения, позволяя им реализовывать типы биттов в 'std ::'. – Potatoswatter

+0

Хм ... Я действительно был уверен, что это одно из главных отличий. Мне действительно нужно обновить свои знания на C++ – Olaf