Uložení registrů do stacku

Ahoj, nevíte někdo zda neexistuje v céčku nějaký modifikátor, který zajistí, že při volání určité funkce dojde k uložení všech obecných registrů do stacku? Používám gcc kompilátor na MCU STM32F100. Dík

Překladač automaticky při vstupu do funkce uschová pouze regstry, které bude ve funkci používat. Pro uschování všech registrů lze funkci vytvořit jako “naked” a registry si inline assemblerem uložit/načíst ručně. V manuálu GCC potřebné informace jsou.
K čemu by to bylo dobré? (kromě multitaskingu, na což je lepší použít něco hotového, třeba FreeRTOS)

Ahoj dík zas odpověď.
K čemu by to bylo dobré, tak na to je jednoduchá odpověď. V podstatě se skutečně jedná o jakýsi pokus o multitasking. Ale je to skutečně jen pokus, protože si myslím, že to multitasking tak jak je definovaný úplně není.

Doufal jsem, že si ušetřím práci tím, že existuje nějaký modifikátor, který rovnou řekne překladači aby to udělal a já nemusel použít ten fígl s inline assemblerem.

Docela by mě zajímalo jak si ten multitasking zamýšlel. (čistě pro studijní účely)

Ahoj, to ti napsat můžu, ale předem upozorňuji, že je to hodně “pseudo-multitasking”.

Vycházím z toho, že mám flešku a ramku rozdělenou na dvě části. Jedné říkám “BIOS” a druhé “APLIKACE”. V první části běží funkce, které obsluhují vstupy/výstupy, komunikaci, filesystém, ADC, přerušení atd… V druhé části běží užívatelský program. V tomto programu se provádí výpočty, beží regulace, řeší se interakce s uživatelem a logujou data na SD kartu.

Důvodem rozdělení programů na tyto dvě části je požadavek na upgrade aplikace z SD karty. Funkce biosu se totiž mění s časem jen velmi pomalu (je z 90% dána hardwarem) zatímco aplikace se stále vyvíjí nebo se opravují chyby. Není proto důvod přehrávat celou flešku, ale jen to co se může změnit. Toto mi také řeší to, že pokud se při přehrávání stane nějaký problém, tak se zařízení nestane černou krabičkou.

Celým tímto punkovým projektem jsem si ale parádně nadělal do kalhot, protože mi chybí ještě velmi mnoho znalostí.
Např. nechápu proč po napsání:

asm("push {r0-r12}");

dojde k takovémuto překladu:

stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}

nebo:

asm("pop {r0-r12}");

dojde k takovémuto překladu:

ldmia.w	sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}

Doteď jsem totiž žil v přesvědčení, že to co napíšu jazykem assembler je svaté. No snad to ještě doženu…říkaj že to je jen o těch prvních deseti letech.

Takže tam máš nějakej scheduler a něco co přepíná context mezi N vlákny nebo ne ? To mi spíš příjde že máš něco co využívá funkce uložené na absolutníh adresách…

Osobně byh tam měl startup kterej pořeší upgrage (najde na SD soubor s firware, udělá uprade a pustí to, když ne pustí to co už tam je). To je standardní postup.

forums.leaflabs.com/topic.php?id=1298

No je to skutečně tak…snažím se všechno umisťovat absolutně. Nějak mi příjde, že nad tím mám větší kontrolu. Scheduler není potřeba. Všechny události se časují systémovým časem v 5ms intervalu.

Co se týče tohoto:

Toto si myslím, že to je spíš o otázce přístupu a pojmenování. Ve finále stejnak všechno vede ke stejnému výsledku, akorád to má jinou obálku.

Jinak ten odkaz byl zajímavej. Našel jsem tam pár věcí co jsem úplně nevěděl. Bohužel jsem tam ale nenašel proč je ta instrukce assebleru: ‘‘stmdb’’ místo mého požadovaného ‘‘push’’.

st.com/web/en/resource/technical/document/programming_manual/CD00228163.pdf