slava68: (Default)
[personal profile] slava68
Попалось сейчас на просторах интернета:

Давайте попробую ответить на ваш вопрос со своей колокольни. Да, замечу что интересоваться (теоретически) современным положением дел и крайне поверхностно я начал около года назад, а приобрел впервые "для дома и хобби" Мегу2560 только к середине мая. Но, при этом лет, ой, уже более 25 (1985-1991) занимался разного рода "спектрумами", "специалистами", "океанами-240".. и даже ваял что-то свое на К1802-К1804 и К589, имея небольшой опыт работы на "бортовых вычислителях".

И так почему Ардуино и AVR, а не STM?

Начнем с того, что PIC-овские контроллеры, я хоть и с трудом но ещё помню. Ничего принципиального в них так и не поменялось. Поэтому, посмотрев анонсы, отбросил как старый мусор. Если фирма до сих пор ваяет то ещё ... (опустим для ясности), то смысла вникать глубже, не заметил.

Из AVR, посмотрев и почитав даташиты, пришел к выводу, что оптимальным выбором будет Мега2560, несмотря на то, что есть xmega и шустрее и функциональней. Но на 3.3в.. Сейчас полно шилдов и плат, которые терпят 2.8-5.5в и типа им "все равно" .. но, видимо "исторически сложилось" в частности у меня. 5-вольтовую технику как-то проще и ближе воспринимаю.

Посмотрев STM, тоже присмотрелся к F4, на котором есть Discovery .. очень понравилось .. а потом начал тупо сравнивать.

Теперь, следите за пальцами:

AVR - это 8/16 битный.

а) Стало быть "для хранения слова" в среднем 1.5 байта. Имеем 8кбайт .. или 6к "данных". Не густо.

б) Каждая команда - 2 байта, есть и по 4 .. имеем 128К команд или несколько меньше. Уже лучше.

в) Частота работы 16Мгц, одна команда = 1 такт. На самом деле не совсем так, но похоже. Имеем 16Мипс. Совсем неплохо даже (286 были хуже!)

г) И последнее, как сами пишете, для управления требуется 1-4 команды (это уже по моему опыту) .. имеем управленческую частоту около 0.5-1Мгц.

STM32. На тот момент (я позже по этому поводу тоже пройдусь) мне было доступно описание Cortex-M3 c 20к оперативы.. и 128 флеша, на 72Мгц.

а) 32 бита. Соответственно количество байт оперативы надо делить на 3-4 .. имеем теже 5-6 к элементарных данных .. ну может 8. Не принципиально больше.

б) Команды - длиннее и тем же подсчетом получаем меньший объем памяти команд.. примерно 50-60К "всего" как ни странно.

в) Частота работы - "круть" 72 Мгц .. и даже аппаратное умножение "за такт". Но, читая описания не раз натыкался на "единая 32-х битная шина данных" .. как достоинство. То есть, таки 2 такта - шина мультиплексированная. Все равно 36Мгц - очень здорово. И вот тут вспоминаешь работу длинными целыми: зачисть старшую половинку .. чиселки очень часто нужны куда как меньше байт, ну пару.. управлять яркостью далее байта - практически бессмысленно, динамический диапазон ламп не позволяет. Впрочем как и крутить ШИМ мотору. То бишь эту скорость надо смело делить ещё пополам .. 18Мгц. Уже и не так кучеряво.

г) Ну и как сами тут уже отметили: сложность управления кодом. То, что нормально должно делаться в одну команду, на AVR занимает в пределах 10-и, часто 3-4 .. на STM потребует страничку кода, по вашим же замечаниям. Они достаточно верны.

.. как итог, "взвесив все за и против" .. выбрал Мегу2560.

Ну и напоследок: "сообщество", "поддержка", "литература", "средства разработки, отладки", "периферия" - всё это ДАЛЕКО НЕ ПУСТОЙ ЗВУК.

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

Всё вышеизложенное - есть мое ИМХО и тот процесс, которым я шел выбирая себе микроконтроллер и плату для хобби. "на поиграться".
---------------------------------------------------
A5021, вот хорошая ссылка на начало работы с STM32F04
: http://geektimes.ru/post/254722/

