Вопрос или проблема
Иногда я получаю следующую ошибку (выводится через последовательный порт)
assertion "tud_inited()" failed: file "<...>/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c"
после этого pico перестает работать.
Я использую C/C++ SDK и стек tinyusb. Я посмотрел в соответствующий файл, но не смог действительно понять, что происходит. Похоже, сообщение об утверждении обрезано, так что у меня еще меньше информации для анализа.
Я не спрашиваю, где проблема в моем коде, но мне было бы интересно узнать, что это утверждение проверяет и когда оно должно срабатывать (чтобы я мог исправить проблему сам).
Я даже не могу указать на проблему в коде. В одной сборке все в порядке, а в другой — сбой (сейчас занимаюсь рефакторингом, поэтому, возможно, я инициализирую что-то раньше, чем что-то другое, что не должен).
Правка 1:
Запуск следующего кода уже приводит к появлению ошибки.
int main() {
// tusb_init();
stdio_init_all();
puts("v=============================================v");
puts("v================= STARTUP ===================v");
puts("v=============================================v");
return 0;
Примечание: Есть ли лучшее место, чтобы задать этот вопрос?
Ответ или решение
Ошибка, с которой вы столкнулись, связана с библиотекой TinyUSB и инициализацией USB. Утверждение assertion "tud_inited()"
проверяет, была ли инициализирована TinyUSB и готова ли она к работе. Это утверждение находится в файле stdio_usb.c
, и оно срабатывает в случае, если перед вызовом функций, работающих с USB (например, puts()
, которая использует стандартный ввод-вывод через USB), библиотека TinyUSB не была правильно инициализирована с помощью tusb_init()
.
Что делать:
-
Инициализация TinyUSB: Убедитесь, что вы вызываете
tusb_init()
перед использованием любых функций, которые зависят от TinyUSB. В вашем приведенном примере кода вызов функцииtusb_init()
закомментирован, что приводит к возникновению ошибки.Пример правильного кода:
#include "tusb.h" #include "pico/stdlib.h" int main() { // Инициализация USB tusb_init(); // Инициализация стандартного ввода-вывода stdio_init_all(); puts("v=============================================v"); puts("v================= STARTUP ===================v"); puts("v=============================================v"); while (1) { // Ваш код здесь } return 0; }
-
Инициализация перед использованием стандартного вывода: Never use functions like
puts()
before making sure thattusb_init()
is called and successful. It is critical to initialize the TinyUSB stack before any operation relying on that. -
Порядок инициализации: Если вы проводите рефакторинг кода, проверьте порядок инициализации. Все модули, которые зависят от USB, должны быть инициированы перед тем, как вы начинаете их использование.
-
Журналы отладки: Если ошибка продолжает возникать, добавьте дополнительные сообщения отладки, чтобы удостовериться, что каждый шаг вашего кода выполняется в правильном порядке и с правильными значениями.
Полезные ресурсы:
- Документация TinyUSB: Ознакомьтесь с официальной документацией TinyUSB для лучшего понимания работы с USB.
- Форумы и сообщество: Вы можете задать свои вопросы также на форумах, таких как Reddit, Stack Overflow, или специализированных форумах по разработке на Raspberry Pi, чтобы получить помощь от сообщества.
Это поможет вам избежать повторения данной проблемы в будущем и лучше понять подход к инициализации библиотек в ваших проектах.