Файл C, обращающийся к классу CPP по ссылке, обнаруживает фатальную ошибку (InstrFetchProhibited) ⇐ 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 вызывает функцию получения синтаксического анализатора теперь, когда класс находится в основном режиме. Почему это должно быть? Помимо «проблемы с объемом», я не знаю, что вообще искать.
Я работаю над программой 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 вызывает функцию получения синтаксического анализатора теперь, когда класс находится в основном режиме. Почему это должно быть? Помимо «проблемы с объемом», я не знаю, что вообще искать.
Мобильная версия