Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: libopencm3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4
SasaVitebsk
Цитата(jcxz @ Apr 16 2015, 10:02) *
Готовность AT45DB никак не надо обходить. Считывать регистр состояния согласно документации. Хоть программно, хоть с DMA.

Подскажите а в чём преимущество, если я готовность буду через DMA получать?
Просто мозг закипает.
Кто-нибудь приведёт расчёт доказывающий эффективность такой работы?
Для меня совершенно очевидна потеря производительности процессора в данном случае. Плюс явное усложнение читаемости программы. Плюс существенное замедление процесса записи флэшки.
По-моему необходимо рассчитывать производительность системы в целом. Не всегда имеет смысл передавать управление другой задаче. Учитывая, что время переключения с задачи на задачу фиксированное и зависит от выбранной ОС и особенностей процессора, чем меньше будет тик ОСи тем больше потери будут на обслуживание работы ОСи. Но тем быстрее будет реакция системы. Поэтому необходим какой-то компромисс. Но в любом случае что вызов прерывания, что передача управления другой задаче это многие десятки тактов. Если анализ занимает меньшее время, или сопоставим, нет смысла этим заниматься.
mantech
Цитата(Golikov A. @ Apr 16 2015, 10:26) *
Это не верно!
Они вредят только в одном случае, при неожиданном разрыве обмена их надо очищать от старых пакетов... И в LPC для уарта они сделали очистку, а для SSP нет, приходиться 8 слов читать чтобы точно передатчик был пусть, в случае слейва это ложиться на внешнее устройство...


Тогда объясните алгоритм приема пакета с фифо, где 1й байт ИД, который нужно фильтровать, затем адрес, то-же самое, и длина, по которой определяется буфер, а в конце еще и КС??
Причем длина, как правило, не кратна фифо. Таймауты использовать нельзя!

Цитата(SasaVitebsk @ Apr 16 2015, 12:23) *
Подскажите а в чём преимущество, если я готовность буду через DMA получать?
Просто мозг закипает.


По своей памяти, с флешкой работал странично, т.е. запихиваю 264 байта, через дма, затем жду отмены бизи, потом опять...

Если флешка побайтная - то дма не нужен, только для чтения и блоками.

Цитата(jcxz @ Apr 16 2015, 10:02) *
Ну да... 11520*6UART*2(TX/RX) итого частота прерываний ==138240Гц, т.е. - прерывания с периодом 7.2мкс конечно не нагружают никак систему


Это крайний случай, когда все урты работают в непрерывном потоке, для таких целей используют потоковые коммуникационные процессоры, со встроенной аппаратной распарсировкой пакетов и дма в "автомате".

И 130кгц прерываний, для векторного nvic - это немного. Тут все зависит от "кривости" обработчика wink.gif
Golikov A.
Цитата
Тогда объясните алгоритм приема пакета с фифо, где 1й байт ИД, который нужно фильтровать, затем адрес, то-же самое, и длина, по которой определяется буфер, а в конце еще и КС??
Причем длина, как правило, не кратна фифо. Таймауты использовать нельзя!


такой же как и без FIFO. Только разница вот в чем. На 115200 время передачи 1 символа ~87 мкСек, а 16 символов уже 1.3 мСек. То есть если у вас нет фифо, то вы нигде не можете висеть дольше 87 мкСек, потому что иначе уже полученный символ затрется следующим, а если фифо есть, то у вас уже 1.3 миллисекунда есть в запасе до того как начнут гибнуть пришедшие символы.

Можно сразу сделать опрос по таймеру с 1 мСек интервалами, и ничего гарантированно не потеряется а нагрузка в 16 раз меньше чем по прерыванием на каждый символ.

FIFO ничего не меняет в логике, кроме того что создает запас на всякие непредвиденные случаи.
mantech
Цитата(Golikov A. @ Apr 16 2015, 20:06) *
FIFO ничего не меняет в логике, кроме того что создает запас на всякие непредвиденные случаи.


Хорошо, объясню подругому... Принимаю пакет, фифо настроен на 16 байт, а пакет - 7, т.е. прерывания на прием я не дождусь, а придет оно только, когда приму еще 9 байт, или таймаут, но я должен сразу ответить устройству, что принял от него пакет, а я отвечу только через мсек, а устройство будет "думать", что пакет проглотился и начнет слать новый - не годится.



Цитата(Golikov A. @ Apr 16 2015, 20:06) *
Можно сразу сделать опрос по таймеру с 1 мСек интервалами,


Еще плюс таймер задействовать под каждый уарт... Таймера всегда нужны для более важных задач. Плюс те-же доп. прерывания, зачем??

ЗЫ. Лично мое мнение - фифо использовать хоть как-то удобно только под небольшие пакеты кратной длины, остальное либо прерывания, либо дма.
den_po
Цитата(mantech @ Apr 16 2015, 23:31) *
Хорошо, объясню подругому... Принимаю пакет, фифо настроен на 16 байт, а пакет - 7, т.е. прерывания на прием я не дождусь, а придет оно только, когда приму еще 9 байт, или таймаут, но я должен сразу ответить устройству, что принял от него пакет, а я отвечу только через мсек, а устройство будет "думать", что пакет проглотился и начнет слать новый - не годится.

Таймаут в 3-4 символа -- это слишком много? Что это за устройство у вас такое?
jcxz
Цитата(SasaVitebsk @ Apr 16 2015, 15:23) *
Подскажите а в чём преимущество, если я готовность буду через DMA получать?
...
Учитывая, что время переключения с задачи на задачу фиксированное и зависит от выбранной ОС и особенностей процессора, чем меньше будет тик ОСи тем больше потери будут на обслуживание работы ОСи. Но тем быстрее будет реакция системы. Поэтому необходим какой-то компромисс. Но в любом случае что вызов прерывания, что передача управления другой задаче это многие десятки тактов. Если анализ занимает меньшее время, или сопоставим, нет смысла этим заниматься.

Вы мой пост вообще читали или сразу отвечать начали? wink.gif
Я вообще-то там и написал, что в зависимости от соотношения частот CPU и SCLK SPI (сколько тактов CPU займёт SPI-транзакция) и от размера транзакции и нужно определять, что эффективнее - через DMA, или по прерываниям или вообще поллингом (если SCLK - велика, а транзакция == 1-2 байта).

Кстати, если речь зашла о AT45DB, то насколько помню там есть возможность быстрого чтения статуса: при активном сигнале CS и отсутствии обмена по SPI, она на линии MISO держит статус занятости. И достаточно просто прочитать состояние пина.
Хотя - может путаю с другой ИС? Уже не помню, давно работал с ней....

Цитата(mantech @ Apr 17 2015, 00:31) *
Хорошо, объясню подругому... Принимаю пакет, фифо настроен на 16 байт, а пакет - 7, т.е. прерывания на прием я не дождусь, а придет оно только, когда приму еще 9 байт, или таймаут, но я должен сразу ответить устройству, что принял от него пакет, а я отвечу только через мсек, а устройство будет "думать", что пакет проглотился и начнет слать новый - не годится.

