Код
while (1)
{
GPIOA->BSRR = GPIO_BSRR_BS_1;
__nop();
__nop();
__nop();
__nop();
GPIOA->BSRR = GPIO_BSRR_BR_1;
__nop();
__nop();
__nop();
//__nop();
}
{
GPIOA->BSRR = GPIO_BSRR_BS_1;
__nop();
__nop();
__nop();
__nop();
GPIOA->BSRR = GPIO_BSRR_BR_1;
__nop();
__nop();
__nop();
//__nop();
}
Компилируется так:
Код
STR r1,[r0,#0x18]
NOP
NOP
NOP
NOP
STR r2,[r0,#0x18]
NOP
NOP
NOP
B |L1.6|
NOP
NOP
NOP
NOP
STR r2,[r0,#0x18]
NOP
NOP
NOP
B |L1.6|
Смотрю в Keil (отладка на stm32f4discovery) States, все команды выполняются за 1 такт.
Смотрю осцилом, вижу, что 1 на PA1 - 30 нс (5 тактов), а 0 на PA1 - 35 нс (6 тактов), т.е. B |L1.6| выполняется вроде как за 2 такта, а Keil увеличивает States на +1.
Читал http://infocenter.arm.com/help/index.jsp?t...g/BABBCJII.html (If branch taken, pipeline reloads (two cycles are added), т.е. 3 цикла) и STM PM0081 Flash memory interface (про ART - все за 1 цикл), так толком и не понятно кому верить.
Где можно прочитать о времени выполнения инструкций STM32F4xx?
Как можно в Keil измерить это время?
Спасибо.