Читайте конкретные значения с данного адреса? - PullRequest
0 голосов
/ 19 сентября 2019

Учитывая 16-битный адрес (адрес памяти, а не значение) 0x1144, 16-битный делится на тип Бит 15-бит 16, модуль бит 9 - бит 14, групповой бит 1 - бит 8

Тип= Бит 15 - Бит 16

Модуль = Бит 9 - Бит 14

Группа = Бит 1 - Бит 8

Считать и распечатать значения в следующих переменных.

uint16_t Type;
uint16_t Module;
uint16_t Group; 

Как читать и печатать значения, используя C.

Я пробовал с

uint16_t *ptr = 0x1144;
Type = *ptr >> 14;
Module = *ptr << 2;
Module = Module >> 10;
Group = *ptr << 8;
Group = Group >> 8;

Это правильно?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Вы можете использовать битовые поля в C, которые довольно часто используются при адресации отдельных битовых позиций в регистрах HW.Просто смоделируйте ваши битовые позиции в struct, определив ниже (на моей машине с прямым порядком байтов)

typedef struct {
    uint16_t group:8;
    uint16_t module:6;
    uint16_t type:2;
}nwGroup ;

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

uint16_t *val = (uint16_t *)0x1144;
nwGroup  *ptr = (nwGroup*)(val);
printf("NW group: %d\n", ptr->group);
1 голос
/ 19 сентября 2019

(Примечание: мы обычно нумеруем вещи, начиная с 0, в компьютерных науках, поэтому я интерпретировал ваши требования с нуля.)

Используйте комбинацию маскирования и сдвига.Например, если вы хотите иметь возможность восстановить значение NetworkModule, создайте маску, содержащую 1 бит в нужных вам позициях и 0 битов везде:

#define NetworkModuleMask 0x3E00  // that is, 0011 1110 0000 0000

Теперь вы можете использовать эточтобы замаскировать нежелательные биты, используя побитовое AND:

int address = 0x1144;
int networkModule = address & NetworkModuleMask

Другой способ сделать это, который по сути эквивалентен, состоит в использовании операторов деления и по модулю со степенями 2. Например, ваша NetworkGroup является

Затем, чтобы интерпретировать значение как число, вам нужно сместить его вправо на 9 бит:

#define NetworkModulePosition 9
networkModule = networkModule >> NetworkModulePosition

Вы можете использовать аналогичный процесс для создания адреса, используя значения компонентов:сдвиньте каждую часть в положение, а затем поразрядно ИЛИ в адрес.

Вы также можете решить задачу арифметически, используя операторы деления и по модулю со степенями 2. Деление целого числа на степень 2 равносдвигая его вправо на некоторое количество битов, и по модулю на степень 2 то же самое, что сдвигать некоторое количество битов вправо и затем очищатья число бит слева, так что вы в конечном итоге делаете то, что мы сделали выше.Например, ваше значение NetworkGroup является младшими 8 битами адреса, поэтому вы можете восстановить его, взяв адрес mod 2 ^^ 8 или 256. NetworkType - это старшие 2 бита, и вы можете восстановить эторазделив адрес на 2 ^^ 14 или 16384.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...