- printf() c-version (no c++) - no Arduino library - arm-gcc toolchain & std library
т.к. контроллер относится к SAM, то "обычным" способом запустить печать не получилось
Код:
_FDEV_SETUP_WRITE was not declared in this scope
... ну кто-бы сомневался?! :о)
в инете нашел единственный вариант для SAM
sam printf Simple print functions for Atmel SAM microcontrollers using DMA
в описании указан "наш чип" как протестированый собирается без проблем (кроме варнингов, возможно следует присмотреться?!, undefined reference - это не хухры мурхры) печать не работает (пробовал по разному)
варнинги (пути к тулчейну усечены, для удобства восприятия) Спойлер
Код:
... dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-fstatr.o): in function `_fstat_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/fstatr.c:55: warning: undefined reference to `_fstat' dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-isattyr.o): in function `_isatty_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/isattyr.c:52: warning: undefined reference to `_isatty' dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-sbrkr.o): in function `_sbrk_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/sbrkr.c:51: warning: undefined reference to `_sbrk' dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-writer.o): in function `_write_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/writer.c:49: warning: undefined reference to `_write' dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-closer.o): in function `_close_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/closer.c:47: warning: undefined reference to `_close' dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-lseekr.o): in function `_lseek_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/lseekr.c:49: warning: undefined reference to `_lseek' dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld: dev/bin/arm/11.3/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(libc_a-readr.o): in function `_read_r': /data/jenkins/workspace/GNU-toolchain/arm-11/src/newlib-cygwin/newlib/libc/reent/readr.c:49: warning: undefined reference to `_read' ...
проект "перенесен" от сюда
sam3 Low Level prg-ing Low level" programming of the Arduino DUE SAM3 controller with a custom IDE
в нем используются arduino-sam библиотеки
Код:
~/.arduino15/packages/arduino/hardware/sam/1.6.12
makefile немного подрихтовал под себя (библиотеки не копируются в каталог проекта, а используются "как-есть", установленные в систему
На Си для микроконтроллеров завсегда применялся sprintf, принимающий конкретный указатель на буфер для сформированной строки. DMA тут как бы и не при делах, ибо задача sprintf - только сформировать текстовую строку, а отправить её куда-либо - это уже другая зона ответственности, так сказать..
Жаль такой платки в наличии нету... Обычно проблем с выводом на терминал у адуринок (в том числе и на платформах STM32) не имеется... Может с установкой самой платформы чего не так или с выборкой варианта применения - там и последовательных портов больше и их разновидностей...
Мои скилы находятся на достаточном уровне для того, чтобы самостоятельно написать буферизацию, ибо printf - это не только вывод в терминалку, но и формирование текста для отображения на дисплее. Стандартного порта вывода в МК нет, поэтому программист сам определяет направление вывода текста.
The Universal Asynchronous Receiver Transmitter features a two-pin UART that can be used for communication and trace purposes and offers an ideal medium for in-situ programming solutions. Moreover, the association with two peripheral DMA controller (PDC) channels permits packet handling for these tasks with processor time reduced to a minimum.
The USART supports the connection to the Peripheral DMA Controller, which enables data transfers to the transmitter and from the receiver. The PDC provides chained buffer management without any intervention of the processor.
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
MLX90640, все правильно пишет. Получаете форматированный текст функцией sprintf или аналогичной и делаете с ним что хотите. Хоть в USART через DMA передавайте.
Посмотрел файл print.c по ссылке. Тьфу ты блин! Я то думал, речь шла о стандартной сишной функции printf, которая капец какая навороченная и использует стандартный буфер вывода. Но тут оказалось всё настолько банально и примитивно, что прям ну ваще, как там можно было запутаться то в трех березах то? Обычные самописные функции преобразования целого числа в текстовую ANSI-строку и передача этой строки в функцию отправки по UART-у с кольцевым буфером. Просто скопируйте текст функций в чистый файл и скомпилируйте. Следует различать стандартный printf и самописный print.
Если используется стандартная библиотека ввода-вывода языка Си, на что указывает использование sprintf(), то логичным будет реализация обработки вызовов _read(),_write() и иже с ними, что позволит осуществлять ввод-вывод хоть куда, используя все функции файлового ввода-вывода, в том числе и printf(), которая обычно является обёрткой для fprintf( stdout, ...). И тогда будут не нужны промежуточные представления выводимых строк. В GCC, например, библиотека резервирует место под 20 файловых дескрипторов, из которых сама использует только 3, оставляя пользователю 17.
Скажем так... в условиях микроконтроллеров далеко не всегда нужны методы "больших компутеров", поэтому нередко используют облегченные варианты вывода, необходимые в конкретном случае. В честности, при отправке по УАРТу в большинстве случаев нужно "здесь и сейчас". А при отрисовке на дисплее может потребоваться либо вывод одного-двух чисел, либо формирование всего кадра, да еше и вместе с графикой. В таких случаях лучше вручную управлять процессом вывода в конкретной ситуации. Ну а если семисегментный индикатор, там вообще достаточно самописного легкого преобразования числа в цифры по знакоместам.
... и делаете с ним что хотите. Хоть в USART через DMA передавайте
с этим и проблемы... через регистры пока на получается... по идее нужно "стандартно" переопределить функцию "put(),_read(),_write()... etc", и далее все "стандартно" ...
Просто скопируйте текст функций в чистый файл и скомпилируйте. Следует различать стандартный printf и самописный print.
ну не надо считать себя самым умным котом! чай не дураки тут шерсть чешут и просто тусуются
если "это" не подразумевается как "само собой" то пишу явно : ТЕСТИРОВАЛ ЭТУ И МНОГИЕ ДРУГИЕ ПОДОБНЫЕ БИБИЛИОТЕКИ, НИ ОДНА НЕ РАБОТАЕТ УТОЧНЯЮ - КОНТРОЛЛЕР SAM3X8E с обычным avr контроллером (328-2560) - вопросов нет
в данном топике слово "Arduino-Due" используется как указатель чипа/прототипа (а не саму манда-рино "среду/библиотеки/ide")
спасибо
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
ТЕСТИРОВАЛ ЭТУ И МНОГИЕ ДРУГИЕ ПОДОБНЫЕ БИБИЛИОТЕКИ, НИ ОДНА НЕ РАБОТАЕТ
Вы абсолютно уверены в том, что не работает только библиотека? Все остальные "нижележащие" механизмы работают? А именно: 1) По ссылке из первого поста на используемую библиотеку есть необходимые шаги для настройки этой самой библиотеки. Вы выполнили их все (8 пунктов)? Никакого пояснительного кода в первом сообщении по этому поводу от вас не было. 2) Вы уверены в электрической работоспособности пинов, на которые выведен UART? Т.е. вы загружали тестовый код "моргания" ножками, и с помощью осциллографа/вольтметра/светодиода удостоверились, что выдача сигнала есть, и она корректна? 3) Вы удостоверились в работе UART? Т.е. вы загружали тестовый код, в котором корректно настраивали GPIO (для работы пинов в режиме коммутации к UART), тактирование (для корректного задания бод-рейта) и собственно сам UART (включение/тактирование внутренних узлов/четность/стоп-биты/и т.д.), после чего циклически посылали 1 байт и отслеживали его (через осциллограф/лог.анализатор/преобразователь UART-USB и терминал на компьютере)? 4) Вы удостоверились в работе DMA? Т.е. после успешного выполнения предыдущего пункта вы внимательно изучили мануал на ваш контроллер, зашили тестовую прошивку из предыдущего шага, но настройкой соответствующего канала DMA, которая циклически отсылает пакет из нескольких байт, и также успешно отследили его?
Azeront, у него не собирается проект, так что до работоспособности железа тут еще далеко. Топикстартеру следует создать чистый Си-проект с этим МК, ничего не добавляя в проект и попробовать собрать. При успешной сборке продолжить дальше и написать
Код:
#include <stdio.h> int main(void) { printf("0123"); while(1); }
и проверить сборку. Если успешно, тогда "дело было не в бобине". Если с ошибками, тогда что-то с совместимостью и косяком в IDE, либо проблема в неверной настройке проекта.
> не понял смысла этих слов потому как шибко ученый, по цепи ходишь вокруг дуба и сказки налево и направо гутаришь... (учите классику, и меньше фантазируйте)
> у него не собирается проект это из каких таких сказочных мыслей вывод сделали?!
> Всё ещё не отпустило штоль? это вы правильный вопрос задали себе ... если что по делу - пишите, а так общайся сам с собой, зеркало имеется у хозяина?! :о)
> Топикстартеру следует создать чистый Си-проект с этим МК не видишь разницу между стандартной реализацией и PDC/DMA? естественно вылезут анрезолвы _put_/_write_, но это из другой оперы.
Azeront, спасибо, первые 3 пункта можно было опустить сразу :о), затык сейчас с DMA (нормальная работа пока только в asf, пытаюсь сделать без нее)
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
правильно, значит все таки послушался, взял у хозяина зеркало, общаешься... молодец! реализуй работу ком-порта через DMA - будешь вообще умничка и хоть за тешься ЧСВ я первый отдам тебе на царапки свои любимые хозяйские тапочки
исходные - sam3x8e - no asf library - no printf and std - DMA/PDC
уточняю, обычная asf-реализация работает без проблем, нужно низкоуровневый вариант через DMA (например, указанная бибилотека)
если по делу нечего... то лучше царапками займитесь, на кухне чашками, проверьте лоток, мышку под шкафом... столько дел еще не переделанных
p.s. ай молотцы, нашЛепали! кроме минусов еще что-нить можем?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения