Ти си малко biased с тези микроконтролери. В повечето "нормални" операционни системи няма вариант някой ISR да маже из адресното пространство на процеса или поне не би било особено приемливо такова нещо да се случи. Мултитрединга е валиден кейс, обаче регистрите са лимитиран ресурс - компилаторите така или иначе не могат да пазят много неща там, та с приоритет са променливи, които се четат и пишат често. Условията на разни кратки цикли са доста подходящ таргет за целта - защото се достъпват често. При while цикъла няма модификация на някакъв брояч, но четенето на променливата-условие си остава. x86 има прилично "дълбок" pipeline, има и прилично функциониращ branch prediction, та би било разхищение на енергия да не се утилизират. Ако условието на while цикъла е в регистър, няма толкова големи проблеми с утилизацията на pipeline-а, в идеалният вариант без misprediction, лошият случай ще настъпи само веднъж - когато излизаш от while цикъла. Четенето на променливата от паметта обаче е с порядъци по-бавно от четенето от регистър, дори да е в L1 кеша и това тотално съсипва цялата схема с branch prediction-а и утилизацията на pipeline-а, ще имаш прилично много процесорно време в което железарията стои idle докато чака нещо да и се достави.
Сега остава въпроса нормално ли е условието на цикъла да се променя от друг тред. Да - нормално е, но аз съм убеден че това се случва в много малък процент от случаите, което в крайна сметка оправдава такава оптимизация. В този много малък процент все пак можеш да ползваш volatile променлива.
EOF
|