Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mcs51_1 / Пособие ч1.doc
Скачиваний:
59
Добавлен:
21.03.2016
Размер:
957.44 Кб
Скачать

2.Высокоуровневая программная модель в с51.

2.1. Организация памяти и размещение информации в с51

Диаграмма MCU(рис.2.1.) представляет иерархию памяти и средства ввода-вывода, которые доступны на программном уровне в виде операторов и резервированных переменных языка С51.

Ссылаясь на архитектуру mcs51, в дальнейшем будем иметь ввиду базовую архитектуру(ядро) [ Википедия ].

Традиционно используется конструктивное разделение памяти на внутреннюю (в кристалле MCU) и внешнюю, где (используются дополнительные схемы памяти на печатной плате. В дальнейшем внешняя память интегрируется в одном кристалле с MCU частично или полностью, поэтому их смысл (внутренняя-внешняя изменяется).

Все типы памяти отличаются объемом и способом доступа.

SFR Code

бит

Data

Idata Xdata

Tmod Usart

Tcon P0 P1 P2 P3

Рис. 2.1. Программная модель ЭВМ в С51.

В отличие от классической Неймановской архитектуры разделены адресные пространства памяти программ Code и данных (Data , Idata, Xdata).

1) Data – память данных, режимы использования чтение и запись, объем 128 байт, быстрая по сравнению с другими типами памяти.

Часть ячеек памяти имеет побитовый доступ – поле бит.

Idata обозначает в mcs51 косвенный доступ к Data через регистровую память и имеет смысл только в С51. В mcs52 обозначает расширенную память 256 байт с косвенным доступом.

2) Регистровая память SFR (8-разрядные регистры специальных функций) – 128 байт адресное пространство. В С51 и Ассемблере А51 резервированы

идентификаторы специальных регистров, используемые в периферии и системных модулях, в том числе 8-разрядные порты ввода-вывода P0, P1,P2,P3, регистры управления таймерами Tmod,Tcon, регистры управления последовательным интерфейсом Usart и др.(Приложение 2)

Все занятые регистры SFR определены в файле reg51.h

Остальные регистры свободны и определяются для доступа в С51 как

sfr xx=0x81; //поименован свободный байт для доступа

sfr16 tt= TH0; //обозначен формат из двух байтов — TH0.TL0

sfr16 yy=0xab; //поименованы 2 свободных байта для доступа

Часть регистров имеет побитовый доступ в поле бит. Биты управления в управляющих регистрах идентифицируются для прямого доступа. Например,PSW=C.AC.F0.RS1.RS0.OV.-.P. Прямые адреса этих регистров в

С51 задаются в заголовочном файле системы Keil (#include <reg51.h> или #include <reg52.h>)

3) Сode -постоянная (энергонезависимая) память – 64 Кбайт адресное пространство, доступ – чтение данных, чтение и исполнение команд

4) Расширенная память данных

Xdata –– запись и чтение. 64 Кбайт адресное пространство, доступ к данным – чтение и запись

2.2.Типы и форматы данных в с51

Распределение данных в памяти задано различными типами. На высоком уровне в С51 предполагается прямой (ассоциативным) доступом к значениям данных по имени.

Тип данных, по определению (Алгол), – задает множество допустимых значений и операции преобразования. Множество значений (диапазон) определяем форматом. Таким образом, в определении данных необходимо присутствуют признаки функционального назначения (тип данных) и ихмашинноепредставление (формат) в памяти и при выполнении операций .

В алгоритмических языках приняты унифицированные идентификаторы типа данных и классификация типов данныхстандартная –машинно-независимая

1) числа для простого счета - целые, числа заданной точности — дробные, ,числа с переменным диапазоном и точностью

- байт(char) – единица информации 8 бит – целое число, код символа, единица измерения объема памяти,

сhar x; //знаковое число +/- 27 -1 8-битовый формат с фиксированной

точкой

7 0

s - x

unsigned char y; //беззнаковый двоичный код 0` 28 -1

Все регистры SFR имеют тип unsigned char по умолчанию.

int x; целое число 16-битовое (216 -1 ~ 65000, диапазон с учетом знака +/-215l 16-битовый формат с фиксированной точкой

unsigned int y; – беззнаковый двоичный код

long x; 32 битовое целое (232 -1 ~ 109) с учетом знака +/- 231

unsigned long z; беззнаковый двоичный код

К целым числам (двоичным кодам) применимы элементарные арифметические опрации (+,-,*,/ ) , поразрядные логические операции (&,|,^,~),Библиотека основных арифметических операций в целых числах встроена и естественно доступна

float число с плавающей точкой фиксированного двоичного формата 32 бита представляет в ЭВМ числа с естественной записью (с естественной запятой). В общепринятом стандарте IEEE 754 числа изменяются в диапазоне

+/- 10 +/-38

естественная запятая 12345,6789

полулогарифмическая форма 0,123456789*105 = M*m

двоичный машинный формат float M* 2+/-p

p M

31 23 0

double число с плавающей точкой удвоенного диапазона +/- 10+/-308

К числам с плавающей точкой применимы операции (+,-,*,/ ) и функции стандартной библиотеки math.h

Библиотека стандартных функций math.h содержит все необходимые в вычислениях функции с основным типом данных float (тригонометрические, трансцендентные, ….).

Тип данных может быть изменен оператором присваивания.

int x = -2500;

float y = x;

По умолчанию, в С51 численные данные размещаются в памяти Data – 128 байт

сhar x, xx[10]; //формат байт, для целых чисел – со знаком

int y,yy[5]; //формат 2 байта, для целых чисел – со знаком

long z,zz[8]; // формат 4 байта, для целых чисел – со знаком

Доступ по индексу к элементам массива y=yy[2];

беззнаковые (+), соответственно:

unsigned char x, xx[10];

unsigned int y,yy[5];

unsigned long z,zz[8];

Данные могут быть размещены и в других типах памяти программной модели

char code aa[]=”abcdef”; //текстовая константа

char xdata aa[100]; //доступ по адресу через DPTR-регистр

Тип данных, хранящихся в регистрах SFR, не определен и специфицируется при записи в переменную стандартного типа.

В следующем разделе приведены примеры тестирования описания типов данных в А51.

2) символьные данные – тексты в редакторах и компиляторах

