Обсуждаем контроллеры компании Atmel.
Ответить

AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на СИ

Пн окт 03, 2022 08:08:50

добрый день

Код:
- 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 - это не хухры мурхры)
печать не работает (пробовал по разному)

варнинги (пути к тулчейну усечены, для удобства восприятия)


проект "перенесен" от сюда

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 немного подрихтовал под себя (библиотеки не копируются в каталог проекта, а используются "как-есть", установленные в систему



toolchain пробовал разные версии
Код:
arm-none-eabi
- 11.2
- 11.3
- 12.2
- 5.2.1


так-же arduino-toolchain
Код:
~/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-XXX


версия toolchain выбирается установкой
Код:
TOOL_CHAIN_DEF = ARDUINO
TOOL_CHAIN_DEF = ARM_DEF
TOOL_CHAIN_DEF = ARM


p.s.
понимаю, что можно взяться разгрызать
- реализацию класса Arduino-Due/Serial.xxx
- реализацию стандартной печати в asf-library

и то и другое, понятное дело, работает, но хотелось-бы пока разобраться с данной библиотекой

как обычно, принимаются любые идеи/ссылки/советы по делу, помидоры в разумных количествах, можно просто побалагуить... но, желательно в тему :о)

!!! ADD !!!
ТЕСТИРОВАЛ ЭТУ И МНОГИЕ ДРУГИЕ ПОДОБНЫЕ БИБИЛИОТЕКИ, НИ ОДНА НЕ РАБОТАЕТ
УТОЧНЯЮ - КОНТРОЛЛЕР SAM3X8E


спасибо

#tag: avr atmel arduino due printf c arm-gcc asf
Последний раз редактировалось sunjob Вт окт 04, 2022 05:53:16, всего редактировалось 1 раз.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 08:37:58

На Си для микроконтроллеров завсегда применялся sprintf, принимающий конкретный указатель на буфер для сформированной строки.
DMA тут как бы и не при делах, ибо задача sprintf - только сформировать текстовую строку, а отправить её куда-либо - это уже другая зона ответственности, так сказать..

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 09:22:09

продолжай! как это поможет "отцу русской демократии"? :о)

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 09:48:04

Жаль такой платки в наличии нету...
Обычно проблем с выводом на терминал у адуринок (в том числе и на платформах STM32) не имеется...
Может с установкой самой платформы чего не так или с выборкой варианта применения - там и последовательных портов больше и их разновидностей...
:dont_know:

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 10:19:51

MLX90640 писал(а):На Си для микроконтроллеров завсегда применялся sprintf

Подтяни свои скилы и начни использовать printf(). :)))

Подсказка: printf() может быть буферизован и использовать алгоритм Нэйгла для выдачи информации на устройство её отображения.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 10:41:22

Мои скилы находятся на достаточном уровне для того, чтобы самостоятельно написать буферизацию, ибо printf - это не только вывод в терминалку, но и формирование текста для отображения на дисплее. Стандартного порта вывода в МК нет, поэтому программист сам определяет направление вывода текста.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 12:25:19

datasheet cut

34. Universal Asynchronous Receiver Transceiver (UART)
34.1 Description

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.

35. Universal Synchronous Asynchronous Receiver Transmitter (USART)
35.1 Description

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.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 13:13:08

MLX90640, все правильно пишет.
Получаете форматированный текст функцией sprintf или аналогичной и делаете с ним что хотите. Хоть в USART через DMA передавайте.

Библиотеки ардуины выбросьте!

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 16:15:45

Посмотрел файл print.c по ссылке. Тьфу ты блин! Я то думал, речь шла о стандартной сишной функции printf, которая капец какая навороченная и использует стандартный буфер вывода. Но тут оказалось всё настолько банально и примитивно, что прям ну ваще, как там можно было запутаться то в трех березах то? Обычные самописные функции преобразования целого числа в текстовую ANSI-строку и передача этой строки в функцию отправки по UART-у с кольцевым буфером.
Просто скопируйте текст функций в чистый файл и скомпилируйте.
Следует различать стандартный printf и самописный print.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 17:47:18

Мурик писал(а):Получаете форматированный текст функцией sprintf

