Сб дек 19, 2020 08:58:28
typedef struct{
uint32_t *bsrr;
uint32_t mask;
} port_pin;
void port_write64 (const port_pin *p, int a, uint64_t data)
{
do
{
uint32_t const count = a>32 ? 32 : a ;
for(uint8_t i=0; i<count; i++)
{
if ((uint32_t)data & (1<<i))
*p->bsrr = p->_or;
else
*(p->bsrr+4) = p->_or;
// Для контроллеров у которых нет BSRR
//*(volatile uint16_t *)((uint16_t *)p->bsrr+1) = p->_or;
p++;
}
data >>= 32;
a-=32;
}
while(a>0);
}
*(p->bsrr+4)
Сб дек 19, 2020 09:10:27
*(p->bsrr+4)
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
Сб дек 19, 2020 09:30:03
Ну не знаюVladislavS писал(а):Как тут можно не понять?
STRPL R7,[R6, #+16]
GPIOA_BSRR 0x40010810
GPIOA_BRR 0x40010814
Сб дек 19, 2020 09:36:20
Сб дек 19, 2020 09:55:49
Сб дек 19, 2020 10:01:23
Сб дек 19, 2020 14:18:08
креститься надо.VladislavS писал(а):мне кажется
как и все остальное начиная со второй странице, по теме ровно 0.VladislavS писал(а):это оффтоп в данной теме
Сб дек 19, 2020 14:58:54
Пн дек 28, 2020 09:48:21
Это здорово, но мне трудно понять насколько (не)эффективным будет та или иная конструкция на плюсах. И судя по тому как там Reflector с Oxford дебатировал, это не уникально для одного меня. А тут убедить компилер на эффективный код даже для группы пинов - как 2 байта переслать. Почти.Я же показал что будет. Указываем список пинов и погнали. Причем, пины могут быть из разных портов в любой последовательности. Всё сгруппируется как надо. Это могут быть не только set или reset, а write, read, toggle.
Когда кто-то так делает, оптимальность их точно не волновала.Я даже не буду просить повторить нижеследующий пример. Берём две группы пинов на разных портах. Читаем одну группу как байт, инвертируем и записываем во вторую группу.
Да нисколько. Постараюсь чтобы оно оптимально раскидывалось и оформлю парой констант. Зачем создавать себе проблемы на ровном месте?Сколько вы это будете руками ковырять... Компилятор делает за долю секунды.
Я ими не пользуюсь и не планирую.Только без BRR. В F4 или H7, например. Мэинстрим, как ни крути, приходится учитывать.
Пн дек 28, 2020 12:11:23
Пн дек 28, 2020 14:20:01
У меня никакого проигрыша в скорости на порядок совершенно точно не будет. Откуда и с фига ли?Если вас устраивает проигрыш в скорости на порядок, то и ну его на.
Двухъядерник возьмите, получите желаемое! Только это половину смысла уроет: DMA без проблем запихнет килобайт в BSRR - без единого байта инструкций по шинам вообще. А если это процессорное ядро, даже второе - уже не то. Вот как раз потому что кроме потока данных по шинам еще поток команд будет. Без него видите ли процессор вообще работать не может.Когда научите DMA код выполнять - приходите.
Пн дек 28, 2020 15:17:11
Вт дек 29, 2020 06:36:51
Этот килобайт конечно же из воздуха материализуется? А в 3 разных BSRR распихает?
Вт дек 29, 2020 07:48:12
Вт дек 29, 2020 08:55:24
Чт дек 31, 2020 23:21:14
A 0x40010810
B 0x40010C10
C 0x40011010
Пт янв 01, 2021 01:53:02
Пт янв 01, 2021 02:22:58
Вс янв 03, 2021 09:31:11
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
Вс янв 03, 2021 11:03:48