Что за протокол такой кривой, что 3-4 символа задержка для него обрушивает обмен? На помойку его! wink.gif
Если таймаут ответа такой короткий, то получается и ответ надо формировать в ISR, а перед этим значит надо и распарсить принятый кадр (на который отвечаем), а значит и парсер входящих кадров
(и собственно вся обработка протокола) должен быть в ISR.
Вот собственно Вы сами и ответили на свой-же вопрос про 130кГц прерываний biggrin.gif
Так построенная работа (обработка протокола в ISR) да ещё для нескольких каналов параллельно и завалит всю вашу систему wink.gif
Пока Вы будете формировать ответ с таймаутом 3-4 символа в ISR, в это время по другому каналу (работающему без FIFO) произойдёт потеря байтов.

Только не надо выдумывать следующий умозрительный случай, с протоколом работающим на низкой бодовой скорости и короткими таймаутами на ответ в 1-2 символа wink.gif

Цитата(mantech @ Apr 17 2015, 00:31) *
ЗЫ. Лично мое мнение - фифо использовать хоть как-то удобно только под небольшие пакеты кратной длины, остальное либо прерывания, либо дма.

Главный плюс FIFO: кратное снижение необходимой частоты обслуживания хоть процессором (снижение частоты прерываний) хоть DMA (пакетные пересылки по шине, меньше её занятость).

Цитата(mantech @ Apr 16 2015, 22:42) *
И 130кгц прерываний, для векторного nvic - это немного. Тут все зависит от "кривости" обработчика wink.gif

Немного, когда CPU нечем больше заниматься...
Golikov A.
Цитата
Принимаю пакет, фифо настроен на 16 байт, а пакет - 7, т.е. прерывания на прием я не дождусь,

А... дело в том что фифо всегда 16 символов, оно не настраиваемо. А прерывание можно настроить на 1 символ, половину фифо, все фифо.

В приведенном примере настраиваем прерывание на 1 символ, ставим ему не высокий приоритет и все.
Дальше все работает так же как и ваш алгоритм, за одним исключением в прерывании читаем на 1 символ, а все что пришли. И мы никогда не имеем ситуации потренных символов обмена, потому что даже если мы не успели за время прерывания попасть в обработчик (например обсулуживали со всеми ответами соседний уарт), то символ сохраниться в фифо.

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


Для SPI slave без фифо или ДМА вообще нельзя, внешнее устройство делает клоки и вам надо успевать пихать данные, тут выходное фифо вам дает хоть какую-то свободу а без него, только ДМА иначе тупо долбить флаг что ушел очередной байт и мигом пихать новый, и не моги ни на что отвлекаться...
mantech
Цитата(jcxz @ Apr 17 2015, 05:27) *
Вот собственно Вы сами и ответили на свой-же вопрос про 130кГц прерываний
Так построенная работа (обработка протокола в ISR) да ещё для нескольких каналов параллельно и завалит всю вашу систему


Не буду впадать в тупой спор, просто скажу, что кроме уартов на интах, работает файловая система, сетевой стек, парсер биткода виртуальной задачи, работа с кучей периферии, включая несколько каналов 1wire(кто в теме, тот знает, как этот протокол чувствителен к задержкам)и еще много чего... И самое главное - все работает и "не жужжит". Зависнуть все может только из-за кривости самого программиста.

Цитата(Golikov A. @ Apr 17 2015, 08:11) *
Потом настраиваем прерывание на 1 символ, ставим ему не высокий приоритет и все.лекаться...


Дак какой тогда выигрыш-то, кроме дополнительных настроек? Я же говорю, что выигрыш есть, если в протоколе байты передаются кратными пакетами, на которые настроен триггер фифо. Ну сколько времени потребуется, если в инте проверить пару байт и записать в память с инкрементом счетчика?? На частоте 160 МГц?? И за это время что можно потерять?? Ничего не терялось никогда.
den_po
Цитата(Golikov A. @ Apr 17 2015, 10:11) *
А... дело в том что фифо всегда 16 символов, оно не настраиваемо. А прерывание можно настроить на 1 символ, половину фифо, все фифо.

Не особо понимаю, к чему это (просто конкретный пример?), но на всякий случай замечу, что на некоторых МК размер фифо настраивается, а ещё фифо умеют генерить прерывание таймаута.

Наверное я кривовато выразился про настройку размера, да.
Golikov A.
Если фифо железное, то глубина фифо определена жестко, вопрос в том на какой наполненности мы узнаем что там что-то есть. Если только можно увеличить глубину одного фифо за счет другого... но это экзотика какая-то ИМХО.

Цитата
И самое главное - все работает и "не жужжит"

Ну можно только вам позавидовать. Я бы переживал за систему у которой практически все на прерываниях висит...

Цитата
Дак какой тогда выигрыш-то, кроме дополнительных настроек?

Доп настроек на самом деле нет, но не важно. Выигрыш в том что повышается надежность и снижается критичность скорости обработки прерываний. Вплоть до того что если общий цикл короткий, то можно вообще без прерываний, полингом из основного цикла проверять наличие данных. На вход и выход в прерывание есть накладные расходы, летать на каждый символ всяко будет хуже чем вообще не летать в случае полинга или летать 1 раз с таймером на длительный интервал, в котором можно разом все уарты обработать.

Цитата
Ну сколько времени потребуется, если в инте проверить пару байт и записать в память с инкрементом счетчика??

А обработка общего буфера где? А как же про ответ за время 2-3 символов?
jcxz
Цитата(mantech @ Apr 17 2015, 11:17) *
Дак какой тогда выигрыш-то, кроме дополнительных настроек? Я же говорю, что выигрыш есть, если в протоколе байты передаются кратными пакетами, на которые настроен триггер фифо. Ну сколько времени потребуется, если в инте проверить пару байт и записать в память с инкрементом счетчика?? На частоте 160 МГц?? И за это время что можно потерять?? Ничего не терялось никогда.

Какие пару байт? Передёргиваете. Вы писали про размер кадра немного меньше размера FIFO. Его проверить надо (валидность всех полей, CRC, etc), прогнать полученный кадр по всем веткам протокола обмена надо (а он может быть многоуровневый) и только после этого можно будет формировать ответ (который тоже нужно сформировать (CRC и т.п.)).
А представьте теперь, что как раз в это время когда Вы это всё будете делать, по другому UART пришло ещё пару байт. А если ещё в этот момент и по 3-му и по 4-му UARTам ...?
Вероятность всё меньше и меньше, но это только говорит о том, что такие ситуации будут происходить редко, и будет Ваша система работать-работать, но иногда глючить
(терять байты, нарушаться связь при идеальной линии и т.п.).

