Аппаратные и программные средства встраиваемых систем



Pdf көрінісі
бет216/268
Дата07.01.2022
өлшемі3,23 Mb.
#18255
1   ...   212   213   214   215   216   217   218   219   ...   268
5.2.3  Абсолютная адресация 
Переменным можно присваивать не только класс памяти (data, xdata, code) 
но и абсолютный адрес расположения. 
__xdata __at (0x7ffe) unsigned int chksum
 
В  примере,  приведенном  выше,  переменная chksum будет  размещена  по 
адресу 7ffeh во  внешней  памяти XDATA. Необходимо  заметить,  что 
компилятор  не  резервирует  места  под  переменные,  определенные  таким 
образом и проверка на отсутствия пересечений с другими данными полностью 
лежит  на  программисте.  Для  проверки  можно  использовать  файлы  с 
расширениями .lst, .rst и .map. 
Если  вы  произведете  инициализацию  памяти,  линкер  сможет  обнаружить 
пересечение данных. 
__code __at (0x7ff0) char Id [5] = ''SDCC''; 
 


 
225 
В  случае  использования  устройств  ввода-вывода,  расположенных  в 
адресном  пространстве  внешней  памяти,  необходимо  использовать  ключевое 
слово volatile, для того, чтобы оптимизатор компилятора не заменил обращение 
к устройству, обращением к регистру общего назначения. 
volatile __xdata __at (0x8000) unsigned char PORTA_8255; 
 
В SDCC допускается указание абсолютного адреса расположения бита, для 
битовых переменных. 
__bit __at (0x02) bvar; 
 
Использование  абсолютной  адресации  битовой  памяти  может  вызвать 
путаницу,  и  оправдано  только,  если  вам  хочется  написать  универсальную 
программу (см. пример ниже) для нескольких комплектов аппаратных средств. 
extern volatile __bit MOSI;  /* master out, slave in */ 
extern volatile __bit MISO;  /* master in, slave out */ 
extern volatile __bit MCLK;  /* master clock */ 
 
unsigned char spi_io(unsigned char out_byte) 

  unsigned char i=8; 
  do 
  { 
    MOSI = out_byte & 0x80; 
    out_byte <<= 1; 
    MCLK = 1; 
    if (MISO) 
      out_byte += 1; 
    MCLK = 0; 
  } while(-i); 
  return out_byte; 

Далее  мы  видим  варианты  определения  битов  для  разных  аппаратных 
средств: 
// вариант 1 
  __bit __at (0x80) MOSI;  /* I/O port 0, bit 0 */ 
  __bit __at (0x81) MISO;  /* I/O port 0, bit 1 */ 
  __bit __at (0x82) MCLK;  /* I/O port 0, bit 2 */ 
// вариант 2 
  __bit __at (0x83) MOSI;  /* I/O port 0, bit 3 */ 
  __bit __at (0x91) MISO;  /* I/O port 1, bit 1 */ 
  __bit __at (0x92) MCLK;  /* I/O port 1, bit 2 */ 
 


Достарыңызбен бөлісу:
1   ...   212   213   214   215   216   217   218   219   ...   268




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет