-
- А что делает sprintf если строка длиннее чем буфер? - Т.Достоевский(19.07.2010 23:42)
- Вообщем, нормально реализованный printf кагбэ универсальнее. Например, для последовательного порта: printf вызывает putchar(), которая кладет очередной символ в кольцевой буфер. Далее можно уже заюзать DMA и прерывания аппаратного порта для передачи из Гудвин(523 знак., 19.07.2010 23:57)
- Хотелось бы колцевой буфер реализовать. Думаю как заставить ДМА переключать указатель на начало буфера, чтобы получилось кольцо. Т.Достоевский(288 знак., 20.07.2010 00:03 - 00:08)
- переставлять по прерыванию по достижению конца буфера - koyodza(20.07.2010 00:05)
- В stm32 по моему нет такой аппаратной возможности. А может и есть, только сегодня начал с ним разьираться %-)). - Т.Достоевский(20.07.2010 00:11)
- DMA - это не тот модуль, за который стоит браться в первый же день изучения нового МК - koyodza(20.07.2010 15:53)
- Чёта легко както его запустил, аж сам испугалсо ;)). И ПДФы не читал. Может по тому что он у мну овер9000 посчёту. Ну 15ый точнно :)) - Т.Достоевский(21.07.2010 04:53 - 04:57)
- Там есть прерывание по окончанию пересылки блока (счетчик DMA). Потом назначаешь новый адрес, устанавливаешь счетчик и т.д... - Гудвин(20.07.2010 00:14)
- Хотелось бы чтобы передача пошла сразу как только появился первый символ. А потом докидывать. Но по моему это невозможно. А в stm тоже два ДМА указателя? - Т.Достоевский(20.07.2010 00:18)
- PS: СРАЗУ - это означает, что как только ты вывел первый символ в кольцевой буфер посредством putchar(), ты запускаешь DMA для пересылки этого символа. А дальше "как карта ляжет"... - Гудвин(20.07.2010 00:39)
- для запуска ДМА надо заносить количество символов которые передать, вот с этим и проблема. - Т.Достоевский(20.07.2010 00:56)
- Где проблема? Заносишь сначала один символ. Потом по мере заполния/опустошения буфера заносишь в счетчик столько требуется... - Гудвин(20.07.2010 01:07)
- И в чем тогда преимущество? Тогда уж по прерыванию послать проще, чем ДМА перенастраивать каждый раз. - Vladimir Ljaschko(21.07.2010 05:58)
- конечно проще. DMA удобен для пакетной передачи, а не побайтовой. А при скоростях уарта большой необходимости в нём нет - koyodza(21.07.2010 10:00)
- В большинстве случаев правда. Но если скорость побольше, типа 921600, то уже с FIFO или DMA полегче, не такая большая загрузка. - sbb(21.07.2010 13:27)
- Есть еще проблема с printf("Hello number 1"); printf("Hello again! DMA busy? ;)"); - Vladimir Ljaschko(21.07.2010 13:50)
- то понятно, имелись ввиду стандартные применения - koyodza(21.07.2010 13:47)
- В большинстве случаев правда. Но если скорость побольше, типа 921600, то уже с FIFO или DMA полегче, не такая большая загрузка. - sbb(21.07.2010 13:27)
- конечно проще. DMA удобен для пакетной передачи, а не побайтовой. А при скоростях уарта большой необходимости в нём нет - koyodza(21.07.2010 10:00)
- Надо сначала остановить а потом прибавить. Иначе неизвестно сколько га данный момент уже передал. Или йа фсёже гоню и это не так? - Т.Достоевский(20.07.2010 01:11)
- А ты попробуй, потом нам расскажешь :) Походишь по каким-нить грабелькам типа DMA контроллер требует выравнивания на границу 4 байта. Или (смутно помню) koyodza вроде упоминал требования кратности счетчика=2 для DMA в STM. В LPC для DMA еще существуют Гудвин(275 знак., 20.07.2010 01:18)
- я уже и сам смутно помню, кажись проблемы были не с длиной, а с "головой" буфера - koyodza(21.07.2010 10:50)
- А ты попробуй, потом нам расскажешь :) Походишь по каким-нить грабелькам типа DMA контроллер требует выравнивания на границу 4 байта. Или (смутно помню) koyodza вроде упоминал требования кратности счетчика=2 для DMA в STM. В LPC для DMA еще существуют Гудвин(275 знак., 20.07.2010 01:18)
- И в чем тогда преимущество? Тогда уж по прерыванию послать проще, чем ДМА перенастраивать каждый раз. - Vladimir Ljaschko(21.07.2010 05:58)
- Где проблема? Заносишь сначала один символ. Потом по мере заполния/опустошения буфера заносишь в счетчик столько требуется... - Гудвин(20.07.2010 01:07)
- для запуска ДМА надо заносить количество символов которые передать, вот с этим и проблема. - Т.Достоевский(20.07.2010 00:56)
- Вообщем, для отдадки наплюй на всяческие DMA, как уже посоветовали. Лишние грабли там ни к чему. И будет тебе и СРАЗУ, и выведется все, что хотел вывести при вызове функции printf(). Для критичной ко времени отладки лучше "мигать светодиодом". - Гудвин(20.07.2010 00:34)
- PS: СРАЗУ - это означает, что как только ты вывел первый символ в кольцевой буфер посредством putchar(), ты запускаешь DMA для пересылки этого символа. А дальше "как карта ляжет"... - Гудвин(20.07.2010 00:39)
- Хотелось бы чтобы передача пошла сразу как только появился первый символ. А потом докидывать. Но по моему это невозможно. А в stm тоже два ДМА указателя? - Т.Достоевский(20.07.2010 00:18)
- DMA - это не тот модуль, за который стоит браться в первый же день изучения нового МК - koyodza(20.07.2010 15:53)
- В stm32 по моему нет такой аппаратной возможности. А может и есть, только сегодня начал с ним разьираться %-)). - Т.Достоевский(20.07.2010 00:11)
- переставлять по прерыванию по достижению конца буфера - koyodza(20.07.2010 00:05)
- сколько ни смотрел в help-ах для разных МК-шных компиляторов, так и не понял, что за буфер для printf, с чем он связан, как его обозначить и иметь доступ... Это так просто, мысли. Пользоваться printf-ом вроде нет необходимости... - Argon(20.07.2010 00:04)
- А там и нет никакого буфера. Как правило есть функция putchar(), рихтуемая самим пользователем. Буфер, взаимодействие с железом - все ручками... - Гудвин(20.07.2010 00:09)
- в глубинах памяти маячат фразы: "каналы... потоки... cout >> блаблаба..." вроде как-то связано с printf? Или нет? :) - Argon(20.07.2010 00:13)
- А мы и словов то таких не ведаем, включая ++ ;) - Гудвин(20.07.2010 00:16)
- Но сдается мне, что там в стандартной поставке самый банальный putchar() , упаковнный в красивую обертку и названный соответственно ;) - Гудвин(20.07.2010 00:26)
- я думал, это из обычных Сей. очень как-то смутно помню... тогда еще потоками назывались вовсе не те потоки как сейчас, а гораздо хуже. - Argon(20.07.2010 00:21)
- А мы и словов то таких не ведаем, включая ++ ;) - Гудвин(20.07.2010 00:16)
- в глубинах памяти маячат фразы: "каналы... потоки... cout >> блаблаба..." вроде как-то связано с printf? Или нет? :) - Argon(20.07.2010 00:13)
- А там и нет никакого буфера. Как правило есть функция putchar(), рихтуемая самим пользователем. Буфер, взаимодействие с железом - все ручками... - Гудвин(20.07.2010 00:09)
- Хотелось бы колцевой буфер реализовать. Думаю как заставить ДМА переключать указатель на начало буфера, чтобы получилось кольцо. Т.Достоевский(288 знак., 20.07.2010 00:03 - 00:08)
- портит то, что лежит за буфером - Alex B.(19.07.2010 23:44)
- А есть такая функция которая тормозится? - Т.Достоевский(19.07.2010 23:47)
- есть. Я обычно такие использую. Иногда (от задачи зависит) использую такие, которые теряют данные при полном буфере, если надо - выставляют флажок. В целом же в правильно спроектированной системе вероятность подобного события должна стремиться к нулю - koyodza(19.07.2010 23:49)
- Речь идёт о консоли для отладки :)) - Т.Достоевский(19.07.2010 23:52)
- почти идеальная консоль для отладки - debug_printf у кроссворка. форматирование - на стороне ПЦ, кроме принтфа - можно и файло всякое сливать на ПЦ, логи вести, даже выполнять на ПЦ что угодно. разве что тормозит проц на время ожидания обращения со Mahagam(12 знак., 20.07.2010 12:27)
- для отладки можно (и даже лучше будет) обойтись без DMA - koyodza(20.07.2010 00:04)
- +1000 - Гудвин(20.07.2010 00:06)
- Речь идёт о консоли для отладки :)) - Т.Достоевский(19.07.2010 23:52)
- есть. Я обычно такие использую. Иногда (от задачи зависит) использую такие, которые теряют данные при полном буфере, если надо - выставляют флажок. В целом же в правильно спроектированной системе вероятность подобного события должна стремиться к нулю - koyodza(19.07.2010 23:49)
- А есть такая функция которая тормозится? - Т.Достоевский(19.07.2010 23:47)
- Вообщем, нормально реализованный printf кагбэ универсальнее. Например, для последовательного порта: printf вызывает putchar(), которая кладет очередной символ в кольцевой буфер. Далее можно уже заюзать DMA и прерывания аппаратного порта для передачи из Гудвин(523 знак., 19.07.2010 23:57)
- Это уже второй вопрос ;) - Гудвин(19.07.2010 23:18)
- первый
нах- koyodza(19.07.2010 23:31, ссылка) - Дыкыть может оказаться и первым! Достоевский цепляет ДМА к буферу, а над буфером осуществляет sprintf и выставляет какой-нить флаг. А printf вроде и не причем... - Argon(19.07.2010 23:24)
- первый
- Йа даже таких слов незнаю. - Т.Достоевский(19.07.2010 23:15)
- А что делает sprintf если строка длиннее чем буфер? - Т.Достоевский(19.07.2010 23:42)