8-битный процессор должен сталкиваться с проблемой порядка байтов? - PullRequest
4 голосов
/ 19 марта 2010

Если у меня в памяти 8-разрядного процессора есть целое число типа int32, скажем, 8051, как я могу определить последовательность этого целого числа? Это зависит от компилятора? Я думаю, что это важно при отправке многобайтовых данных через последовательные линии и т. Д.

Ответы [ 7 ]

7 голосов
/ 19 марта 2010

С 8-битным микроконтроллером, который не имеет встроенной поддержки более широких целых чисел, порядковый номер целых чисел, хранящихся в памяти, действительно зависит от автора компилятора.целые числа в формате с прямым порядком байтов (в руководстве пользователя этого компилятора утверждается, что он более эффективен в этой архитектуре благодаря наличию инструкции для увеличения указателя данных, но не инструкции для уменьшения).

5 голосов
/ 19 марта 2010

Если процессор имеет какие-либо операции, которые воздействуют на многобайтовые значения, или имеет многобайтовые регистры, он может иметь порядковый номер.

http://69.41.174.64/forum/printable.phtml?id=14233&thread=14207 предполагает, что 8051 смешивает различные порядковые номера в разных местах.

3 голосов
/ 19 марта 2010

Дело не только в компиляторе - в '51 есть некоторые собственные 16-битные регистры (DPTR, ПК в стандарте, ADC_IN, DAC_OUT и т. Д. В вариантах) с заданным порядком байтов, которому должен подчиняться компилятор - но вне этого, компилятор может использовать любой порядок байтов, который он предпочитает, или тот, который вы выбираете в конфигурации проекта ...

3 голосов
/ 19 марта 2010

Порядковый тип характерен для архитектуры процессора. Поскольку компилятор должен ориентироваться на конкретный процессор, компилятор также должен знать о порядке байтов. Поэтому, если вам нужно отправить данные по последовательному соединению, сети и т. Д., Вы можете использовать встроенные функции, чтобы поместить данные в сетевой порядок байтов - особенно если ваш код должен поддерживать несколько архитектур.

Для получения дополнительной информации см .: http://www.gnu.org/s/libc/manual/html_node/Byte-Order.html

2 голосов
/ 19 марта 2010

Целое число не имеет порядкового номера. Вы не можете определить, просто посмотрев на байты, является ли он старшим или младшим. Вам просто нужно знать: например, если ваш 8-битный процессор имеет порядок с прямым порядком байтов и вы получаете сообщение, которое, как вы знаете, имеет порядок с прямым порядком байтов (потому что, например, система полевой шины определяет порядковый номер с прямым порядком байтов), вы должны преобразовать значения более 8 бит. Вам нужно будет либо жестко его кодировать, либо определить в системе какое-либо определение, на какие байты нужно поменяться.

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

1 голос
/ 22 апреля 2010
unsigned long int x = 1;
unsigned char *px = (unsigned char *) &x;

*px == 0 ? "big endian" : "little endian"

Если x присвоено значение 1, то значение 1 будет в младшем байте. Если мы затем приведем x к указателю на байты, указатель укажет на самую низкую ячейку памяти x. Если эта ячейка памяти равна 0, то она имеет порядковый номер с прямым порядком байтов, в противном случае она имеет порядок байтов.

0 голосов
/ 19 марта 2010
#include <stdio.h>

union foo {
    int as_int;
    char as_bytes[sizeof(int)];
};

int main() {
    union foo data;
    int i;
    for (i = 0;  i < sizeof(int);  ++i) {
        data.as_bytes[i] = 1 + i;
    }
    printf ("%0x\n", data.as_int);
    return 0;
}

Интерпретация вывода зависит от вас.

...