ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
7 июля
226059 Топик полностью
ReAl (07.12.2010 02:31 - 02:44, просмотров: 100) ответил Vallav на И я не понимаю, о чем речь.
господи... У меня всё компилируется. Ну вот Ваш более простой бесконечный цикл с пятью 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