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

 
 
> Вопрос по 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
Ответов
DenisIV
сообщение Apr 13 2009, 00:10
Сообщение #2


Участник
*

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



Огромное вам сапасибо, testerplus , я более ёмкого и конкретного ответа даже не ожидал.
Буду тестировать на проекте как проснусь, сразу отпишусь.
Алгоритм со сжатием не подойдёт, так как данные уже упаковны не хуже GSM упаковки... Но всё равно биг спс !!!
Я думаю, считывание типа Temp=FLASH_READ(MyTable+OffSet) должно пройти...
Есть ещё пара мелких локальных вопросов, которые я хотел бы задать, но это потом...
Адреналин, оказывается, вырабатывается не только в случае опасности, а так же в случае удачной компиляци... smile.gif
Go to the top of the page
 
+Quote Post
testerplus
сообщение Apr 13 2009, 05:58
Сообщение #3


Участник
*

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



Цитата(DenisIV @ Apr 13 2009, 03:10) *
Я думаю, считывание типа Temp=FLASH_READ(MyTable+OffSet) должно пройти...

Такой фокус не пройдет (пройдет только на STD-версии компилятора и для ПИКа с ROM < 2k, да и то, если переобъявить метки "MyTable" -> "_MyTable" и в начале файла добавить объявление прототипа: void MyTable(void)).

Метка, объявленная в asm из Си не будет видна. Так что только через асм. Удобно будет организовать в виде функции, но это уже Вам решать:
Код
int GetMyTable (int offset)
{
    #asm
        global MyTable
        movlw   low(MyTable)             // Прибавляем адрес MyTable к offset
        addwf   _Table$offset + 0, f
        movlw   high(MyTable)
        btfsc   _STATUS, 0
        addlw   1
        addwf   _Table$offset + 1, f
    #endasm
    return FLASH_READ(offset);
}

...

// обращаемся так:

    i = GetMyTable(100);
    ...
    j = GetMyTable(i + 18);
    ...
    и т.д.
Go to the top of the page
 
+Quote Post



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

 


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


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