c: CallBack

Miroslav Draxal evik na volny.cz
Pátek Březen 26 16:07:18 CET 2021


Dobrý den,

Jenom pro úplnost, nakonec jsem to řešil přímo s Microchipem. CallBack je v současné době bez problémů používat s malým omezením.

V řade PIC18F lze callback používat:

1/ z hlavního programu se nesmí používat zpětné volání do přerušení vysoké a nízké priority

2/ z přerušení vysoké priority se nesmí používat zpětné volání do hlavního programu nebo do přerušení nízké priority  

3/ z přerušení nízké priority se nesmí používat zpětné volání hlavního programu nebo do přerušení vysoké priority 

4/ v podprogramech hlavního programu, kde se používá zpětné voláni se nesmějí používat lokální proměnné. 

Jinak hrozí konflikt „slití“ lokálních proměnných (což se mi právě stalo)

Do budoucna (neví kdy) bude tento problém vyřešen. 

Míra.

 

From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jaroslav Buchta
Sent: Thursday, February 25, 2021 6:04 AM
To: hw-list na list.hw.cz
Subject: Re: c: CallBack

 

Jen jsem to prolitnul ale tenhle zdrojak se asi nechci snazit ani pochopit.

Sel jsem na to jinak, 2 stavove automaty a jen s cyklicky volanou obsluhou main, pro inspiraci v priloze.

Funguje to uz 2 mesice bez selhani nebo restartu na tepelnem cerpadlo.

Blokuje to na max 60us preruseni, tomu jsem se chtel vyhnout a pouzit SPI pres DMA (STM32L0), ono by to skvele a na pozadi i fungovalo ale kdyby to nekdo zkousel, tak je potreba dat na MOSI latch - stav vystupu mezi sekvencemi se mi nepodarilo dostat pod kontrolu, je tam v klidu nejaky konec posuvneho registru a zalezi to na predchozim obsahu. 

 

Dne 25.02.2021 v 0:06 Miroslav Draxal napsal(a):

Dobrý večer,

Jedná se o XC8 pro microchip.

 

Mějme několik místních procedur, každá procedura v jiném kompilovaném modulu (Main.c, CallBack.c,). Tyto procedury se navzájem nemohou ovlivňovat, nejsou v ISR, proto kompilátor pro vnitřní „svoje potřeby“ může použít adresu proměnné, která je ve všech procedurách stejná. (třeba adr. 0x00, kam si ukládá data pro  „svoje potřeby“ )

Existuje technika, jak přinutit, aby pro jeden konkrétní  modul (CallBack.c) použil jedinečné adresy pro „svoje potřeby“.

 

C nativně neumí CallBack, ale jde to velice jednoduše napsat. Proto píši, že se procedury nemohou ovlivňovat a nejsou v ISR. Kompilátor neví, že z přerušení skáču třeba doprostřed procedury.

Proč to? Používám zpětné volání z ISR. V „voidProc(void)“  v Main.c, se používá adr. proměnné 0x00 pro předání parametru(neovlivním jeho adresu), přijde přerušení, z něj zpětným voláním volám proceduru v CallBack.c, která taky používá adr. proměnné 0x00 ( také to neovlivním), kde se obsah změní, a až se dostanu zpátky z přerušení,  obsah paměti je změněn.

 

Asi to je prasárna. Ale v systému, kde mi běží na přerušeních všechno, jakoby paralelně, je to zpětné volání fakt dobrá věc. Separované to běží jako z praku, pokud to zavedu do systému, začnou se mi hádat proměnné.

Zasílám k nahlédnutí. Je to zatím neučesané.

 

 





_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list

 

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210326/22483fae/attachment.html>


Další informace o konferenci Hw-list