И вот не надо рассказывать про 160МГц, здесь вроде не маркетологи сидят, а кое-кто даже даташиты на МК почитывает wink.gif
У Вас ПО из ОЗУ работает? Или всё-таки из флешь? А скорость флешь с ростом частоты CPU не повышается, как была около 20МГц, так и осталась даже на STM32F4.
Так что - работало-работало Ваше ПО в фоне, горя не знало, заполнило кеш строками из фоновой задачи, тут вдруг пришло прерывание от UART и полезло оно вытаскивать команды из флешь, медленно и печально на 20МГц-ах...
А ему надо успеть за 2-3 символа кучу работы обмолотить. Опа... smile3009.gif
Хоть техасцы в Tiva сделали шину к флешь в 2 раза пошире - там быстрее должно вытаскивать команды из флешь....
mantech
Цитата(jcxz @ Apr 17 2015, 10:01) *
Какие пару байт? Передёргиваете. Вы писали про размер кадра немного меньше размера FIFO. Его проверить надо (валидность всех полей, CRC, etc), прогнать полученный кадр по всем веткам протокола обмена надо (а он может быть многоуровневый) и только после этого можно будет формировать ответ (который тоже нужно сформировать (CRC и т.п.)).


CRC считается по таблице - это недолго, определить ИД и длину еще быстрее, и флеш не такой уж медленный, как кажется, во первых 64 или 128 битный доступ, плюс конвеер, скорость почти не ограничивает, если не делать умопомрачительных ветвлений.
И протокол не настолько "тупой", много чего делается до начала передачи (ответы подтверждения, запроса идентификации вновь подключенных устройств и т.д.)
jcxz
Цитата(mantech @ Apr 17 2015, 14:50) *
CRC считается по таблице - это недолго, определить ИД и длину еще быстрее, и флеш не такой уж медленный, как кажется, во первых 64 или 128 битный доступ, плюс конвеер, скорость почти не ограничивает, если не делать умопомрачительных ветвлений.

CRC - это для примера. Может быть, что угодно для проверки валидности кадра.
64-битный доступ к флешь увеличивает скорость флешь всего в 2 раза (даже на линейном коде без ветвлений в случае последовательности 4-байтовых инструкций) с 20 до 40МГц (эквивалентных).
Для 160МГц без тормозов на линейном 4-байтовом коде, нужна шина 256бит к флешь-памяти. Как сделано в Tiva.

PS: Впрочем - тред уже совсем ушёл в сторону. Вас не переубедить похоже, да и нафик wink.gif
Golikov A.
А еще любое прерывание - это сброс всех конвейеров...
mantech
Цитата(jcxz @ Apr 17 2015, 12:42) *
64-битный доступ к флешь увеличивает скорость флешь всего в 2 раза (даже на линейном коде без ветвлений в случае последовательности 4-байтовых инструкций) с 20 до 40МГц (эквивалентных).

PS: Впрочем - тред уже совсем ушёл в сторону. Вас не переубедить похоже, да и нафик wink.gif


Для справки, в стм флеш шина 128бит и частота 30МГц. Подружитесь с математикой и посчитайте, сколько времени выполняется одна инструкция при этих частотах, и сопоставте со временем между приемом символов...
ЗЫ Для обработки моего "неудачного" протокола требуется от 25 до 40 машинных инструкций, вот и прикинте, если интересно, а переубеждать меня не надо, я не зеленый студент, и проектов дофига сделал, причем все работают как надо rolleyes.gif
Эдди
Если кому интересно, можно глянуть на систему управления спектрографом. Я ее с использованием opencm3 делал.
Вполне удобная библиотека. Правда, часть вещей все равно лучше напрямую регистрами делать...
drozel
А позвольте некропостнуть и вступить в полемику по поводу высокоуровневых либ а-ля Cube.
Я сейчас много об этом думаю, а тут на тему наткнулся, прочитал 5 страниц.
Насколько я понял, большинство не переносит Cube по причине сложности (читай - простоты использования и универсальности). Ее верхний уровень куда выше верхнего уровня той же stdlib и уж подавно opencm3, поэтому напрямую их сравнивать как бы не совсем корректно.
Я не претендую на правоту, скорее хочу взвесить все за и против.

Вот, к примеру, надо мне передать 100 байт по UART. Раньше пользовался stdlib, в прерывании вызывал функцию, которая хранит пойнтер на массив, индексирует его и отдает очередной байт. Позже появилось желание не писать это в каждом проекте, а создать либу верхнего уровня для UART. Потом был SPI и так далее. В cube сделано то же самое, только универсально (и я хочу верить, ее проверяли, во всяком случае, версии новые выходят): есть готовый обработчик прерываний, досылающий массив, и вызывающий калбек поле полной отправки.
Да, код из-за этого большой. Конечно, если я буду делать максимально маленькое или максимально быстрое приложение, ни о каком cube речи не идет. Возможно, иногда даже поллингом получится передать быстрее, чем через прерывания или DMA.
Объясните, чем он так плох? И чем хорошо использовать opencm3, который не намного удобней работы с регистрами для человека, хорошо знакомого с камнем?
Эдди
Вкратце: CUBE — признак идиота. Это как ардуйня. Только даже хуже.
drozel
Цитата(Эдди @ Oct 6 2015, 11:43) *
Вкратце: CUBE — признак идиота. Это как ардуйня. Только даже хуже.

А Вы попробуйте не вкратце, если не сложно.
Где граница между признаком идиота и библиотекой? Графические библиотеки тоже под запретом? А готовые ОС?
Если что, я не о программе Cube, а о библиотеке, что она использует. STM позиционирует ее как замену stdperiph_lib.
mantech
Цитата(drozel @ Oct 6 2015, 07:10) *
Объясните, чем он так плох? И чем хорошо использовать opencm3, который не намного удобней работы с регистрами для человека, хорошо знакомого с камнем?


Да ни чем не плох, просто всегда удивляюсь, когда кто-нибудь решает, что можно ничего не зная о камне, как правило, не читая доков, просто взять какой-нить визард, типа куба и пр... и "написать" на нем прогу любой сложности, за день или меньше... Так-то фиг с ним, пускай пишет, только потом она, почему-то не работает!!! Вот почему, блин?!

По мне, можно писать на чем угодно, сам писал с использованием либ от СТ, но при этом хотя-бы чуток разбираться в камне и уметь читать код этих либ, тогда и понимание, "почему...", придет само собой.

Цитата(Эдди @ Oct 6 2015, 08:43) *
Вкратце: CUBE — признак идиота. Это как ардуйня. Только даже хуже.


Скажем так, если "программист" считает, что на кубе можно все "написать" от и до, то да - признак идиота, а если его использовать, как вспомогательный инструмент к голове - то полезная вещь.
ЗЫ. А на счет ардуины - не стоит так категорично, иногда нужно сделать просто и быстро - почему и нет?? Сам себе сделал что-то подобное на МХ6 с графикой, типа виндовой - для есложных приложений с гуем - самое оно biggrin.gif
Golikov A.
Вот вам на пальцах:

