Цитата(jcxz @ Apr 21 2017, 13:47)

Не понял Вашу мысль....
В чём проблема-то? Что именно нельзя сделать? Если не нужно знать предыдущее состояние какого-то пина на порту, но состояние всех остальных можно установить в нужное одной операцией записи. Каким бы сложным ни был генератор.
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 раза и ественно компилятор это продублировал

Разница есть, но она всего 4 байта
Сообщение отредактировал Reflector - Apr 21 2017, 11:23