Цитата(testerplus @ Apr 12 2009, 23:38)

У меня прошло так:
Код
void MyArray(void)
{
#asm
dw 0x3FF0,0x1A55
#endasm
}
void main(void)
{unsigned int Temp,Tmp;
asm(" fncall _main, _MyArray");
Temp=&MyArray;
Tmp=FLASH_READ(Temp);
}
Только вот указатель на функцию компилируется неправильно. Либо я его неправильно описал.
Как я понимаю:
Temp - прямая адресация к ячейке.
*Teмp - адресация к данным через указатель (как к регистру INDF)
&Temp - адресация к самому указателю (как к регистру FSR)
в итоге у меня почему-то значение в Temp не совпадает с адресом самой функции.
А так строчка
Код
asm(" fncall _main, _MyArray");
мне очень помогла.
Не хотелось бы прибегать к асму, т.к. программа планируется быть носимой на другие платформы.
предыдущий рабочий вариант был таков:
Код
unsigned int MyArray(void)
{
#asm
movlw low ($+5)
movwf ?_MyArray
movlw high($+3)
movwf ?_MyArray+1
return
dw 0x3FF0,0x1A55
#endasm
return 0;// для того, чтобы компилятор увидел явный возврат из функции на С (команды asm он в расчёт не берёт)
}
void main(void)
{
unsigned int i,Tmp,Temp;
Temp=MyArray();
Tmp=0;
for(i=0;i<1024;i++)
{Tmp=Tmp+FLASH_READ(Temp+i);}
}
но в начале функции команды asm не дадут перейти на другую платформу... =((