Ну берем SPI, настраиваем по кубовски на ДМА слейв прием, все там подключаем, запускаем, вроде как работает.

Идем дальше, хотим сделать так, буфер 1024 байта, заполняется по ДМА, время от времени проверяем его и если в нем уже есть полное сообщение (определяется по размеру сообщения в заголовке и по тому сколько байт приняло ДМА), забираем сообщение и перенастриваем ДМА на прием нового сообщения. Казалось бы все функции есть, и тут на тебе!

В процедуре завершения ДМА обмена вставлен таймаут аж на кучу миллисекунд. Ну е мое! И более того он еще забит одной единой коснтантой, и от него едут все остальные таймауты, И таймер нужен кубовский, который не просто считает а вызывает еще доп функции тормозя весь процесс... И начинаешь это все преписывать, допиливая библиотечные файлы, и в итоге для того чтобы сделать что-то с нормальной производительностью надо все руками переписать, сломав всю предложенную логику куба. И что от него остается?

Ну дальше мы добавляем кучу ошибок ввиде переменных у которых забили valotile и следовательно при оптимизации отличной от none половина задержек виснет насмерть. Дальше добавляем задержки через while которые убивают RTOS если вдруг до нее дойдет.

К этому так же надо добавить наличие просто ошибок, коих немало в кубе, то есть не оглядываясь его использовать во взрослом проекте нельзя. А если мне надо его весь прочитать и перелопатить, то почему бы мне не сделать свою нормальную библиотеку? Которая за пару тройку боевых проектов будет иметь все необходимое под проц, но написанное по моей архитектуре и в моем стиле, и с моим контролем ошибок?

Вот и получается что если какая-то игрушка то куб очень ничего для домохозяек пойдет. А если что-то взрослое да за деньги, то труда с кубом в разы больше, он не дает никакого бонуса, и потому вреден... И в целом аналогия верная, это как ардуйня...


Все естественно ИМХО.





mantech
Цитата(Golikov A. @ Oct 6 2015, 09:28) *
К этому так же надо добавить наличие просто ошибок, коих немало в кубе, то есть не оглядываясь его использовать во взрослом проекте нельзя. А если мне надо его весь прочитать и перелопатить, то почему бы мне не сделать свою нормальную библиотеку?

Все естественно ИМХО.


Дак так и получается, если делать не один проект, то все-равно дорабатываешь либы под себя и убираешь ошибки. Но ИМХО, писать с нуля, например усб стеки - ну это для отпетых "гурманов" biggrin.gif
SasaVitebsk
Мне кажется пример для UART вы неудачный выбрали. ))
Дело в том, что написать универсальный обработчик UART, на мой взгляд, нецелесообразно.
С одной стороны сам USART позволяет слишком многое, а с другой стороны законченный драйвер должен обеспечивать хотя бы канальный уровень (ведущий/ведомый, контрольная сумма, контроль приёма сообщений) и сетевой (определение маршрута и логическая адресация). А это для разных протоколов существенно отличается. То есть универсальный или не получится или будет слишком громоздкий, избыточный.
Кроме того значительно чаще интересен не "универсальный драйвер для одного типа МК (например STM32F4)", а драйвер для целого семейства. И здесь начинают проявляться особенности периферии. Посмотрите мануалы для F0/F1/F3/F4 контроллеров STM. Вроде похожи, но ... Кое где предусмотрена обработка полудуплекса, а где-то нет. Где то есть аппаратная обработка логичесской адресации. Разная обработка LIN протоколов. Ещё всякие особенности ...
Причём сама работа с железом у вас составит максимум 1% от библиотеки. Думаю меньше на самом деле. И она проста до безобразия. Вам просто надо почитать описание самих регистров.
Вот и получается ...
С одной стороны - прочитать описание регистров контроллера и написать универсальную (по возможности) библиотеку своего протокола.
С другой стороны - прочитать описание библиотеки КУБ или другой, со всеми взаимоувязками (так как там одна написана через другую) и, опять же, написать библиотеку своего протокола.
...
Так ответьте мне. В чём выигрыш? Я вот просто не пойму.
У меня создаётся впечатление, что библиотеками пользуются те, кто сами вообще ничего не пишут. А берут готовый пример с просторов инета, и прикручивают что-то своё с косяками.
...
Некоторыми библиотеками я пользуюсь сам. Например Ethernet. Но думаю, там то же самое. Просто недостаток моих знаний и времени. Я уверен, что если переписать это всё под себя то работать будет комфортней намного.
scifi
Цитата(mantech @ Oct 6 2015, 09:34) *
Но ИМХО, писать с нуля, например усб стеки - ну это для отпетых "гурманов" biggrin.gif

Вот-вот. Мне нравится, когда отдельные куски можно выдрать без особых усилий и вставить в свою программу. Конечно, если при выдирании выясняется, что там всё со всем связано тысячью нитей, то становится грустно...

Цитата(SasaVitebsk @ Oct 6 2015, 10:11) *
У меня создаётся впечатление, что библиотеками пользуются те, кто сами вообще ничего не пишут. А берут готовый пример с просторов инета, и прикручивают что-то своё с косяками.

+1. Запустить UART - это вообще тривиально. А режимы там разные могут быть, как верное подмечено, то есть рассчитывать на то, что чудо-библиотека всё сделает сама, не стоит. Если UART пугает, то, может, и подходить к МК не нужно?

Цитата(SasaVitebsk @ Oct 6 2015, 10:11) *
Например Ethernet. Но думаю, там то же самое. Просто недостаток моих знаний и времени. Я уверен, что если переписать это всё под себя то работать будет комфортней намного.

Я думаю, самому делать TCP - неблагодарное занятие. Читать все эти RFC (а их много), отлаживать алгоритмы в реальных условиях (а эти условия могут быть сильно разные) - куча работы. Если кто-то это уже проделал, глупо повторять этот же путь снова.
mantech
Цитата(scifi @ Oct 6 2015, 10:17) *
Конечно, если при выдирании выясняется, что там всё со всем связано тысячью нитей, то становится грустно...


Прямо в точку!! rolleyes.gif
drozel
Цитата(scifi @ Oct 6 2015, 13:17) *
+1. Запустить UART - это вообще тривиально.

Ну тривиально, тривиально. Также, как и SPI. Может я неправильно устроен, но, когда я таскаю из проекта в проект вывод printf в UART/USB, мне хочется запихать это уже в законченный .c + .h и подключать, как модуль.
А ведь периферии много. И UARTов может быть много, а это, как правильно подметили, 1% от серьезной программы. Код неплохо было бы иметь читаемый, а не CR |= 0x01b1;
ViKo
Цитата(drozel @ Oct 6 2015, 11:18) *
Код неплохо было бы иметь читаемый, а не CR |= 0x01b1;

