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

 
 
> Вопрос по 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
testerplus
сообщение Apr 13 2009, 14:53
Сообщение #4


Участник
*

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



Цитата(DenisIV @ Apr 13 2009, 17:07) *
Только вот указатель на функцию компилируется неправильно. Либо я его неправильно описал.
Как я понимаю:
Temp - прямая адресация к ячейке.
*Teмp - адресация к данным через указатель (как к регистру INDF)
&Temp - адресация к самому указателю (как к регистру FSR)
в итоге у меня почему-то значение в Temp не совпадает с адресом самой функции.

Я выше описывал, что так не получится. HTPICC (и STD, и PRO) при объеме ROM > 2K будут строить таблицы переходов для всех функций, к адресам которых есть обращения в программе. Т.е. Ваша операция &MyArray вернет не адрес самой функции, а адрес вызова через таблицу переходов
для STD-версии или номер элемента в таблице переходов для PRO-версии (кстати, у Вас каккая?)

Кроме того, HTPICC легко первыми инструкциями в функции вставит:
Код
    bcf    status, rp0
    bcf    status, pr1

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

на какие платформы планируется перенос? dw не везде задается одинаково.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Apr 13 2009, 15:43
Сообщение #5


Участник
*

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



Цитата(testerplus @ Apr 13 2009, 17:53) *
Я выше описывал, что так не получится. HTPICC (и STD, и PRO) при объеме ROM > 2K будут строить таблицы переходов для всех функций, к адресам которых есть обращения в программе. Т.е. Ваша операция &MyArray вернет не адрес самой функции, а адрес вызова через таблицу переходов
для STD-версии или номер элемента в таблице переходов для PRO-версии (кстати, у Вас каккая?)

Можно поподробнее? Есть ли доступ к таблице переходов?
PRO 9.65
Цитата
Кроме того, HTPICC легко первыми инструкциями в функции вставит:
Код
    bcf    status, rp0
    bcf    status, pr1

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

даже если сместится, можно хоть как-нибудь не прибегая к асму вытащить адрес функции и засунуть в какую-нибудь переменную?
Цитата
на какие платформы планируется перенос? dw не везде задается одинаково.

на AVR и x51.
ну в AVR с dw нормально, только точка перед ней нужна, с 51 проблем никаких вроде.
dw не самая большая проблема.
Go to the top of the page
 
+Quote Post



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

 


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


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