ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
3 декабря
1060435 Топик полностью
il-2 (13.12.2020 16:02, просмотров: 612) ответил POV_ на Проще говоря - компилятор не знал что это - колбэк, который будет вызван из прерывания. Потому локальные переменные перекрывались с другими функциями, якобы по причине невозможности их перекрестного вызова.
У тебя набор слов, как у студента, который сдает зачет и "плавает" в теме. Непонятно только, кто препод, и для кого строятся эти словесные нагромождения. 

Поэтому начнем с конца.

Причина глюка заключена в том, что нескольким локальным переменным с одновременном временем жизни дали один и тот-же адрес ОЗУ.

И возникла данная ситуация из-за того, что дерево вызовов, построенное компилятором не соответствует реальному дереву.

Компилятору неизвестны функции, которые ты вызываешь через указатель и он не включил их в построение дерева вызовов.

Прерывания здесь совсем не причем.

Выхода из данной ситуации два:

1. Вручную отредактировать дерево вызовов. Это делается директивами линкера. Я за давностью лет позабыл подробности, но помню, что там все просто. Еще помню, что дерево вызовов формируется в каком-то файле в текстовом виде и его можно посмотреть.

2. Вызывать через указатель реентрантные функции. Но это как удаление гланд через Ж. Слишком высока цена реентрантности в 51-й архитектуре. Если функции небольшие, то наверное можно и так.