Я не пониаю, о чём речь. Если о глянуть осциллографом предел ногодрыга, «такой простой цикл» в терминологии моего первого сообщения в этой теме (и больше ни о чём я там не говорил), то это одно. Несколько On/Off подряд и большинство компиляоров сделают всё нормально. Если
«есть места (можно найти места), которые иначе, чем на асме, не выписать как надо», то это совсем другое.
Так пойдёт?
__attribute__((__noinline__)) void pb1_toggle(unsigned n)
{
do {
for( int i = 0; i < 5; ++i ) {
PB1.On();
PB1.Off();
}
} while(--n);
}
480 .global _Z10pb1_togglej
481 .thumb
482 .thumb_func
484 _Z10pb1_togglej:
485 .LFB144:
105:./src/main.cpp **** {
486 .loc 1 105 0
487 .cfi_startproc
488 @ args = 0, pretend = 0, frame = 0
489 @ frame_needed = 0, uses_anonymous_args = 0
490 @ link register save eliminated.
491 .LVL13:
492 .LBB378:
493 .LBB379:
494 .LBB380:
495 .LBB383:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
496 .loc 2 121 0
497 0000 4FF44063 mov r3, #3072
498 0004 C4F20103 movt r3, 16385
499 0008 0222 movs r2, #2
500 .LVL14:
501 .L23:
502 .LBE383:
503 .LBE380:
504 .LBE379:
106:./src/main.cpp **** do {
505 .loc 1 106 0
506 000a 10F1FF30 adds r0, r0, #-1
507 .LVL15:
508 .LBB402:
509 .LBB387:
510 .LBB384:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
511 .loc 2 121 0
512 000e 1A61 str r2, [r3, #16]
513 .LBE384:
514 .LBE387:
515 .LBB388:
516 .LBB391:
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
517 .loc 2 129 0
518 0010 5A61 str r2, [r3, #20]
519 .LVL16:
520 .LBE391:
521 .LBE388:
522 .LBB394:
523 .LBB382:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
524 .loc 2 121 0
525 0012 1A61 str r2, [r3, #16]
526 .LBE382:
527 .LBE394:
528 .LBB395:
529 .LBB390:
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
530 .loc 2 129 0
531 0014 5A61 str r2, [r3, #20]
532 .LVL17:
533 .LBE390:
534 .LBE395:
535 .LBB396:
536 .LBB385:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
537 .loc 2 121 0
538 0016 1A61 str r2, [r3, #16]
539 .LBE385:
540 .LBE396:
541 .LBB397:
542 .LBB392:
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
543 .loc 2 129 0
544 0018 5A61 str r2, [r3, #20]
545 .LVL18:
546 .LBE392:
547 .LBE397:
548 .LBB398:
549 .LBB381:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
550 .loc 2 121 0
551 001a 1A61 str r2, [r3, #16]
552 .LBE381:
553 .LBE398:
554 .LBB399:
555 .LBB389:
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
556 .loc 2 129 0
557 001c 5A61 str r2, [r3, #20]
558 .LVL19:
559 .LBE389:
560 .LBE399:
561 .LBB400:
562 .LBB386:
121:./src/pin.h **** activestate == 'L' ? GPIOx->BRR = mask : GPIOx->BSRR = mask;
563 .loc 2 121 0
564 001e 1A61 str r2, [r3, #16]
565 .LBE386:
566 .LBE400:
567 .LBB401:
568 .LBB393:
129:./src/pin.h **** activestate == 'L' ? GPIOx->BSRR = mask : GPIOx->BRR = mask;
569 .loc 2 129 0
570 0020 5A61 str r2, [r3, #20]
571 .LVL20:
572 .LBE393:
573 .LBE401:
574 .LBE402:
106:./src/main.cpp **** do {
575 .loc 1 106 0
576 0022 F2D1 bne .L23
577 .LBE378:
112:./src/main.cpp **** }
578 .loc 1 112 0
579 0024 7047 bx lr
580 .cfi_endproc