реклама на сайте
подробности

 
 
26 страниц V  « < 24 25 26  
Reply to this topicStart new topic
> Библиотеки для STM32
jcxz
сообщение Apr 21 2017, 11:10
Сообщение #376


Гуру
******

Группа: Свой
Сообщений: 3 519
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ Apr 21 2017, 13:07) *
Порой выгоднее воткнуть в довесок к основному толстому процу какой-нить М0+.

Т.е. - взять LPC43xx? Это да... biggrin.gif
И решение той задачи мы потом переделали взяв более жирный многоядерный проц. Ибо на LPC1758 хоть и успевало, но работало на пределе и больше почти ничего проц не успевал делать.
Но на тот момент задача стояла так: железо было уже сделано без меня (на LPC1758 + ПЛИС + CY7C68013A), был инвестор с кешем, и надо было ему показать рабочее железо, пускай выполняющее только часть функций. Так что - или сделать на том что есть, или потерять проект вообще. А через годик мы поменяли элементную базу на другой проц и всё cool.gif
Go to the top of the page
 
+Quote Post
Reflector
сообщение Apr 21 2017, 11:17
Сообщение #377


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(jcxz @ Apr 21 2017, 13:47) *
Не понял Вашу мысль.... wacko.gif
В чём проблема-то? Что именно нельзя сделать? Если не нужно знать предыдущее состояние какого-то пина на порту, но состояние всех остальных можно установить в нужное одной операцией записи. Каким бы сложным ни был генератор.
void SetPins(uint value)
{
BSRR = (value & 255) | (~value << 16);
}

Да, похоже ты прав, при таком подходе можно сделать и инверсию... но это не бесплатно. Для начала нужно код доработать:
Код
BSRR = value | ((~value & 255) << 16);

