2013-09-22 4 views
0

Я изучал УНЦ/OS и прочитать эту статью:Как сделать типы моих данных не зависит от компилятора в с

Поскольку различные микропроцессоры имеют разные длина слова, порт из мкКл/OS-II включает серию определений типов, обеспечивающих переносимость . В частности, код μC/OS-II никогда не использует короткие, int и длинные типы данных C, поскольку они по своей сути не переносят. Вместо этого я определил целые типы данных, которые являются как портативными, так и интуитивно понятными, как показано в листинге 1.1. Кроме того, для удобства, Я включил типы данных с плавающей точкой, хотя μC/OS-II не использует плавающие точки. Является листинг 1.1

typedef unsigned char BOOLEAN; 
typedef unsigned char INT8U; 
typedef signed char INT8S; 
typedef unsigned int INT16U; 
typedef signed int INT16S; 
typedef unsigned long INT32U; 
typedef signed long INT32S; 
typedef float FP32; 
typedef double FP64; 
#define BYTE INT8S 
#define UBYTE INT8U 
#define WORD INT16S 
#define UWORD INT16U 
#define LONG INT32S 
#define ULONG INT32U 

Мои вопросы Ниже:

1- Что писатель означает, длиной слова (первые дерзкие слова в моем вопросе тела)?!

2- Почему короткие int и длинные типы данных по своей сути не переносятся.

3- Is typedef - это директива микропроцессора, и если это то, что является ее функцией?!

4 Могу ли я написать typedef unsigned char (anything) вместо typedef unsigned char INT8U;

5 Почему код автора typedef unsigned char INT8U;, а затем #define UBYTE INT8U я не могу использовать это непосредственно typedef unsigned char UBYTE;

6- Существует двойной использование typedef unsigned char один из них - typedef unsigned char INT8U;, а другой typedef unsigned char BOOLEAN; Почему он это сделал ?!

+0

Не могли бы вы ответить на вопросы 5 и 6 тоже! @goldilocks –

+1

5- Я не читал бы слишком много в технике автора здесь. Это всего лишь вопрос предпочтения человека. Автор использовал typedef для определения типов данных фиксированной ширины, а затем использовал макросы для связывания другого набора терминов (BYTE, WORD и т. Д.) С типом данных фиксированной ширины. Да, вы можете использовать typedef для определения BYTE и WORD, если это ваше предпочтение. – kkrambo

+1

6- Автор хотел определить типы данных для 8-разрядной переменной ширины и логического (одноразрядного), потому что это может потребоваться для любой конкретной абстракции программного обеспечения. Он планирует написать код на уровне абстракции выше базового типа данных. Поэтому, когда его код требует переменной TRUE/FALSE, он будет использовать Boolean. И когда его код требует 8-битной переменной, он будет использовать INT8U. Оба эти типа оказываются одинаковыми, но использование абстрактных типов добавляет больше значения в исходный код. Когда вы просмотрите его код и увидите логическое значение, вы узнаете, что это переменная TRUE/FALSE. – kkrambo

ответ

3

1- Что писатель означает, по длине слов

Слово является основной ячейкой памяти, как a page - на самом деле, есть статья on word тоже, что я не пересказываю. Значение для C, как ваш автор, говорит о том, что это не всегда одно и то же, но оно определяется характеристиками оборудования. Возможно, это одна из причин, по которой стандарт C не диктует буквальный размер базовых типов; наиболее очевидным из них является размер указателей, которые будут 4 байта в 32-битных системах и 8 на 64-битных системах, чтобы отразить размер адресного пространства.

2- Почему короткие и длинные типы данных по своей природе не переносятся.

Более точно: они, как переносимый C но их размер не нормируется, которые могут сделать их бесполезными для многих применений, где требуется фиксированный определенный размер.

3- Является ли typedef директивой микропроцессора, и если это то, что является его функцией?!

Нет, это не директива процессора. Это приятный кусок syntactic sugar, который позволяет вам определять пользовательские типы.

