Можете ли вы изменить указатель на функцию из текущей указанной функции в пределах C? - PullRequest
1 голос
/ 12 апреля 2020

Коротко: у меня есть функция (function_ISR), которая указывает на другую функцию (function_A), и я хотел бы знать, возможно ли или целесообразно ли изменить function_ISR таким образом, чтобы он указывал на function_B, находясь в function_A.

Чем дольше: я программирую микроконтроллер pi c в качестве шагового контроллера / драйвера и пытаюсь ускорить / упростить ISR, который рассчитывает интервал для следующего шага и решает, что делать дальше. В настоящее время я использую его в качестве конечного автомата, где состояния - это такие вещи, как, stable_state, ускорение, замедление, change_direction. ISR работает на пике около 40 кГц и тратит время на провал конечного автомата, несмотря на то, что он редко меняется. Кроме того, я знаю следующее состояние в конце последнего состояния.

Поэтому я думаю о написании отдельных функций для каждого состояния и просто при необходимости меняю то, на что указывает ISR, из последнего состояния. Я не уверен, что это приведет к ошибкам при возврате из функции, и подумал, что я хотел бы спросить, не знает ли кто-нибудь, будет ли это работать в принципе, есть ли какие-то ловушки для фотографий или может предложить другой способ.

Наконец, я проверил и нашел похожую тему / вопрос для C ++ Вопрос , в котором я не уверен, правильно ли это для C. Если вы найдете лучший вариант, пожалуйста, ответьте со ссылкой Спасибо

1 Ответ

1 голос
/ 12 апреля 2020

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

Упомянутый вопрос C ++ не совсем уместен, но мой ответ применим к любому компилируемому языку. Сборка OTOH позволит вам использовать специальные инструкции явно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...