реклама на сайте
подробности

 
 
> Вопрос по HI-Tech C, Помогите разобраться...
DenisIV
сообщение Apr 12 2009, 11:10
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Вобщем есть такой вопросик:
Есть подпрограмма(функция или процедура-не важно).
В ней таблица вида
Код
void Table1(void)
{
#asm
dw 0x3FF,0x3FF// и так далее...
#endasm
}

почему asm,dw 0x... спросите вы: для того, что бы я мог использовать все 14 бит flash памяти. можно задать как массив во флэш,но при реализации компилятор сделает таблицу вида:
Код
retlw 0xFF
retlw 0x1F

и т.д.

собственно, сам вопрос: как можно считать эти данные внутри функции Table1 и если не вызывается данная функция, как заставить компилятор её не исключать при сборке.

Считать флэш у меня получается, а присвоить присвоить переменной адрес функции-не получается.
Да, проц = PIC16F876A и(или) PIC16F886

Сообщение отредактировал DenisIV - Apr 12 2009, 11:11
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
testerplus
сообщение Apr 12 2009, 20:38
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 7-08-08
Из: SPb
Пользователь №: 39 471



Объявление:
Код
void Table1(void)
{
#asm
    global  MyTable               // Используем отдельную метку на тот случай, когда компилятор вдруг
                                  // решит добавить какой-нибудь код в начало функции (вроде clrf STATUS)
MyTable:
    dw 0x3FFF,0x3FFF// и так далее...
#endasm
}


Считывание адреса:
Код
void main (void)
{
    asm("   fncall  _main, _Table");   // Говорим компилятору, что функция используется без прямого вызова,
                                       // чтобы он ее включил в код
    ...
    #asm
        global MyTable
        bsf     _STATUS, 6
        movlw   low(MyTable)
        movwf   EEADR
        movlw   high(MyTable)
        movwf   EEADRH
        bcf     _STATUS, 6
    #endasm
    ...
}


P.S. А вариант со сжатием данных по подойдет? Т.е. сделать обычный массив через const char Table[]={...}, и добавить функцию-распаковщик.

Сообщение отредактировал testerplus - Apr 12 2009, 20:39
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Apr 13 2009, 14:07
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(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 не дадут перейти на другую платформу... =((
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 10:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016