Если используется стандартная библиотека ввода-вывода языка Си, на что указывает использование sprintf(), то логичным будет реализация обработки вызовов _read(),_write() и иже с ними, что позволит осуществлять ввод-вывод хоть куда, используя все функции файлового ввода-вывода, в том числе и printf(), которая обычно является обёрткой для fprintf( stdout, ...). И тогда будут не нужны промежуточные представления выводимых строк.
В GCC, например, библиотека резервирует место под 20 файловых дескрипторов, из которых сама использует только 3, оставляя пользователю 17.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Пн окт 03, 2022 19:02:51

Скажем так... в условиях микроконтроллеров далеко не всегда нужны методы "больших компутеров", поэтому нередко используют облегченные варианты вывода, необходимые в конкретном случае. В честности, при отправке по УАРТу в большинстве случаев нужно "здесь и сейчас". А при отрисовке на дисплее может потребоваться либо вывод одного-двух чисел, либо формирование всего кадра, да еше и вместе с графикой. В таких случаях лучше вручную управлять процессом вывода в конкретной ситуации. Ну а если семисегментный индикатор, там вообще достаточно самописного легкого преобразования числа в цифры по знакоместам.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Вт окт 04, 2022 05:50:04

Библиотеки ардуины выбросьте!

повторение... мать учения... :))
- printf() c-version (no c++)
- no Arduino library
- arm-gcc toolchain & std library

может я не туда написал, но это условие присутствует... :beer:

Добавлено after 5 minutes 8 seconds:
... и делаете с ним что хотите. Хоть в USART через DMA передавайте

с этим и проблемы... через регистры пока на получается...
по идее нужно "стандартно" переопределить функцию "put(),_read(),_write()... etc", и далее все "стандартно" ... 8)

Добавлено after 28 minutes 42 seconds:
Просто скопируйте текст функций в чистый файл и скомпилируйте.
Следует различать стандартный printf и самописный print.

ну не надо считать себя самым умным котом! :))) чай не дураки тут шерсть чешут и просто тусуются :beer:

если "это" не подразумевается как "само собой" то пишу явно :
ТЕСТИРОВАЛ ЭТУ И МНОГИЕ ДРУГИЕ ПОДОБНЫЕ БИБИЛИОТЕКИ, НИ ОДНА НЕ РАБОТАЕТ
УТОЧНЯЮ - КОНТРОЛЛЕР SAM3X8E

с обычным avr контроллером (328-2560) - вопросов нет

в данном топике слово "Arduino-Due" используется как указатель чипа/прототипа (а не саму манда-рино "среду/библиотеки/ide")

спасибо

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Вт окт 04, 2022 13:42:16

ТЕСТИРОВАЛ ЭТУ И МНОГИЕ ДРУГИЕ ПОДОБНЫЕ БИБИЛИОТЕКИ, НИ ОДНА НЕ РАБОТАЕТ


Вы абсолютно уверены в том, что не работает только библиотека? Все остальные "нижележащие" механизмы работают? А именно:
1) По ссылке из первого поста на используемую библиотеку есть необходимые шаги для настройки этой самой библиотеки. Вы выполнили их все (8 пунктов)? Никакого пояснительного кода в первом сообщении по этому поводу от вас не было.
2) Вы уверены в электрической работоспособности пинов, на которые выведен UART? Т.е. вы загружали тестовый код "моргания" ножками, и с помощью осциллографа/вольтметра/светодиода удостоверились, что выдача сигнала есть, и она корректна?
3) Вы удостоверились в работе UART? Т.е. вы загружали тестовый код, в котором корректно настраивали GPIO (для работы пинов в режиме коммутации к UART), тактирование (для корректного задания бод-рейта) и собственно сам UART (включение/тактирование внутренних узлов/четность/стоп-биты/и т.д.), после чего циклически посылали 1 байт и отслеживали его (через осциллограф/лог.анализатор/преобразователь UART-USB и терминал на компьютере)?
4) Вы удостоверились в работе DMA? Т.е. после успешного выполнения предыдущего пункта вы внимательно изучили мануал на ваш контроллер, зашили тестовую прошивку из предыдущего шага, но настройкой соответствующего канала DMA, которая циклически отсылает пакет из нескольких байт, и также успешно отследили его?

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Вт окт 04, 2022 17:52:35