void main()
{
//Enable port D clocking
*(unsigned long*)(0x40023830) |= 0x8;
//little delay for GPIOD get ready
volatile unsigned long i=0;
i++; i++; i++;
i=0;
//Set PD13 as General purpose output
*(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) | (0x04000000);
while(1)
{
//Turn LED ON
*(unsigned long*)(0x40020C14) |= 0x2000;
//Delay
for( i=0; i<1000000 ;++i );
//Turn LED OFF
*(unsigned long*)(0x40020C14) &= ~0x2000;
//Delay
for( i=0; i<1000000 ;++i );
}
}

А теперь посчитайте длину констант и их количество. Да, не забудьте что операции "|=" и "&=" занимают тут по 4(ЧЕТЫРЕ) такта шины.
То же самое для Ардуины:


main()
{
// pinModeOut(pinLed); -- ставим 13 ногу на выход
*(volatile uint8_t *)(0x24) |= (uint8_t)128;
while(1)
{
// pinOutHigh(pinLed); -- включаем светодиод
*(volatile uint8_t *)(0x25) |= (uint8_t)128;
time_delay16(1000);
// pinOutLow(pinLed); -- выключаем светодиод
*(volatile uint8_t *)(0x25) &= (uint8_t)127;
time_delay16(1000);
}
}


И заметьте, что тут команды выполняются 1 такт, а не 4. Итого, имеем

в STM32: 2x32+2x16 = 10 байт на константы всего в двух командах

в AVR: 4x8 = 4 байта на константы в тех же ДВУХ командах.

Разница в ДВА С ПОЛОВИНОЙ РАЗА. Надоели. :)

P.S. И время исполнения этих команд в AVR = 3(три такта), из которых 2 команды и переход на начало цикла, а в STM32 имеем 9 тактов, и то только если переход на начло цикла тоже за 1 такт, а не дольше. И каждый следующий "светодиод" внутри цикла будет добавлять в общем случае (а не когда это "рядом") .. + 8 тактов на брата. Вместо +2 такта в Ардуино.

В целом, как и писал ТАК БЫЛО и ТАК БУДЕТ. Хотите "ширшее" обрабатывать данные (миллис в 32 бита), да больше и шустрее передавать по шине - ИЗВОЛЬТЕ ПЛАТИТЬ. Да, да .. памятью и количеством времени. И спасает только большая частота тактирования.

Поэтому и писал уже в самом начале: "каждому овощу - свою кухню и кулинарию". Но, в задачах управления периферией - это не айс. Совсем не айс. А вот то, что в STM32 как большей разрядности большие числа считаются ТАКЖЕ БЫСТРО как и в ардуино маленькие - это да. Это и есть специфика его применения. "его кухня".

Date: 2016-04-06 05:43 pm (UTC)
From: [identity profile] kr1810bm86.livejournal.com
Что за ерунда?

Забудьте про МК51. и ограничение 64к в бейсике, и про 640к ОЗУ :) STM32 - 32-х разрядный, операции с битами надо проводить параллельно, если уже приспичило.

И вы забыли упомянуть про цену :)

Но то что реклама у STM хромает, с этим согласен.

Date: 2016-04-06 07:46 pm (UTC)
From: [identity profile] slava68.livejournal.com
про цену специально посмотрел на aliexpresse - выигрыша в ценах на заметил.
И как мне понравилась мысль - 90% возможностей STM оказываются невостребованными в 90% проектов :-)

Date: 2016-04-07 05:04 am (UTC)
From: [identity profile] kr1810bm86.livejournal.com
90% возможностей STM оказываются невостребованными в 90% проектов :-)

И что тут плохого, если переплачивать не надо?.
Т.е. за те же деньги ты получишь в 9 раз больше чем тебе надо. И не надо думать сколько байт влезет в двойное слово, как вытянуть лишние 10 милисек в циклах, как сэкономить быстрые счетчики или аналоговые входы.
При чем - это не стоит доп. денег.

Date: 2016-04-07 07:51 am (UTC)
From: [identity profile] slava68.livejournal.com
Про 10 микросекунд в тему :-)))

Вчера несколько часов пытался оптимизировать код, с 231мкс до 225мкс.
И не могу понять, стало лучше или нет.

Profile

slava68: (Default)
slava68

February 2026

S M T W T F S
1234567
891011121314
15161718192021
22232425262728

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 13th, 2026 09:30 am
Powered by Dreamwidth Studios