Например:
Код
  USART2->CR1 =
    USART_CR1_SBK        * 0 |    // Send Break
    USART_CR1_RWU        * 0 |    // Receiver wakeup
    USART_CR1_RE        * 1 |    // Receiver Enable
    USART_CR1_TE        * 1 |    // Transmitter Enable
    USART_CR1_IDLEIE    * 0 |    // IDLE Interrupt Enable
    USART_CR1_RXNEIE    * 1 |    // RXNE Interrupt Enable
    USART_CR1_TCIE        * 0 |    // Transmission Complete Interrupt Enable
    USART_CR1_TXEIE        * 0 |    // TE Interrupt Enable
    USART_CR1_PEIE        * 0 |    // PE Interrupt Enable
    USART_CR1_PS        * 0 |    // Parity Selection - Even
    USART_CR1_PCE        * 0 |    // Parity Control Enable
    USART_CR1_WAKE        * 0 |    // Wakeup method
    USART_CR1_M        * 0 |    // Word length: 1 Start bit, 8 Data bits, n Stop bit
    USART_CR1_UE        * 1 |    // USART Enable
    USART_CR1_OVER8        * 0;    // USART Oversampling by 8 enable
Golikov A.
Цитата
Дак так и получается, если делать не один проект, то все-равно дорабатываешь либы под себя и убираешь ошибки. Но ИМХО, писать с нуля, например усб стеки - ну это для отпетых "гурманов"

не путайте теплое с мягким....

Одно дело написать один свой, нужный именно тебе функционал и проверить его.
Другое дело вычистить ошибки в огромном универсальном проекте выполняющим все возможные функционалы.

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






_Pasha
Сабж нормальный. Но API в некоторых местах не нравится.
Именно, gpio , rcc и dma
Нужно более юзабельные вещи.
gpio вообще хорошо бы кросс-платформенным сделать
т.е. настройка пинов как в SPL - с одним аргументом указателем на структуру.
Структура является надмножеством всех известных опций для нескольких архитектур.

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

drozel
Цитата(_Pasha @ Oct 6 2015, 18:01) *
dma - как бы тоже, чтобы канал и стрим выбирало само исходя из указанного адреса периферии.
в принципе - небольшая табличка во флеше решает проблемы с необходимостью лазать по даташиту.

Ну так это и есть библиотека более высокого уровня. Что-то вроде того и реализовано в Cube, но, говорят много ошибок и недоработок.
_Pasha
Цитата(drozel @ Oct 7 2015, 06:28) *
Ну так это и есть библиотека более высокого уровня. Что-то вроде того и реализовано в Cube, но, говорят много ошибок и недоработок.

Из куба один раз попробовал запустить что-то с usb, быстро перехотелось.

Высокого уровня... вот например - годами одна и та же функция настройки
Код
int uart_setup( // >0 - configured yet 0-service busy <0 - error
    char n,// which one
    baud_t baud, // may be long or int32
    char bits,      // ['5'..'9']
    char parity,  // ['E','O','N']
    char stops); // ['1','2']

не включает в себя экзотику типа multiprocessor mode или 1.5 стопа
но я что-то не припомню когда ими пользовался...



drozel
Люди, помогите с либой.
Пытаюсь завести USB CDC с libopencm3 и вот этим примером.
Я допускаю, что туплю, библиотека написана с каким то жонглированием указателями, которое мне пока непривычно + пришлось немного портировать на IAR, т.к. либа содержит много директив от GCC. На данный момент USB поднимается, но устройство не опознается, PID и VID комп видит нулевые.
Конкретный вопрос:
Код
usbd_device *usbd_init(const usbd_driver *driver,
               const struct usb_device_descriptor *dev,
               const struct usb_config_descriptor *conf,
               const char **strings, int num_strings,
               uint8_t *control_buffer, uint16_t control_buffer_size)
{
    usbd_device *usbd_dev;

    usbd_dev = driver->init();

    usbd_dev->driver = driver;
    usbd_dev->desc = dev;
    usbd_dev->config = conf;
    usbd_dev->strings = strings;
    usbd_dev->num_strings = num_strings;
    usbd_dev->ctrl_buf = control_buffer;
    usbd_dev->ctrl_buf_len = control_buffer_size;

    usbd_dev->user_callback_ctr[0][USB_TRANSACTION_SETUP] =
        _usbd_control_setup;
    usbd_dev->user_callback_ctr[0][USB_TRANSACTION_OUT] =
        _usbd_control_out;
    usbd_dev->user_callback_ctr[0][USB_TRANSACTION_IN] =
        _usbd_control_in;

    int i;
    for (i = 0; i < MAX_USER_SET_CONFIG_CALLBACK; i++) {
        usbd_dev->user_callback_set_config[i] = NULL;
    }

    return usbd_dev;
}

Что при этом возвращает функция? Указатель на локальную переменную (стек)?
Ведь переменная локальная, выделена не динамически. Я просто в ступоре.

---
UPD все, наладил, проблема была у меня.
Тем не менее, прошу ликбеза по си..
SasaVitebsk
Цитата(drozel @ Oct 8 2015, 12:24) *
Что при этом возвращает функция? Указатель на локальную переменную (стек)?

Функция возвращает указатель на структуру типа usbd_device. То есть фактически, на адрес в памяти, где находится переменная.
Цитата
Ведь переменная локальная, выделена не динамически. Я просто в ступоре.

Локальная - не есть выделенная динамически. Локальная выделяется на стеке и уничтожается при выходе из процедуры (точнее становится непредсказуемой). Выделена динамически, значит размещена на куче. Она уничтожается только явно процедурой free.
В данном случае локально объявляется указатель. Далее запускается driver->init(), что похоже динамически выделяет память и инициализирует структуру. П/п возвращает этот указатель.
В чём вопрос?
drozel
Цитата(SasaVitebsk @ Oct 8 2015, 16:34) *
В чём вопрос?

Да, запарился с этой либой, затупил.
_Pasha
usbd_device *usbd_init
возвращает указатель на static а не локальную.
usbd_dev = driver->init(); здесь он получает указатель

этот статик хранится в физике типа usb_f103.c и иже с ними
просто он там потому что самое большое число связей с ним именно там.
drozel
Да, уже нашел, спасибо. Просто непривычно: вместо того, чтоб сделать ее глобальной делают ее глобальным статиком и передают указатель через череду фукнций.
Более правильно, согласен.
В стдлибе от СТМ кстати, именно глобальные структуры
esaulenka
Цитата(drozel @ Oct 9 2015, 04:57) *
Да, уже нашел, спасибо. Просто непривычно: вместо того, чтоб сделать ее глобальной делают ее глобальным статиком и передают указатель через череду фукнций.
Более правильно, согласен.