Azeront, у него не собирается проект, так что до работоспособности железа тут еще далеко.
Топикстартеру следует создать чистый Си-проект с этим МК, ничего не добавляя в проект и попробовать собрать. При успешной сборке продолжить дальше и написать
Код:
#include <stdio.h>
int main(void)
{
    printf("0123");
    while(1);
}

и проверить сборку. Если успешно, тогда "дело было не в бобине". Если с ошибками, тогда что-то с совместимостью и косяком в IDE, либо проблема в неверной настройке проекта.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Ср окт 05, 2022 12:50:00

> у него не собирается проект
приколный ты, полосатый! цепь и дуб уже приобрел?!

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Ср окт 05, 2022 13:18:52

Чёт не понял смысла этих слов. Всё ещё не отпустило штоль?

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Чт окт 06, 2022 07:22:36

> не понял смысла этих слов
потому как шибко ученый, по цепи ходишь вокруг дуба и сказки налево и направо гутаришь... (учите классику, и меньше фантазируйте)

> у него не собирается проект
это из каких таких сказочных мыслей вывод сделали?!

> Всё ещё не отпустило штоль?
это вы правильный вопрос задали себе ...
если что по делу - пишите, а так общайся сам с собой, зеркало имеется у хозяина?! :о)

> Топикстартеру следует создать чистый Си-проект с этим МК
не видишь разницу между стандартной реализацией и PDC/DMA?
естественно вылезут анрезолвы _put_/_write_, но это из другой оперы.

Azeront, спасибо, первые 3 пункта можно было опустить сразу :о), затык сейчас с DMA (нормальная работа пока только в asf, пытаюсь сделать без нее)

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Чт окт 06, 2022 08:31:45

Странный этот sunjob. Сам себе придумал проблему на пустом месте, со стандартным именем printf, чисто для ЧСВ.

Re: AVR Atmel SAM3x8E / Arduino Due - реализация pritnf() на

Чт окт 06, 2022 18:39:22

ув. MLX90640! поакуратнее на поворотах... :sleep:
а вот
Странный этот sunjob
правильно, значит все таки послушался, взял у хозяина зеркало, общаешься... молодец!
реализуй работу ком-порта через DMA - будешь вообще умничка и хоть за тешься ЧСВ :shock:
я первый отдам тебе на царапки свои любимые хозяйские тапочки

исходные
- sam3x8e
- no asf library
- no printf and std
- DMA/PDC

уточняю, обычная asf-реализация работает без проблем, нужно низкоуровневый вариант через DMA (например, указанная бибилотека)

если по делу нечего... то лучше царапками займитесь, на кухне чашками, проверьте лоток, мышку под шкафом... столько дел еще не переделанных :)))

p.s. ай молотцы, нашЛепали! :))) :))) :))) кроме минусов еще что-нить можем? :facepalm:

DMA заработал!
Код:
////////////////////////////////////////////////////////////////////////////////
void uart_ini_baud(int32_t baud)
////////////////////////////////////////////////////////////////////////////////
{
//###!!!
// direct access to PIO
//###!!!
PIOA->PIO_IDR   =   PIO_PA8A_URXD | PIO_PA9A_UTXD;
PIOA->PIO_PDR   =   PIO_PA8A_URXD | PIO_PA9A_UTXD;
PIOA->PIO_ABSR &= ~(PIO_PA8A_URXD | PIO_PA9A_UTXD) & PIOA->PIO_ABSR;
PIOA->PIO_PUER  =   PIO_PA8A_URXD; // | PIO_PA9A_UTXD;

PMC->PMC_WPMR       = 0x504D4300;
PMC->PMC_PCER0      = (1 << PF_ID_UART);
PMC->PMC_WPMR       = 0x504D4301;
PF_UART->UART_CR    = UART_CR_RXDIS | UART_CR_TXDIS | UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RSTSTA;
PF_UART->UART_BRGR  = (MCLK / baud / 16);
PF_UART->UART_MR    = UART_MR_PAR_NO  | UART_MR_CHMODE_NORMAL;
PF_UART->UART_PTCR  = UART_PTCR_RXTEN | UART_PTCR_TXTEN;
PF_UART->UART_CR    = UART_CR_RXEN    | UART_CR_TXEN;
}
////////////////////////////////////////////////////////////////////////////////

всем спасибо :)))
Ответить