там как-то мутно расписано по-сути просто делается несколько преобразований, подобных преобразованию типа.
Например, имеем указатель pProc, для удобства работы он типа void*
void* pProc = указатель на функцию
Можно туда адрес функции присвоить:
pProc = &myFunction;
или даже константу (не рекомендуется делать это без крайней необходимости):
pProc = (void*)0x08001000;
Дальше мы просто компилятору пытаемся объяснить, что мы хотим запустить функцию по указателю pProc, и что это функция void и принимает она тоже void
Для этого мы перед pProc пишем void(*)(void)
где первый void это тип функции, второй void это передаваемые параметры, конструкцию помещаем в скобки (как при преобразовании типов), после неё идёт собственно указатель (которому мы придаём вид указателя на функцию), и после указателя скобки с параметрами функции (или пустые, если параметров нет).
Сам указатель можно в скобки не брать, тогда будет выглядеть так:
((void(*)(void))pProc)();
При желании вызывать функцию по фиксированному адресу можно отказаться от присвоения указателя. Тогда конструкция будет выглядеть так:
((void(*)(void))0x08001000)();
Если по фиксированному адресу лежит не сама функция, а вектор перехода на неё (актуально для CM3 и некоторых других МК), конструкция может выглядеть так:
((void(*)(void))(*(DWORD*)0x08000004))();
Надеюсь, для функций, которые получают параметры, разберётесь сами
-
- Спасибо! - Evgeny_CD(23.04.2012 23:59)