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 */
Достарыңызбен бөлісу: