В том вопросе — а гляньте дизассемблер да и увидите, что там делается.
И цикл с volatile-переменной вероятнее всего эту переменную на стеке заводит, каждый декремент — прочесть из памяти, уменьшить, записать назад.
И GPIO_SetBits() вызывается как функция, потом проверяет свои аргументы на допустимость, потом только пишет в порт.
А если по-нормальному, то из 72-мегагерцового STM32F103 ногодрыгом в цикле импульсы длительностью около 28 наносекунд (два такта) вполне выдаются, если компилятор адрес порта в регистр занесёт до цикла.
Т.е.
Код
Pin<'B', 12> FOO; // см. pin.h в примерах scmRTOS для CortexM3/GCC
FOO.Mode(OUTPUT);
for(;;) {
FOO.On();
FOO.Off();
}
даёт импульсы 28 нс с паузой чуток подлиннее (переход всё же).