Вс янв 03, 2021 13:16:50
Вс янв 03, 2021 13:30:28
Вс янв 03, 2021 14:00:56
Вс янв 03, 2021 14:05:01
Вс янв 03, 2021 14:32:59
Вс янв 03, 2021 15:13:42
Вс янв 03, 2021 15:37:13
Прежде чем писать вот этоReflector писал(а):а тебе зачем тестить список из 35-х пинов
сначала надо было подумать.VladislavS писал(а):
- Код:
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
PinList<... напишите что нибудь в разноброс 35 пинов> pins1;
int main(void)
{
pins1 = 0b00100101101001001000001010010100100;
while (1)
{
}
}
PinList<... напишите что нибудь в разноброс 35 пинов> pins1;
int main(void)
{ static auto a = 0b00100101101001001000001010010100100;
while (1)
{
pins1 = a++;
}
}
PinList<... напишите что нибудь в разноброс 35 пинов> pins1;
volatile auto a = 0b00100101101001001000001010010100100;
int main(void)
{
while (1)
{
pins1 = a++;
}
}
PinList<... напишите что нибудь в разноброс 35 пинов> pins1;
volatile auto a = 0b00100101101001001000001010010100100;
int main(void)
{
while (1)
{
pins1 = a;
}
}
void ..._IRQHandler(void)
{
a++;
}
Вс янв 03, 2021 15:54:06
Dimon456 писал(а):И везде будет разный подход вашего С++ компилятора и разный на выходе ассемблер.
int main(void)
{
#pragma asm
....
#pragma endasm
}
Вс янв 03, 2021 16:26:31
Вс янв 03, 2021 17:33:04
Не согласен:Reflector писал(а):В первом случае может быть выполнена дополнительная оптимизация, в трех оставшихся код должен быть одинаковым.
Вс янв 03, 2021 18:00:20
int val = 10;
while(true) { GPIOB->ODR = val; }
// 0x24001702 37 4A ldr r2, [pc, #220]
// 0x24001704 0D 23 movs r3, #10
// 0x24001706 53 61 str r3, [r2, #20]
// 0x24001708 FD E7 b.n 0x24001706
volatile int val = 10;
while(true) { GPIOB->ODR = val; }
// 0x24001706 37 4A ldr r2, [pc, #220]
// 0x24001708 02 94 str r4, [sp, #8]
// 0x2400170a 02 9B ldr r3, [sp, #8]
// 0x2400170c 53 61 str r3, [r2, #20]
// 0x2400170e FC E7 b.n 0x2400170a
Вс янв 03, 2021 20:21:05
using TWidth = std::conditional_t<(Size>32), uint64_t, uint32_t>;
Вс янв 03, 2021 20:43:24
где ты тут увидел 64 битные вычисления?VladislavS писал(а): сделал оптимизацию и убрал 64-битные вычисления.
#define k_bit uint32_t//uint64_t-64пина uint32_t-32пина uint16_t-16пин uint8_t-8пин
void port_write (volatile const port_pin *p, uint8_t a, k_bit data)
{ k_bit s=1;
for(uint8_t i=0; i<a; i++, s<<=1){
if (data & s)
((GPIO_TypeDef *) p->port)->BSRR = p->or;
else
((GPIO_TypeDef *) p->port)->BSRR = p->and;
p++;
}
}
асм покажешь на 64 бита, или боишься что СИ положит на лопатки С++?VladislavS писал(а):Можно пример какой-нибудь?
Вс янв 03, 2021 21:06:26
Вс янв 03, 2021 21:09:35
Вс янв 03, 2021 21:31:59
//volatile uint64_t x;
x:
DS8 8
//int main()
//{
main:
// using TPL = PinList<GpioB<0xFFFF>,GpioC<0xFFFF>,GpioD<0xFFFF>>;
LDR.N R2,??main_0 ;; 0x48000414
LDR.N R3,??main_0+0x4
// for(;;) TPL::write(x++);
??main_1:
LDRD R0,R1,[R3, #+0]
ADDS R4,R0,#+1
SBC R5,R1,#-1
STRD R4,R5,[R3, #+0]
UXTH R6,R1
STR R6,[R2, #+0]
LSRS R7,R0,#+16
STR R7,[R2, #+1024]
UXTH R0,R0
STR R0,[R2, #+2048]
B.N ??main_1
DATA
??main_0:
DATA32
DC32 0x48000414
DC32 x
Вс янв 03, 2021 22:05:42
Вс янв 03, 2021 22:34:46
volatile uint64_t x;
int main()
{
for(;;)
{
uint64_t tmp = x++;
GPIOA->ODR = tmp>>48;
GPIOB->ODR = tmp>>32;
GPIOC->ODR = (uint16_t)(tmp>>16);
GPIOD->ODR = tmp;
}
}
//volatile uint64_t x;
x:
DS8 8
//int main()
//{
main:
LDR.N R6,??main_0 ;; 0x48000014
LDR.N R7,??main_0+0x4
//for(;;)
//{
// uint64_t tmp=x++;
??main_1:
LDRD R2,R3,[R5, #+0]
ADDS R6,R2,#+1
SBC R7,R3,#-1
STRD R6,R7,[R5, #+0]
// GPIOA->ODR = tmp>>48;
LSRS R0,R3,#+16
STR R0,[R4, #+0]
// GPIOB->ODR = tmp>>32;
STR R3,[R4, #+1024]
// GPIOC->ODR = (uint16_t)(tmp>>16);
LSRS R0,R2,#+16
STR R0,[R4, #+2048]
// GPIOD->ODR = tmp;
STR R2,[R4, #+3072]
B.N ??main_1
Nop
DATA
??main_0:
DATA32
DC32 0x48000014
DC32 x
Вс янв 03, 2021 22:50:12
Да не ужели.VladislavS писал(а):Дарю. А то прямо кровь из глаз.
volatile uint64_t x;
int main(void)
{
for(;;) {
uint64_t tmp=x++;
GPIOA->ODR = tmp>>48;
GPIOB->ODR = tmp>>32;
GPIOC->ODR = tmp>>16;
GPIOD->ODR = tmp;
}
}
Program Size:
text data bss dec hex filename
628 0 1040 1668 684 port_103.elf
union BytByte {
struct {
uint16_t data[4];
} bit;
volatile uint64_t byte;
}__attribute__((aligned(4)));
union BytByte myBByte;
int main(void)
{
for(;;) {
myBByte.byte++;
GPIOA->ODR = myBByte.bit.data[0];
GPIOB->ODR = myBByte.bit.data[1];
GPIOC->ODR = myBByte.bit.data[2];
GPIOD->ODR = myBByte.bit.data[3];
}
}
Program Size:
text data bss dec hex filename
612 0 1032 1644 66c port_103.elf
Вс янв 03, 2021 22:57:20