
- •050201 «Системная инженерия»
- •1. Цель работы
- •2. Постановка задачи
- •3. Краткие теоретические сведения
- •3.1. Компиляция программ с помощью gcc
- •3.2. Анализ параметров вызывающей командной строки
- •3.3. Поразрядные операции
- •4. Пример программы
- •4.1. Функция упаковки
- •4.2. 4.2. Функция распаковки
- •Приложение а (справочное) Текст программы
4. Пример программы
Устройство сообщает о своем состоянии с помощью нескольких чисел.
Например, пусть состояние устройства представляется в виде:
C – код состояния (число в диапазоне от 0 до 31);
F – признак ошибки (1/0) ;
B – признак занятости (0/1);
N – количество байт, переданных в последней операции (число в диапазоне от 0 до 255).
Эти числа объединяются в одно слово состояния устройства, формируемое таким образом:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
C |
C |
C |
0 |
F |
B |
N |
N |
N |
N |
N |
N |
N |
N |
Составить две функции, первая из которых вводит составные части слова состояния (код состояния, признак ошибки, признак занятости, количество байт) и формирует из них заданную упакованную структуру. Вторая функция вводит упакованную структуру как 16-ричное число и выводит значения ее составных частей.
Программа должна вызывать функцию упаковки при указании опции -р в командной строке, а функцию распаковки – при указании опции -u.
Полный текст программы приведен в приложении.
4.1. Функция упаковки
Нам будут нужны переменные, в которых будут храниться составные части кода. Для сохранения всех составных частей будет будем использовать тип unsigned . Диапазоны возможных значений этих переменных:
c - код состояния - 0 ...31
f - признак ошибки - 0, 1
b - признак занятости - 0, 1
n - количество байт - 0 ... 255
Нужна также переменная для сохранения результирующего кода слова состояния устройства UnitStateWord. Это 2-байтная переменная, у которой старший разряд используется как кодовый, а не как знаковый. Так что, эта переменная должна быть типа unsigned .
Алгоритм функции состоит из таких шагов:
1. Ввод значений составных частей слова состояния устройства. Для каждой составной части нужно вывести приглашение на ввод и ввести данные.
2. Занесение в слово состояния устройства кода состояния. У переменной, которая хранит значение кода состояния, нужно выделить 5 младших разрядов - это можно сделать, выполнив операцию "побитовое логическое И" между значением переменной и двоичной константой 00011111 (16-ричной константой 1F). Потом полученное значения следует сдвинуть на 11 разрядов влево.
UnitStateWord=(c&0x1F)<<11;
3. Занесение в слово состояния устройства признака ошибки. В переменной - признаке ошибки выделить один младший разряд - операция "побитовое логическое И" с константой 1. Полученное значение сдвинуть на 9 разрядов влево. Чтобы добавить полученный код к тому коду, который уже получен на предыдущем шаге, нужно выполнить операцию "побитовое логическое ИЛИ" между предыдущим значением слова состояния устройства и полученным кодом.
UnitStateWord|=(f&1)<<9;
4. Занесение в слово состояния устройства признака занятости. В переменной - признаке занятости выделить один младший разряд. Полученное значение сдвинуть на 8 разрядов влево и добавить к тому коду, который получен на предыдущем шаге .
UnitStateWord|=(b&1)<<8;
5. Занесение в слово состояния устройства количества байт. В переменной - количестве байт выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение добавить к тому коду, который уже есть.
UnitStateWord|=n&0xFF;
Отметим, что если значения составных частей кода, введенные оператором, не выходят за диапазон допустимых для них значений, то операция выделения младших байтов излишня. Но мы предусматриваем ее на случай ошибок оператора.