Файл C, обращающийся к классу CPP по ссылке, обнаруживает фатальную ошибку (InstrFetchProhibited)C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Файл C, обращающийся к классу CPP по ссылке, обнаруживает фатальную ошибку (InstrFetchProhibited)

Сообщение Гость »


Я работаю над программой ESP32, которая получает данные BLE в коде C и анализирует их с помощью классов C++. Изначально у меня был друг, который помогал с частью C++, но, поскольку у него больше нет свободного времени для этого, я пытаюсь улучшить свои навыки C++, работая с этими классами и добавляя некоторые свои собственные, но это сделало это мне сложнее отделить синтаксические проблемы от моих обычных глупых ошибок.

Изначально этот проект начался с примера ESP32, написанного на C для сервера GATT, который я модифицировал, чтобы он выполнял то, что мне было нужно. Затем я создал оболочку, чтобы сервер GATT мог отправлять данные в анализатор (это было более или менее похоже на аналогичные вопросы о переполнении стека в функциях C/C++)

//Функции оболочки интерфейса C extern "C" void* parser_create(void* TxFunc) { вернуть новый парсер((serialTx) TxFunc); } extern "C" void parser_release(void* parserInstance) { удалить static_cast(parserInstance); } extern "C" void parser_Rx(void* parserInstance, const uint8_t *rxData, size_t rxLen) { static_cast(parserInstance)->serialRx(rxData, rxLen); } Когда класс был создан с помощью parser_create() в файле C, это сработало отлично. Однако другим классам также необходим доступ к классу синтаксического анализатора, чтобы они могли добавлять данные, и, похоже, не имело смысла «жить» в коде C BLE. Я попытался изменить код C так, чтобы он просто брал указатель на класс синтаксического анализатора после его создания в основном, но в остальном использовал его так же, и здесь я столкнулся с проблемами.

//В файле BLE C пустота * elmCppClass; ... -void ble_init() +void ble_init(void* elmCppClassPtr) { + elmCppClass = elmCppClassPtr; - elmCppClass = Elm327Emulator_create(BLESerialTx); } //в main.cpp, где я надеюсь создать экземпляры различных классов и более четко показать взаимодействие внешний "C" void app_main() { ... - ble_init(); + Парсер parserInstance(transmitFunction); + ble_init(&parserInstance); } Теперь код выполняется, но когда код BLE получает данные и пытается вызвать «parser_Rx», я получаю необработанное исключение для InstrFetchProhibited.

Сначала я попробовал увеличить размер стека, чтобы убедиться, что это не проблема со стеком. Затем я попытался напечатать адрес класса после создания экземпляра и перед вызовом функции Rx, чтобы убедиться, что указатель не поврежден. В конечном итоге проблема заключается в том, что код C вызывает функцию получения синтаксического анализатора теперь, когда класс находится в основном режиме. Почему это должно быть? Помимо «проблемы с объемом», я не знаю, что вообще искать.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»