Nekada, 90-tih godina silom prilika napravio sam pravi multitasking za upravljanje jednom složenom mašinom. Nju nisam mogao da donesem u radne prostorije, a bila je daleko od Niša.
Prva ideja je bila da napravim simulator mašine jednim MCU-om i da je povežem sa kontrolerom mašine. Onda mi pade napamet zašto da se zezam sa još jednom kontrolerskom jedinicom, kada mogu da napravim multitasking sa samo dva taska, gde bi jedan task simulirao mašinu. Kada sam to napravio, kolega se oduševio, i preko noći do jutra je pisao simulator. Tako napravismo kontrolu mašine za duplo kraće vreme od planiranog.
To je bilo sa HC11. Od tada je prošlo mnogo vremena, a računar sa izvornim kodom i svim projektima sa HC11 iz tog vremena je već odavno na deponiji. U međuvremenu sam zatvorio firmu, i ono malo što uradim pokrivam firmom drugara.
I po onom "besposlen pop jariće krsti" uzeh da napravim pravi multitasking za sledeči MCU kojim sam radio, MC9S08 ali za bilo koji broj taskova.
HC11 je uključivao taskove za oko 5us sa frkvencijom na magistrali od 2MHz, a ta frekvencija za 9S08 je 20MHz pa ima smisla samo ako ću uspeti da prebacujem taskove za manje od 5us. Ideja je da se taskovi uključuju na 500us.
Postavio sam tehničke zahteve, i sada ih razrađujem u smislu implementacije.
Taskovi se menjaju na prekid nekog tajmera sa periodom 500us ili više, sa mogućnošču da se neki task izvršava i duže.
Prebacivanje taskova i drugi prekidi ne smeju da budu u koliziji.
Stek prostor treba podeliti tako da svaki task ima svoj deo steka.
Glavni program je takođe jedan task.
Mora da postoji procedura za uključivanje taskova. Ona mora da promeni adresu povratka, koja ukazuje na prvu instrukciju pre prekida, na adresu sledeće instrukcije sledećeg taska kada je on bio prekinut. Sa povratkom iz prekidne procedure, nastaviće se izvršenje sledećeg taska. Pored ovoga, treba i stek pointer promeniti da ukazuje na stek sledećeg taska.
Vidim da je potrebna inicijalizacija stekova za svaki task što ne bi trebalo da je problem.
Pošto dosta toga mora biti u asembleru, ideja mi je da sve napišem u asembleru, a posle da "prevedem" na C, osim onoga što mora da bude u asembleru. Ali to će biti u nekom include fajlu i neće smetati.
Nisam siguran da cu doći do optimalnog rešenja, pa ako je neko nostalgičan može pomoći, ako su mu dosadile teme tipa kako da pogonim displej arduinom ili slično što je u starim dobrim vremenima bila trivijalna stvar.
Prva ideja je bila da napravim simulator mašine jednim MCU-om i da je povežem sa kontrolerom mašine. Onda mi pade napamet zašto da se zezam sa još jednom kontrolerskom jedinicom, kada mogu da napravim multitasking sa samo dva taska, gde bi jedan task simulirao mašinu. Kada sam to napravio, kolega se oduševio, i preko noći do jutra je pisao simulator. Tako napravismo kontrolu mašine za duplo kraće vreme od planiranog.
To je bilo sa HC11. Od tada je prošlo mnogo vremena, a računar sa izvornim kodom i svim projektima sa HC11 iz tog vremena je već odavno na deponiji. U međuvremenu sam zatvorio firmu, i ono malo što uradim pokrivam firmom drugara.
I po onom "besposlen pop jariće krsti" uzeh da napravim pravi multitasking za sledeči MCU kojim sam radio, MC9S08 ali za bilo koji broj taskova.
HC11 je uključivao taskove za oko 5us sa frkvencijom na magistrali od 2MHz, a ta frekvencija za 9S08 je 20MHz pa ima smisla samo ako ću uspeti da prebacujem taskove za manje od 5us. Ideja je da se taskovi uključuju na 500us.
Postavio sam tehničke zahteve, i sada ih razrađujem u smislu implementacije.
Taskovi se menjaju na prekid nekog tajmera sa periodom 500us ili više, sa mogućnošču da se neki task izvršava i duže.
Prebacivanje taskova i drugi prekidi ne smeju da budu u koliziji.
Stek prostor treba podeliti tako da svaki task ima svoj deo steka.
Glavni program je takođe jedan task.
Mora da postoji procedura za uključivanje taskova. Ona mora da promeni adresu povratka, koja ukazuje na prvu instrukciju pre prekida, na adresu sledeće instrukcije sledećeg taska kada je on bio prekinut. Sa povratkom iz prekidne procedure, nastaviće se izvršenje sledećeg taska. Pored ovoga, treba i stek pointer promeniti da ukazuje na stek sledećeg taska.
Vidim da je potrebna inicijalizacija stekova za svaki task što ne bi trebalo da je problem.
Pošto dosta toga mora biti u asembleru, ideja mi je da sve napišem u asembleru, a posle da "prevedem" na C, osim onoga što mora da bude u asembleru. Ali to će biti u nekom include fajlu i neće smetati.
Nisam siguran da cu doći do optimalnog rešenja, pa ako je neko nostalgičan može pomoći, ako su mu dosadile teme tipa kako da pogonim displej arduinom ili slično što je u starim dobrim vremenima bila trivijalna stvar.