Смотрим что нагенерит компилятор. Один вызов:
Код
0x2000084c  ldr r3, [sp, #4]
0x2000084e  ldr r2, [pc, #96]
0x20000850  orr.w r3, r3, #16711680
0x20000854  str r3, [r2, #24]
0x20000856  ldr r3, [sp, #4]
0x20000858  orr.w r3, r3, #16711680
0x2000085c  str r3, [r2, #24]

Два вызова подряд:
Код
0x2000084c  ldr r1, [sp, #4]
0x2000084e  ldr r2, [pc, #108]    
0x20000850  mvns r3, r1
0x20000852  lsls r3, r3, #16
0x20000854  and.w r3, r3, #16711680
0x20000858  orrs r3, r1
0x2000085a  str r3, [r2, #24]
0x2000085c  ldr r1, [sp, #4]
0x2000085e  mvns r3, r1
0x20000860  lsls r3, r3, #16
0x20000862  and.w r3, r3, #16711680    
0x20000866  orrs r3, r1
0x20000868  str r3, [r2, #24]

Я же предлагал такой код:
Код
static void write(uint32_t data) { base()->BSRR = (pinsMask << 16) | data; }

Тут очищаются все биты сразу, по константной маске, ее не нужно инвертировать, обрезать и сдвигать, а если было бы нужно, то она так константой бы и осталась.
Один вызов:
Код
0x2000084c  ldr r3, [sp, #4]
0x2000084e  ldr r2, [pc, #88]
0x20000850  orr.w r3, r3, #16711680
0x20000854  str r3, [r2, #24]

Два вызова подряд:
Код
0x2000084c  ldr r2, [sp, #4]
0x2000084e  ldr r1, [pc, #92]
0x20000850  mvns r3, r2
0x20000852  lsls r3, r3, #16
0x20000854  and.w r3, r3, #16711680
0x20000858  orrs r3, r2
0x2000085a  str r3, [r1, #24]


Update: Претензия снимается, специально объявил записываемую переменную как volatile, чтобы компилятор ее не рассматривал как константу, то в твоем коде она читается 2 раза и ественно компилятор это продублировал sm.gif Разница есть, но она всего 4 байта sm.gif

Сообщение отредактировал Reflector - Apr 21 2017, 11:23
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 21 2017, 11:21
Сообщение #378


Знающий
****

Группа: Свой
Сообщений: 629
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Apr 21 2017, 14:10) *
Т.е. - взять LPC43xx?

Типа того, но по отдельности порой выходит даже дешевле, да и выбор ничем не ограничем.

Но LPC4300 уже устарел, уже есть более злобные: http://www.microchip.com/wwwproducts/en/ATSAM4C16
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 21 2017, 11:24
Сообщение #379


Гуру
******

Группа: Свой
Сообщений: 3 519
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Reflector @ Apr 21 2017, 13:17) *
Да, похоже ты прав, при таком подходе можно сделать и инверсию...

Инверсию за одну операцию на STM ни при каком подходе сделать нельзя.
Мой код не инвертирует, а устанавливает значение всех пинов за одну операцию записи для любого числа. Инверсии там нет.
Go to the top of the page
 
+Quote Post
Reflector
сообщение Apr 21 2017, 11:27
Сообщение #380


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(jcxz @ Apr 21 2017, 14:24) *
Инверсию за одну операцию на STM ни при каком подходе сделать нельзя.

Имеется в виду, что в таком случае инверсию в принципе возможно сделать оставив и атомарную запись, пусть и немного более медленную. В данный момент железо это не поддерживает, но все может измениться в будущем.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 21 2017, 11:29
Сообщение #381


Гуру
******

Группа: Свой
Сообщений: 3 519
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ Apr 21 2017, 13:21) *
Типа того, но по отдельности порой выходит даже дешевле, да и выбор ничем не ограничем.

Одно ПО разрабатывать/сопровождать/обновлять проще и дешевле. В этом плане многоядерный проц лучше нескольких одноядерных.
Я, когда писал прошивку для LPC1758 + параллельно для CY7C68013A, это почувствовал на себе. И документации читать больше и в отладке сложнее. А уж когда оказалось, что прошивку и того и другого надо ещё у заказчика обновить.... smile3009.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 21 2017, 11:31
Сообщение #382


Знающий
****

Группа: Свой
Сообщений: 629
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Apr 21 2017, 14:29) *
Одно ПО разрабатывать/сопровождать/обновлять проще и дешевле. В этом плане многоядерный проц лучше нескольких одноядерных.
Я, когда писал прошивку для LPC1758 + параллельно для CY7C68013A, это почувствовал на себе. И документации читать больше и в отладке сложнее. А уж когда оказалось, что прошивку и того и другого надо ещё у заказчика

Как обычно, все сводится к деньгам, поэтому нужно считать, что выгоднее - использовать один толстый мудрёный проц или два обычных. Главное, что есть выбор ))
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 21 2017, 11:39
Сообщение #383


Гуру
******

Группа: Свой
Сообщений: 3 519
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ Apr 21 2017, 13:21) *
Но LPC4300 уже устарел, уже есть более злобные: http://www.microchip.com/wwwproducts/en/ATSAM4C16

По сравнению с этим - не устарел.
LPC4370 (который у меня был) - 3 ядра на 204МГц: M4F + M0*2.
Здесь же только 2 ядра, пускай и M4 (но одно ядро - просто M4 без F как я понял), но на 120МГц.
Это ещё посмотреть кто быстрее будет wink.gif
Да и ОЗУ в LPC4370 побольше почти в 2 раза - 282кБ. Правда флеши нет laughing.gif

Итого: 120*2=240МГц против 204*3=612МГц cool.gif
А уж про АЦП LPC-ки я вообще молчу wink.gif

PS: Да, кстати - для второго ядра ещё и частота не указана. Может она в 2 раза ниже?
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 21 2017, 12:00
Сообщение #384


Знающий
****

Группа: Свой
Сообщений: 629
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Apr 21 2017, 14:39) *
По сравнению с этим - не устарел.
LPC4370 (который у меня был) - 3 ядра на 204МГц: M4F + M0*2.

Гы, я не знал про такие laughing.gif
Похоже, семейство это развивают во всю ))
Go to the top of the page
 
+Quote Post

26 страниц V  « < 24 25 26
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2017 - 13:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016