господи... У меня всё компилируется. Ну вот Ваш более простой бесконечный цикл с пятью On()/Off() __attribute__((__noinline__)) void pb1_toggle()
{
DRIVER(B1,OUT);
for(;;) {
PB1.On();
PB1.Off();
PB1.On();
PB1.Off();
PB1.On();
PB1.Off();
PB1.On();
PB1.Off();
PB1.On();
PB1.Off();
}
}
Я всё же поубирал из литинга лишние для данного обсуждения строки, а то такие простыни выходят...
478 0022 00BF .section .text._Z10pb1_togglev,"ax",%progbits
479 .align 2
480 .global _Z10pb1_togglev
481 .thumb
482 .thumb_func
484 _Z10pb1_togglev:
485 .LFB144:
105:./src/main.cpp **** {
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
494 0000 4FF44063 mov r3, #3072
495 0004 C4F20103 movt r3, 16385
496 0008 0222 movs r2, #2
497 .L23:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
499 000a 1A61 str r2, [r3, #16]
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
505 000c 5A61 str r2, [r3, #20]
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
511 000e 1A61 str r2, [r3, #16]
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
517 0010 5A61 str r2, [r3, #20]
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
523 0012 1A61 str r2, [r3, #16]
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
529 0014 5A61 str r2, [r3, #20]
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
535 0016 1A61 str r2, [r3, #16]
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
541 0018 5A61 str r2, [r3, #20]
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
547 001a 1A61 str r2, [r3, #16]
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
553 001c 5A61 str r2, [r3, #20]
554 001e F4E7 b .L23
557 .cfi_endproc
И еще - у Вас не вывод в порт значения а нечто другое ( типа перевода пина на ввод/вывод ).
activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;Это именно вывод в порт, а не управление вход-выход. Обращение к регистрам сброса и установки выходного регистра.
В порт поочерёдно выводятся 1 0 1 0 1 0 1 0 1 0 и переход на начало.
Если бы вывод был описан как активный низкий
Pin<'B', 1, 'L'>то по On() выводился бы 0 и было бы 0 1 0 1 0 1 0 1 0 1 и переход на начало.
А ввод-вывод управляется через
PB1.Mode(INPUT);
PB1.Mode(OUTPUT);и подобное (ANALOGINPUT, OUTPUT_OD, ...)
Да, можно найти компилятор и подобрать под него код на C++, который скомпилится в нужный машинный код.
Ну вот другой контроллер и С, а не С++, макросы, а не шаблоны. Да, в данном случае это опять gcc, только avr-gcc 4.3.4, а не arm-gcc 4.6.0, как выше. Но уверяю - IAR, причём что новый, что многолетней давности, avr-gcc начиная с 3.0.x — дадут то же самое без подбора положения клвиатуры относительно монитора.
#include <avr/io.h>
#include "pin_macros.h"
#define B1 B,1,H
void foo()
{
DRIVER(B1,OUT);
for(;;) {
ON(B1);
OFF(B1);
ON(B1);
OFF(B1);
ON(B1);
OFF(B1);
ON(B1);
OFF(B1);
ON(B1);
OFF(B1);
}
}
.text
.global foo
.type foo, @function
foo:
/* prologue: function */
/* frame size = 0 */
sbi 55-32,1
.L2:
sbi 56-32,1
cbi 56-32,1
sbi 56-32,1
cbi 56-32,1
sbi 56-32,1
cbi 56-32,1
sbi 56-32,1
cbi 56-32,1
sbi 56-32,1
cbi 56-32,1
rjmp .L2