Тексты определяются строкой символов, кодируются в виде последовательности байтов ASCII-кода, в памяти строка завершается последним кодом 0. набор стандартных функций со строками в библиотеке

string.h (cmp, cat, cpy,len,clr,spn,str….)

char code str[]=”библиотека функций” – кириллица в коде КОИ8

3) данные булевского (логического) типа

boolтип данных , кодирующий значения истинности true/false утверждений в виде отношений (<,>,!,!=,==) используется при вычислении значений логических утверждений в условных операторах (код значения true (!=0) в любом формате целого двоичного числа

Например

bool xx= (a<b)&&(!(a==c))||(c!-b); переменные - любые числа, а предикаты--отношения, переменная xx определяются значениями истинности True=1,False=0. Здесь в вычислениях используются команды условных переходов , интерпретирующие соответствующие логические операции с булевскими значениями

В С/С++ могут быть реализованы вычисления в смешанных выражениях c числами, где применяются поразрядные логические операции с разными типами данных - булевскими и числами

zxy=xy&&(!yx)||(xy-22)||(!yx+5); Здесь логика с неявным булевским типом данных (T -1/ F 0) интерпретируется командами условных переходов

zxy=xy&(!yx)|(xy-22)|(!yx+5); Здесь используются поразрядные логические операции T(!=0), F(=0) и результат - число.

В С51 булевский тип (bool) не используется - вместо него применяется битовый тип Bit.

Биты упорядочены в поле , состоящем из 128 бит (16 байтов) в памяти Data и 128 бит в регистрах SFR

1/ bit x1,x2; //определение битовых переменных в битовом поле Data 00-7f

2/ char bdata mem //ячейка в Data c битовой адресацией

sbit y1= mem^0; //0-ой бит ячейки mem

3/ Часть регистров SFR с адресами кратными 8 бит-адресуемые. Биты доступны по именам, определяемым явно или по умолчанию в соответствующих регистрах

sbit y1=P1^2; //второй бит порта Р1

PSW=C.AC.F0.RS1.RS0.OV.-.P - зарезервированные имена битов в регистре PSW

sfr x=0xf0; //свободный бит-адресуемый регистр sfr

sbit x1=x^0;

тест на применение

x=0x55;

if(x1) x1=0;

4) Список целых констант

enum mm {x1=25, x2=33, x4=48};

5) Cтруктура определяет многоуровневую иерархическую организацию данных, например, описание модуля MCU

#include <reg51.h>

#include <stdio.h>

struct mcu {

char name[8];

int format;

int pin;

};

main()

{

code struct mcu MM ={"80c51BH", 8, 32};

TI=1;

printf("тип %s\n ", MM.name); //вывод через UART

printf("формат %d\n ", MM.format);

printf("пин %d\n", MM.pin);

while(1); //динамический останов

}

На языке С51 доступ к рассмотренным типам данных прямой (ассоциативный- по смыслу).

Формат различных типов данных зависит от организации конкретного MCU .К форматам относятся следующий свойства: двоичное кодирование, фиксированная длина и структура двоичных кодов.

6) Специальный машинно-ориентированный тип информации pointer

(адресный указатель). Все существующие компьютеры привязаны принципиально к адресной организации памяти практически на всех ее уровнях – внутренние регистры упорядочены в RGP(General Registers) по адресам в SFR.

В C51 необходимо учитывать иерархическую организацию памяти и разделение ее по типам Data, Code, Xdata. Для работы с указателем также предусмотрены адресуемые ячейки в памяти Data или Xdata..

Таким образом, возможно косвенное обращение к данным с явным определением адреса-указателя и адресного пространства

char data * data xx; //компилятор использует ячейку внутренней памяти data с именем xx для хранения адреcа этой переменной из data

Определение массива char data * data xx[10];

Обращение косвенное к байтам *xx[0]=0x55;

Обращение косвенное к int *(int *)xx[0]=0x1234; //возможность обращения к одному и тому же массиву данных в разных форматах

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

(2. тестировать способ размещения long в памяти Data, Code ,Xdata)

Постоянная память Code

char code *aa[]=”abcdef”; //указатель-адрес константы

float code *pi;

*pi=3.143;

Расширенная память данных Xdata

Константы определять в Xdata не целесообразно, так как реально они хранятся в памяти Code

char xdata *aa[]; //указатель-адрес динамического массива

Соседние файлы в папке mcs51_1