Ну это такой сиплюсплюс из костылей: "класс" логики работает с "классом" физического драйвера через указатель на последний.
Если понимать принципы C++, всё понятно и очевидно.
Но работать всё равно неудобно - IDE не "прыгает" при чтении кода к соотв. функции, да и ошибиться при заполнении структуры с указателями куда легче...
drozel
Почти мигрировал с stdlib и cube на сабж.
Остался вопрос, нужна помощь.
Где файл, прописывающий в память таблицу векторов прерываний? В stdlib был стартап файл на асме, здесь уже перерыл все, в упор не вижу.
_Pasha
Цитата(drozel @ Oct 12 2015, 14:10) *
Почти мигрировал с stdlib и cube на сабж.
Остался вопрос, нужна помощь.
Где файл, прописывающий в память таблицу векторов прерываний? В stdlib был стартап файл на асме, здесь уже перерыл все, в упор не вижу.

это содержимое папки dispatch и далее по дефайну.



собирайте сразу в статик либу. гемора потом вообще 0.0%
правда, я перед этим выдрал из usb отдельно SCSI и компильнул либы без него.
потому что msc полно сюрпризов.
drozel
Цитата(_Pasha @ Oct 12 2015, 17:40) *
это содержимое папки dispatch и далее по дефайну.

Там 2 файла: vector_chipset.c и vector_nvic.c
Первый инклудит аналогичный файл из папки f4 (в моем случае), который просто включает сопроцессор:
Код
static void pre_main(void)
{
    /* Enable access to Floating-Point coprocessor. */
    SCB_CPACR |= SCB_CPACR_FULL * (SCB_CPACR_CP10 | SCB_CPACR_CP11);
}


Второй соответственно ищет vector_nvic.c в папке семейства, но его там нет.

