Pull to refresh

Comments 5

Странное дело - у тебя есть полноценный отладчик, но привычка отлаживать через printf еще не отпала)

Есть способ проще - использовать асинхронный трассировочный вывод (пин SWO отладчика). Переопределяешь _write туда и printf из стандартной библиотеки будет спамить в консоль.

https://www.youtube.com/watch?v=ST_fUu6ACzE

А ещё, этот самый printf тянет за собой столько гадости, что в некоторые МК может и не влезть. Уж лучше взять LA и дрыгать ногами в режиме реального времени на время отладки.

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

Ещё, если printf используется для вывода значений с плавающей запятой, не забываем выравнивать стек (вероятно и кучу) в памяти, иначе вместо адекватных значений будем получать непонятную кашу. При этом вывод обычного текста и целочисленных данных может работать корректно.

Согласен - делаешь свой кастомный протоколо для GPIO - и спокойно с помощью LA отлеживаешься. К примеру надо мне засунуть ногодрыг в 16 веток кода, но использовать много пинов не хочется. Беру просто кодирую на одном пине число и в каждую ветку вставляю свое соответственно. В LA есть распознаватель битовой последовательности - и сразу мне пишет число - в какую ветку я попал. При желании можно и символы фигачить) Получится уарт на минималках

void nop_delay(uint32_t nop_count)

{

while(nop_count--)

{

asm("nop");

}
}

HAL_GPIO_WritePin(d->gpio_port, d->gpio_pin, 0);

nop_delay(10);

HAL_GPIO_WritePin(d->gpio_port, d->gpio_pin, 1);

nop_delay(10);

HAL_GPIO_WritePin(d->gpio_port, d->gpio_pin, 1);

nop_delay(10);

HAL_GPIO_WritePin(d->gpio_port, d->gpio_pin, 1);
nop_delay(10);

Sign up to leave a comment.

Articles