4- Могу ли я написать typedef unsigned char (ничего) вместо typedef unsigned char INT8U;

Да, это идея. Помните, что стандарт C даже не определяет размер символа, хотя я никогда не слышал о реализации, где это ничего, кроме 8 бит [но кто-то в комментариях имеет].

5- Почему авторский код typedef unsigned char INT8U; а затем #define UBYTE INT8U не могу использовать этот непосредственно typedef unsigned char UBYTE;

Вы могли бы, да. Возможно, автор хотел ограничить количество мест, где такой тип определен. Поскольку использование #define является предпроцессорной директивой, оно также может слегка упростить исполняемый файл (хотя и не до такой степени, который можно было бы считать общезначимым).

6- Существует двойной тип typedef unsigned char, один из которых - typedef unsigned char INT8U; и другой typedef unsigned char BOOLEAN; Почему он это сделал?!

Опять же, использование typedefs много о «сахаре»; они могут сделать ваш код более чистым, более легким для чтения и (предположительно, они выполнены правильно), более надежными. «Boolean» - это выраженный в математике термин CS для типа, который имеет только два значимых значения, ноль (false) или не равен нулю (true). Таким образом, теоретически можно было бы реализовать всего лишь один бит, но это нелегко и, в конце концов, эффективно (потому что нет процессоров с 1-битными регистрами, в любом случае им придется нарезать кости и подделку). Определение типа «bool» или «boolean» является обычным в C и используется для обозначения того, что значение значения является либо истинным, либо ложным - оно хорошо работает с, например, if (var) (true) и if (!var) (false), так как C уже оценивает этот способ (0 и NULL - это единственные значения, которые пройдут if (!var)). Принимая во внимание, что использование чего-то типа INT8U указывает, что вы имеете дело со значением, которое варьируется от десятичного от 0 до 255, так как оно без знака. Я думаю, что введение U аванса является более распространенной практикой (UINT8), но если вы привыкли к концепциям, то это достаточно понятно. И, конечно, typedef/define не сложно проверить.


О stdint.h

целочисленных типов являются те, с наибольшим диапазоном изменения, а на самом деле стандарт ISO C требует, чтобы реализация включает в себя определения для целочисленных различных типов с определенными минимальными размерами в stdint.h. У них есть имена, такие как int_least8_t. Конечно, для многих вещей требуются типы с реальным размером (а не только минимум), и большинство распространенных реализаций предоставляют их. В стандарте C99 указывается, что если они доступны, они должны быть доступны через имена по шаблону intN_t (подписано) и uintN_t (без знака), где N - это количество бит. Подписанные типы также указаны как two's complement, поэтому можно работать с такими значениями во всех видах высоконагруженных способов.

Как последнее замечание, хотя я не знаком с MicroC, я бы не взял эту документацию как представитель C вообще - она ​​предназначена для использования в несколько ограничительной и специализированной среде (16-битный int, подразумеваемый typedefs, необычен, поэтому, если вы запустили этот код в другом месте, INT16U может быть 32-битным и т. д.). Я бы предположил, что MicroC соответствует только ANSI C, который является самым старым и самым минимальным стандартом; очевидно, у него нет stdint.h.

+0

ваше описание 'stdint.h' идет немного в неправильном направлении. Он имеет как точные, так и минимальные значения. Что-то вроде 'uint32_t' - это точный тип ширины, тогда как' uint_least32_t' будет иметь тип не менее 32 бит. –

+0

Можно также добавить, что способ, которым это делается в цитированном коде, устарел и должен быть заменен типами, определенными в 'stdint.h'. –

+2

@ goldilocks Использование компилятора TI для некоторых из их DSP дает 16-бит 'char' @Jens' stdint.h', в основном делает это все пользовательское решение ненужным. Похоже, что фактический код здесь представляет собой реализацию, основанную на уникальных свойствах данного компилятора, то есть это платформенный клей для достижения переносимой базовой линии. –

 Смежные вопросы

  • Нет связанных вопросов^_^