ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
324942 Топик полностью
koyodza (23.04.2012 22:57, просмотров: 175) ответил Evgeny_CD на Вот тут расписно ->, но...
там как-то мутно расписано по-сути просто делается несколько преобразований, подобных преобразованию типа. Например, имеем указатель 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))(); Надеюсь, для функций, которые получают параметры, разберётесь сами