2008-11-20 5 views
6

Я понимаю, что далеко компилятор специфичен, но я ожидаю, что размещение дальнего спецификатора должно иметь смысл для тех, кто действительно понимает указатели.Использование дальних указателей на функции

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

App А требуется вызвать функцию Foo, которая существует в приложении B.

Я знаю расположение памяти функции Foo.

Так это должно работать, в приложении A:

typedef int (* __far MYFP)(int input); 

void somefunc(void) 
{ 
    int returnvalue; 
    MYFP foo; 

    foo = (MYFP) 0xFFFFFA; 

    returnvalue = foo(39); 
} 
  • ли __far в нужном месте в ЬурейеЕ?
  • Нужно ли добавить __far в (MYFP)?
  • Некоторая информация предполагает, что вызов foo не нужно разыменовывать, каков ваш опыт?
  • Что еще может показаться неправильным, или я могу попытаться это сделать?

  • Есть ли лучший способ сделать это?

Edit:

Это на встроенном устройстве (Freescale S12XEQ устройства) с использованием кода Warrior. Это 16-битное устройство с 24-битным пространством памяти, так что да, он сегментирован/скомпонован.

-Adam

+0

Можете вдаваться в подробности? На какой платформе вы работаете? Какой компилятор вы используете? – grieve 2008-11-20 17:09:54

ответ

8

Является ли __far в нужном месте в typedef?

[Редактировать в ответ на комментарий ChrisN в - спасибо]

Это зависит от компилятора функция, так как она не является частью ANSI C. Согласно инструкции компилятора < http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf >, глава 8 , вы его правильно разместили. В других компиляторах вам может потребоваться изменить порядок. Это должно быть довольно легко понять, однако, поскольку точно один из двух вариантов будет компилироваться с любым заданным компилятором.

Нужно ли добавлять __far в (MYFP)?

Нет, это часть типа.

Некоторая информация предполагает, что вызов foo не требует разыменования, каков ваш опыт?

указатели на функции могут быть дополнительно разыменовываются в C. Следующие строки являются действительными сделать то же самое:

foo = (MYFP)0xFFFFFA; 
returnvalue = foo(39); // 1 
returnvalue = (*foo)(39); // 2 

Что еще об этом выглядит неправильно, или, возможно, я пытаюсь это сделать?

Вы сделали это точно.

10

__far ключевое слово, по крайней мере, в MS мире, был использован при создании исполняемых файлов, которые используются сегментированной памяти. Вам нужно понять систему памяти 8086, чтобы понять это. 8086 разделял память на сегменты, каждый сегмент имел длину 64 КБ, поэтому каждому адресу в сегменте требовалось 16 бит. Адреса выпускались в двух формах: рядом и далеко. Ближайший адрес был 16 бит и был смещением в текущий сегмент, один из CS, DS, ES, SS в зависимости от команды, далеко 32 бита и состоял из сегмента и смещения. В 8086 году абсолютный адрес составлял 16 * сегмент + смещение, давая адресный диапазон 1 Мб.

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

+0

Да, это означало, что было 4096 способов обращения к одному и тому же байту памяти. – Skizz 2008-11-20 17:11:19

+0

__far существовал не только в семействе x86 с сегментированной адресацией. M68k, PowerPC и некоторые другие также имели этот квалификатор. Я думаю, что во встроенных он все еще используется. Чтобы ответить на исходный вопрос, нам понадобится дополнительная информация (например, plattform, compiler, ...) – flolo 2008-11-20 17:18:39

1

Это фрагмент кода, который работает с проектом, над которым я работаю. Это Paradigm C++, поэтому он использует некоторую версию Borland. Используемый им процессор - это клон 8086, поэтому сегментированная 20-разрядная память.

void softSerial0SR(unsigned16); 
void (__far *softHandler)(unsigned16); 

Я инициализирую softHandler на 0 без жалобы.

Затем

softHandler = softSerial0SR; 

в коде установки.

Чтобы назвать это, просто вызовите softHandler, как обычную функцию.

Обратите внимание, что этот код слегка изменен для вас из фактического кода, который у меня есть.

0

обе программы были построены одним и тем же компилятором/параметрами, поэтому они используют один и тот же OBI?

0

Согласитесь, что код выглядит хорошо - в этом случае я бы получил разборку генерируемого кода и выяснил, получилось ли это правильно. Всего должно быть не более 10 инструкций, и тогда вы точно это знаете, если это сработает.