Зато есть зацепка в папке scripts, скрипт irq2nvic_h, вроде на питоне (судя по строке #!/usr/bin/env python), содержащий, помимо всего прочего,такие строки
Код
"""Generate an nvic.h header from a small JSON file describing the interrupt
numbers.

Code generation is chosen here because the resulting C code needs to be very
repetetive (definition of the IRQ numbers, function prototypes, weak fallback
definition and vector table definition), all being very repetitive. No portable
method to achive the same thing with C preprocessor is known to the author.
(Neither is any non-portable method, for that matter.)"""


Я на питоне не силен, скачал интерпретатор под винду, пытаюсь его как-то запустить. Пока неудачно, но это вопрос скорее в тему по питону.
_Pasha
Цитата(drozel @ Oct 12 2015, 14:55) *
Зато есть зацепка в папке scripts, скрипт irq2nvic_h, вроде на питоне (судя по строке #!/usr/bin/env python), содержащий, помимо всего прочего,такие строки
Код
"""Generate an nvic.h header from a small JSON file describing the interrupt
numbers.

Code generation is chosen here because the resulting C code needs to be very
repetetive (definition of the IRQ numbers, function prototypes, weak fallback
definition and vector table definition), all being very repetitive. No portable
method to achive the same thing with C preprocessor is known to the author.
(Neither is any non-portable method, for that matter.)"""


Я на питоне не силен, скачал интерпретатор под винду, пытаюсь его как-то запустить. Пока неудачно, но это вопрос скорее в тему по питону.


держите для F4


CODE
/* This file is part of the libopencm3 project.
*
* It was generated by the irq2nvic_h script.
*
* This part needs to get included in the compilation unit where
* blocking_handler gets defined due to the way #pragma works.
*/


/** @defgroup CM3_nvic_isrpragmas_STM32F4 User interrupt service routines (ISR) defaults for STM32 F4 series
@ingroup CM3_nvic_isrpragmas

@{*/

#pragma weak nvic_wwdg_isr = blocking_handler
#pragma weak pvd_isr = blocking_handler
#pragma weak tamp_stamp_isr = blocking_handler
#pragma weak rtc_wkup_isr = blocking_handler
#pragma weak flash_isr = blocking_handler
#pragma weak rcc_isr = blocking_handler
#pragma weak exti0_isr = blocking_handler
#pragma weak exti1_isr = blocking_handler
#pragma weak exti2_isr = blocking_handler
#pragma weak exti3_isr = blocking_handler
#pragma weak exti4_isr = blocking_handler
#pragma weak dma1_stream0_isr = blocking_handler
#pragma weak dma1_stream1_isr = blocking_handler
#pragma weak dma1_stream2_isr = blocking_handler
#pragma weak dma1_stream3_isr = blocking_handler
#pragma weak dma1_stream4_isr = blocking_handler
#pragma weak dma1_stream5_isr = blocking_handler
#pragma weak dma1_stream6_isr = blocking_handler
#pragma weak adc_isr = blocking_handler
#pragma weak can1_tx_isr = blocking_handler
#pragma weak can1_rx0_isr = blocking_handler
#pragma weak can1_rx1_isr = blocking_handler
#pragma weak can1_sce_isr = blocking_handler
#pragma weak exti9_5_isr = blocking_handler
#pragma weak tim1_brk_tim9_isr = blocking_handler
#pragma weak tim1_up_tim10_isr = blocking_handler
#pragma weak tim1_trg_com_tim11_isr = blocking_handler
#pragma weak tim1_cc_isr = blocking_handler
#pragma weak tim2_isr = blocking_handler
#pragma weak tim3_isr = blocking_handler
#pragma weak tim4_isr = blocking_handler
#pragma weak i2c1_ev_isr = blocking_handler
#pragma weak i2c1_er_isr = blocking_handler
#pragma weak i2c2_ev_isr = blocking_handler
#pragma weak i2c2_er_isr = blocking_handler
#pragma weak spi1_isr = blocking_handler
#pragma weak spi2_isr = blocking_handler
#pragma weak usart1_isr = blocking_handler
#pragma weak usart2_isr = blocking_handler
#pragma weak usart3_isr = blocking_handler
#pragma weak exti15_10_isr = blocking_handler
#pragma weak rtc_alarm_isr = blocking_handler
#pragma weak usb_fs_wkup_isr = blocking_handler
#pragma weak tim8_brk_tim12_isr = blocking_handler
#pragma weak tim8_up_tim13_isr = blocking_handler
#pragma weak tim8_trg_com_tim14_isr = blocking_handler
#pragma weak tim8_cc_isr = blocking_handler
#pragma weak dma1_stream7_isr = blocking_handler
#pragma weak fsmc_isr = blocking_handler
#pragma weak sdio_isr = blocking_handler
#pragma weak tim5_isr = blocking_handler
#pragma weak spi3_isr = blocking_handler
#pragma weak uart4_isr = blocking_handler
#pragma weak uart5_isr = blocking_handler
#pragma weak tim6_dac_isr = blocking_handler
#pragma weak tim7_isr = blocking_handler
#pragma weak dma2_stream0_isr = blocking_handler
#pragma weak dma2_stream1_isr = blocking_handler
#pragma weak dma2_stream2_isr = blocking_handler
#pragma weak dma2_stream3_isr = blocking_handler
#pragma weak dma2_stream4_isr = blocking_handler
#pragma weak eth_isr = blocking_handler
#pragma weak eth_wkup_isr = blocking_handler
#pragma weak can2_tx_isr = blocking_handler
#pragma weak can2_rx0_isr = blocking_handler
#pragma weak can2_rx1_isr = blocking_handler
#pragma weak can2_sce_isr = blocking_handler
#pragma weak otg_fs_isr = blocking_handler
#pragma weak dma2_stream5_isr = blocking_handler
#pragma weak dma2_stream6_isr = blocking_handler
#pragma weak dma2_stream7_isr = blocking_handler
#pragma weak usart6_isr = blocking_handler
#pragma weak i2c3_ev_isr = blocking_handler
#pragma weak i2c3_er_isr = blocking_handler
#pragma weak otg_hs_ep1_out_isr = blocking_handler
#pragma weak otg_hs_ep1_in_isr = blocking_handler
#pragma weak otg_hs_wkup_isr = blocking_handler
#pragma weak otg_hs_isr = blocking_handler
#pragma weak dcmi_isr = blocking_handler
#pragma weak cryp_isr = blocking_handler
#pragma weak hash_rng_isr = blocking_handler
#pragma weak fpu_isr = blocking_handler
#pragma weak uart7_isr = blocking_handler
#pragma weak uart8_isr = blocking_handler
#pragma weak spi4_isr = blocking_handler
#pragma weak spi5_isr = blocking_handler
#pragma weak spi6_isr = blocking_handler
#pragma weak sai1_isr = blocking_handler
#pragma weak lcd_tft_isr = blocking_handler
#pragma weak lcd_tft_err_isr = blocking_handler
#pragma weak dma2d_isr = blocking_handler

/**@}*/

/* Initialization template for the interrupt vector table. This definition is
* used by the startup code generator (vector.c) to set the initial values for
* the interrupt handling routines to the chip family specific _isr weak
* symbols. */

#define IRQ_HANDLERS \
[NVIC_NVIC_WWDG_IRQ] = nvic_wwdg_isr, \
[NVIC_PVD_IRQ] = pvd_isr, \
[NVIC_TAMP_STAMP_IRQ] = tamp_stamp_isr, \
[NVIC_RTC_WKUP_IRQ] = rtc_wkup_isr, \
[NVIC_FLASH_IRQ] = flash_isr, \
[NVIC_RCC_IRQ] = rcc_isr, \
[NVIC_EXTI0_IRQ] = exti0_isr, \
[NVIC_EXTI1_IRQ] = exti1_isr, \
[NVIC_EXTI2_IRQ] = exti2_isr, \
[NVIC_EXTI3_IRQ] = exti3_isr, \
[NVIC_EXTI4_IRQ] = exti4_isr, \
[NVIC_DMA1_STREAM0_IRQ] = dma1_stream0_isr, \
[NVIC_DMA1_STREAM1_IRQ] = dma1_stream1_isr, \
[NVIC_DMA1_STREAM2_IRQ] = dma1_stream2_isr, \
[NVIC_DMA1_STREAM3_IRQ] = dma1_stream3_isr, \
[NVIC_DMA1_STREAM4_IRQ] = dma1_stream4_isr, \
[NVIC_DMA1_STREAM5_IRQ] = dma1_stream5_isr, \
[NVIC_DMA1_STREAM6_IRQ] = dma1_stream6_isr, \
[NVIC_ADC_IRQ] = adc_isr, \
[NVIC_CAN1_TX_IRQ] = can1_tx_isr, \
[NVIC_CAN1_RX0_IRQ] = can1_rx0_isr, \
[NVIC_CAN1_RX1_IRQ] = can1_rx1_isr, \
[NVIC_CAN1_SCE_IRQ] = can1_sce_isr, \
[NVIC_EXTI9_5_IRQ] = exti9_5_isr, \
[NVIC_TIM1_BRK_TIM9_IRQ] = tim1_brk_tim9_isr, \
[NVIC_TIM1_UP_TIM10_IRQ] = tim1_up_tim10_isr, \
[NVIC_TIM1_TRG_COM_TIM11_IRQ] = tim1_trg_com_tim11_isr, \
[NVIC_TIM1_CC_IRQ] = tim1_cc_isr, \
[NVIC_TIM2_IRQ] = tim2_isr, \
[NVIC_TIM3_IRQ] = tim3_isr, \
[NVIC_TIM4_IRQ] = tim4_isr, \
[NVIC_I2C1_EV_IRQ] = i2c1_ev_isr, \
[NVIC_I2C1_ER_IRQ] = i2c1_er_isr, \
[NVIC_I2C2_EV_IRQ] = i2c2_ev_isr, \
[NVIC_I2C2_ER_IRQ] = i2c2_er_isr, \
[NVIC_SPI1_IRQ] = spi1_isr, \
[NVIC_SPI2_IRQ] = spi2_isr, \
[NVIC_USART1_IRQ] = usart1_isr, \
[NVIC_USART2_IRQ] = usart2_isr, \
[NVIC_USART3_IRQ] = usart3_isr, \
[NVIC_EXTI15_10_IRQ] = exti15_10_isr, \
[NVIC_RTC_ALARM_IRQ] = rtc_alarm_isr, \
[NVIC_USB_FS_WKUP_IRQ] = usb_fs_wkup_isr, \
[NVIC_TIM8_BRK_TIM12_IRQ] = tim8_brk_tim12_isr, \
[NVIC_TIM8_UP_TIM13_IRQ] = tim8_up_tim13_isr, \
[NVIC_TIM8_TRG_COM_TIM14_IRQ] = tim8_trg_com_tim14_isr, \
[NVIC_TIM8_CC_IRQ] = tim8_cc_isr, \
[NVIC_DMA1_STREAM7_IRQ] = dma1_stream7_isr, \
[NVIC_FSMC_IRQ] = fsmc_isr, \
[NVIC_SDIO_IRQ] = sdio_isr, \
[NVIC_TIM5_IRQ] = tim5_isr, \
[NVIC_SPI3_IRQ] = spi3_isr, \
[NVIC_UART4_IRQ] = uart4_isr, \
[NVIC_UART5_IRQ] = uart5_isr, \
[NVIC_TIM6_DAC_IRQ] = tim6_dac_isr, \
[NVIC_TIM7_IRQ] = tim7_isr, \
[NVIC_DMA2_STREAM0_IRQ] = dma2_stream0_isr, \
[NVIC_DMA2_STREAM1_IRQ] = dma2_stream1_isr, \
[NVIC_DMA2_STREAM2_IRQ] = dma2_stream2_isr, \
[NVIC_DMA2_STREAM3_IRQ] = dma2_stream3_isr, \
[NVIC_DMA2_STREAM4_IRQ] = dma2_stream4_isr, \
[NVIC_ETH_IRQ] = eth_isr, \
[NVIC_ETH_WKUP_IRQ] = eth_wkup_isr, \
[NVIC_CAN2_TX_IRQ] = can2_tx_isr, \
[NVIC_CAN2_RX0_IRQ] = can2_rx0_isr, \
[NVIC_CAN2_RX1_IRQ] = can2_rx1_isr, \
[NVIC_CAN2_SCE_IRQ] = can2_sce_isr, \
[NVIC_OTG_FS_IRQ] = otg_fs_isr, \
[NVIC_DMA2_STREAM5_IRQ] = dma2_stream5_isr, \
[NVIC_DMA2_STREAM6_IRQ] = dma2_stream6_isr, \
[NVIC_DMA2_STREAM7_IRQ] = dma2_stream7_isr, \
[NVIC_USART6_IRQ] = usart6_isr, \
[NVIC_I2C3_EV_IRQ] = i2c3_ev_isr, \
[NVIC_I2C3_ER_IRQ] = i2c3_er_isr, \
[NVIC_OTG_HS_EP1_OUT_IRQ] = otg_hs_ep1_out_isr, \
[NVIC_OTG_HS_EP1_IN_IRQ] = otg_hs_ep1_in_isr, \
[NVIC_OTG_HS_WKUP_IRQ] = otg_hs_wkup_isr, \
[NVIC_OTG_HS_IRQ] = otg_hs_isr, \
[NVIC_DCMI_IRQ] = dcmi_isr, \
[NVIC_CRYP_IRQ] = cryp_isr, \
[NVIC_HASH_RNG_IRQ] = hash_rng_isr, \
[NVIC_FPU_IRQ] = fpu_isr, \
[NVIC_UART7_IRQ] = uart7_isr, \
[NVIC_UART8_IRQ] = uart8_isr, \
[NVIC_SPI4_IRQ] = spi4_isr, \
[NVIC_SPI5_IRQ] = spi5_isr, \
[NVIC_SPI6_IRQ] = spi6_isr, \
[NVIC_SAI1_IRQ] = sai1_isr, \
[NVIC_LCD_TFT_IRQ] = lcd_tft_isr, \
[NVIC_LCD_TFT_ERR_IRQ] = lcd_tft_err_isr, \
[NVIC_DMA2D_IRQ] = dma2d_isr


питон можно портабл взять
esaulenka
Цитата(drozel @ Oct 12 2015, 14:10) *
Где файл, прописывающий в память таблицу векторов прерываний? В stdlib был стартап файл на асме, здесь уже перерыл все, в упор не вижу.


Я пользуюсь гибридом - USB'шный стек на libopencm3, а всё остальное - стандарные ST'шные описания регистров (на мой взгляд, они удобнее. И компилятор их лучше понимает) и стандартный же стартап.
Почему авторы библиотеки пошли своим путём и наплодили ещё и своих имён для регистров - непонятно...
drozel
Цитата(esaulenka @ Oct 12 2015, 18:43) *
Я пользуюсь гибридом - USB'шный стек на libopencm3, а всё остальное - стандарные ST'шные описания регистров (на мой взгляд, они удобнее.

А функции работы с периферией? Или все в регистры пишете?
Эдди
Быстрее по даташиту с регистрами разобраться, нежели перелопачивать код opencm3 в поисках нужного функционала!
Сам я и так, и так делаю: где некритично или нежирно, использую функции opencm3, а где критично и/или жирно — регистры.
drozel
Цитата(_Pasha @ Oct 12 2015, 18:14) *
держите для F4

Спасибо. Но это ведь h, а где тот самый vector.c, который должен помещать таблицу в память?
Код
#elif defined(STM32F4)
#    include "../stm32/f4/vector_nvic.c"

По этому пути его нет и непохоже, что он генерится этим же скриптом.
Цитата(Эдди @ Oct 13 2015, 00:14) *
Быстрее по даташиту с регистрами разобраться, нежели перелопачивать код opencm3 в поисках нужного функционала!

Не согласен я с этим. Я смотрю, людям волю дай, они скажут "быстрее свой МК сделать, чем разбираться с даташитом на этот".
Сложность железа растет. Раньше программы для ПК на асме писали, теперь функциями ОС пользуются.
Если есть нормальная библиотека, ей надо пользоваться. А изобретение велосипедов и мнение "все дураки, сам сделаю лучше" - чисто славянская черта. Имхо, конечно.
Но это не значит. что я не знаю регистры и делаю все вслепую, а когда функция не работает, пугаюсь и плАчу. И вообще, это оффтоп.
_Pasha
Цитата(drozel @ Oct 13 2015, 06:33) *
Спасибо. Но это ведь h, а где тот самый vector.c, который должен помещать таблицу в память?

я не пойму две вещи
1. чем Вы пользуетесь, что так упорно не можете найти cm3/vector.c
есть understand, eclipse тупо grep, в конце концов...
Код
grep -r IRQ_HANDLERS *

2. зачем этот закат солнца вручную, если можно вызвать make -n для того мейкфайла и посмотреть что ж там такое вызывается. и поттом смело со списком собирать то же самое, например в кейле
drozel
Цитата(_Pasha @ Oct 13 2015, 10:58) *
я не пойму две вещи
1. чем Вы пользуетесь, что так упорно не можете найти cm3/vector.c

Ну grep мне недоступен (винда), но искил я и эклипсом, и тотал командером.
Качал либу отсюда. Если уверены, что я туплю, пожалуйста, ткните носом. vector_chipset.c не считается, там только включение сопроцессора, вызов этой функции тоже должен помещаться стартап-файлом в начало памяти.
Цитата(_Pasha @ Oct 13 2015, 10:58) *
2. зачем этот закат солнца вручную, если можно вызвать make -n для того мейкфайла и посмотреть что ж там такое вызывается. и поттом смело со списком собирать то же самое, например в кейле

Как сказать.. GCC я никогда не пользовался, пользуюсь иаром. Думал, либа нормально поднимется. Если для того, чтобы использовать либу, надо поставить GCC и посмотреть, что делает мейк, то это уже какой-то cranky.gif
С другой стороны, повод научиться пользоваться GCC, можно даже либу собрать в статическую...
Эдди
Цитата(drozel @ Oct 13 2015, 10:58) *
Если уверены, что я туплю, пожалуйста, ткните носом.

Код
ls lib/stm32/f4/vector.c
lib/stm32/f4/vector.c

Пример makefile для F1 можно у меня в репах на гитхабе/сосфорже/битбакете/гитлабе посмотреть (stm32samples).
drozel
Цитата(Эдди @ Oct 13 2015, 14:26) *
Код
ls lib/stm32/f4/vector.c
lib/stm32/f4/vector.c

Это у Вас в папке или в репе на гитхабе?
Golikov A.
Цитата
Как сказать.. GCC я никогда не пользовался, пользуюсь иаром. Думал, либа нормально поднимется. Если для того, чтобы использовать либу, надо поставить GCC и посмотреть, что делает мейк, то это уже какой-то

это вы не соглашались что через регистры было бы быстрееsm.gif?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.