Доброго времени суток!
После продолжительной работы выкладываю на общее обсуждение следующую версию прошивки программатора.
Основное и единственное отличие новой версии - поддержка "printf - отладки".
Что это такое? При отладке программ зачастую необходимо знать, в какой стадии выполнения находится программа. Закончила ли подпрограмма вычисления или нет? Чему равно значение некоторой внутренней переменной? В каком порядке выполняются составные части алгоритма и прочие задачи.
Большую часть этих задач позволяет решить аппаратный отладчик. Однако не у всех есть возможность использования аппаратных отладчиков. Цена, дополнительные разъёмы, программная поддержка отладчика, неудобство или неумение использования - всё это может препятствовать использованию аппаратных отладчиков.
Что предлагается взамен? Многие в качестве альтернативы используют для отладки debug_printf, "my_printf", библиотечный printf. Вставляя в интересующие точки своих программ для контроллеров что-то типа:
Код
printf("test point #1");
Код
printf("internal var 'speed' = %i \n", speed);
Обычно вывод функций printf настраивается на uart. Однако это тоже требует некоторых накладных расходов: дополнительные разъёмы, выделенный uart специально для отладки, требования к частоте тактирования.
Предлагается использовать для вывода отладочного "printf" пины контроллера, которые используются для его программирования (MOSI, MISO, SCK). Всё равно на стадии отладки программатор уже подключен к чипу, есть все необходимые разъёмы и подключения. Штатный uart при этом в большинстве случаев останется свободным!
Осталось выбрать 3х-проводный интерфейс для передачи данных от чипа к программатору. Для себя я выбрал следующие требования к интерфейсу:
1) Интерфейс должен быть полностью синхронным. (Снимаем требования к частоте контроллеров. Контроллеры могут спать, снижать свою частоту и т.д.)
2) Интерфейс должен быть дуплексным. (Хочется не только получать данные, но и отправлять)
3) Любая сторона может на неограниченное время приостановить обмен (с обоих сторон контроллеры, которые могут производить передачу данных в фоновом, низкоприоритетном процессе). При этом передаваемые данные не должны разрушаться. Как результат этого требования обмен данными должен происходить на максимальной скорости, которую могут обеспечить ОБЕ стороны.
4) В протоколе должно быть заложено выделение границ слов в передаваемом битовом потоке.
Из известных мне протоколов ни один не смог удовлетворить вышеперечисленным требованиям.
Пришлось изобретать
велосипед протокол. Что получилось и предлагаю обсудить:
Протокол называется "abd-протокол". В нём используются 3 линии:
"a" - линия тактирования. Для мастера выход, для слэйва вход.
"b" - возвратная линия тактирования. Для мастера вход, для слэйва выход.
"d" - двунаправленная линия данных. Является как входом так и выходом для двух сторон. Между мастером и слэйвом должен быть подключен последовательный токоограничивающий резистор, для обеспечения надёжной работы в моменты переключения выводов вход/выход.
Мастер наблюдает за состоянием линии "b". Если линия "b" переключилась в то же состояние, что и линия "a", - значит слэйв уже принял свой бит данных на линии "d", переключил линию на выход и выдал очередной свой бит на линию "d". После этого мастер может прочитать очередной бит от слэйва и выставить на передачу очередной свой бит. После этого мастер переводит состояние линии "a" в состояние, противоположное линии "b". И процесс повторяется заново.
Это общая идея обмена. Теперь детали: данные передаются в каждую сторону как на возрастающем фронте клоков, так и на спадающем. По одному фронту передаётся очередной бит в сдвиговый регистр приёмника, а по другому фронту выдаётся признак конца слова (тот момент, когда из сдвигового регистра можно читать данные). Кроме того в протокол заложена возможность остановить клоки, когда данных ни у мастера ни у слэйва нет. Более подробное описание содержится в исходниках (Файлы "abd.c" и "abd.h").
Этот протокол был реализован, оттестирован на моделях, а затем и в реальном железе. В программатор "by Petka" добавлена реализация слэйва протокола "abd".
Итого:
Для того, чтобы добавить в свою программу возможность отладки, надо в список компилируемых файлов проекта добавить "abd.c" и "abd_putchar.c". В main добавить:
Код
#include "abd_putchar.h"
FILE abd_file = FDEV_SETUP_STREAM(abd_master_putchar, NULL, _FDEV_SETUP_WRITE);
int main(void){
stderr = stdout = stdin = &abd_file;
Всё.
Теперь в любом месте можно просто писать:
Код
printf("Hello World! №%i\n", num);
num++;
В прикрепленном к посту файле "abd_demo.zip" демка использования.
Как увидеть получившийся "Hello World!" ?
Прошиваете чип. Открываете терминалкой ком порт программатора, замыкаете перемычку "1Mhz" (программатор должен быть в режиме "fast"). И наблюдаете свой "Hello World!"!
Исходник сделан для winavr. С небольшими доработками будет работать и для любого другого компилятора. Скоро выложу портированные версии для других компиляторов.