Пример использования
Код
char ER [] = "Error_RS422: ";
#pragma location = 0x000100
__flash char ER_FLASH [] = "Error_RS422: ";
#pragma location = 0x010100
__hugeflash char ER_HUGE [] = "Error_RS422: ";
void main(void)
{
for(int i=0;i<10;i++)
ER[i]=ER_HUGE[i];
for(int i=0;i<10;i++)
ER[i]=ER_FLASH[i];
}
И работа компилятора
CODE
//копируем из верхней половины, здесь трехбайтный адрес в старшем байте которого принимается во внимание только младший бит, который имеет посадочное место RAMPZ0.
// 16 ER[i]=ER_HUGE[i];
MOV R26, R25
LSL R26
SBC R26, R26
MOV R27, R26
LDI R30, LOW(ER_HUGE)
LDI R31, HIGH(ER_HUGE)
LDI R19, (ER_HUGE) >> 16
ADD R30, R24
ADC R31, R25
ADC R19, R26
OUT 0x3B, R19 !!!!!!!!! заносим в RAMPZ третий байт адреса для нижних адресов это 0x00, для верхних адресов - 0x01
ELPM R16, Z !!!!!!!!! доступ к памяти программ через "длинный" вариант - ELP, т.е. через [RAMPZ0]:Z
MOVW R31:R30, R25:R24
SUBI R30, LOW((-(ER) & 0xFFFF))
SBCI R31, (-(ER) & 0xFFFF) >> 8
ST Z, R16
копируем из нижней половины. здесь двухбайтный адрес.
// 16 ER[i]=ER_HUGE[i];
MOV R26, R25
LSL R26
SBC R26, R26
MOV R27, R26
LDI R30, LOW(ER_HUGE)
LDI R31, HIGH(ER_HUGE)
LDI R19, (ER_HUGE) >> 16
ADD R30, R24
ADC R31, R25
ADC R19, R26
OUT 0x3B, R19
ELPM R16, Z !!!!!!!!! доступ к памяти программ через "короткий" вариант - LPМ, т.е. через Z
MOVW R31:R30, R25:R24
SUBI R30, LOW((-(ER) & 0xFFFF))
SBCI R31, (-(ER) & 0xFFFF) >> 8
ST Z, R16