День добрый! Назрел такой вопрос: как ИАР-у(4.20) сказать чтобы перед циклом запомнил в регистр процессора адрес регистра выходных данных и потом не грузил его снова каждый раз. (Нужно ускорить процесс). Написал так:
Код
register uint16_t *pcSource;
register uint32_t *pOut;
pcSource = (uint16_t*)( xRxDescriptors[ ulNextRxBuffer ].addr & emacADDRESS_MASK);
pin_off(clk_pin);
// from AT91SAM7X256.h :
//#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register
pOut = (uint32_t*) AT91C_PIOA_ODSR;
while( ulTotalFrameLength)
{
*pOut = *(pcSource++);
pin_on(clk_pin);
ulTotalFrameLength --;
pin_off(clk_pin);
}
Но в результате компиляции упорно получается следующее:
Код
// 385 pOut = (uint32_t*) AT91C_PIOA_ODSR;
LDR R3,??vEMACRead_and_Go_0+0x8 ;; 0xfffff430
CMP R5,#+0
BEQ ??vEMACRead_and_Go_4
// 396 *pOut = *(pcSource++);
??vEMACRead_and_Go_5:
LDR R6,??vEMACRead_and_Go_0+0xC ;; 0xfffff438
LDRH R7,[R4, #+0]
STR R7,[R6, #+0]
ADDS R4,R4,#+2
// 399 pin_on(clk_pin);
MOVS R6,#+128
LSLS R6,R6,#+10 ;; #+131072
STR R6,[R3, #+0]
// 400 ulTotalFrameLength --;
SUBS R5,R5,#+1
// 401 pin_off(clk_pin);
STR R6,[R2, #+0]
...
Тоесть при инициализации pOut в регистр пишется совсем другой адрес, который затем используется совсем в другом месте - макросом pin_on. Это макросы из ascold.h - знатокам знаком этот хедер. Оптимизация выставлена максимальная. При других уровнях оптимизации компилятор и вовсе игнорирует переменную pOut.
Как это победить?