Kysymys:
Suorita koodi upotetun C-ohjelman kerran elämässä
ganeshredcobra
2016-04-11 11:28:34 UTC
view on stackexchange narkive permalink

Kuinka koodinpätkä voidaan suorittaa vain kerran ohjelman elinaikana? Se voidaan kytkeä pois päältä ja päälle monta kertaa. Ainoa vaihtoehto koodinpätkän suorittamiseksi uudelleen on vilkkuttava levyä uudelleen.

Koodi on kalibrointiosio, jota en halua suorittaa uudelleen. Jos käytän EEPROMia tai Flashia, asetamme lipuksi tosi tai epätosi. Joten kun luemme ensimmäisen kerran muistipaikan, mikä olisi satunnaisarvo kyseisellä muistialueella?

Mikä on paras tapa toteuttaa tämä upotetussa C: ssä?

Haluatko suorittaa suorituksen vain kerran? Aina kun sammutat virran ja käynnistät sen, pitäisikö koodin suorittaa vain kerran ja tehdä sitten mitään, kunnes uusi virran nollaus tapahtuu?Tai etsitkö jotain koodin lukusuojausta?
Käytä lippua ja tallenna lippu eepromiin (tai flashiin).Lue joka hetki lippu eepromilta.Heti ensimmäisen kerran lipun arvo pakottaa toiminnon suorittamaan.Sen jälkeen voit muuttaa lipun arvoa ja tallentaa sen uudelleen eepromiin.Muina aikoina lippuarvo ei pakota funktion suorittamista.
epäselvä mitä kysyt.
@dwelch: Luulisin, että OP haluaa, että laite pystyy havaitsemaan, onko se "neitsyt", joten se voi tehdä jotain erilaista ensimmäisen ajon aikana verrattuna kaikkiin seuraaviin ajoihin (kuten suorittaa kalibrointi jne.)
oikein, mutta se on vain arvaus, voisi käyttää selvennystä.ja jos tämä on kysymys, se siirtyy epäselvästä luokasta liian laajaan luokkaan, koska toteutus on kyseiselle mikrokontrollerille ominaista.
Mikä on motivaationne estää koodia toistamasta toista kertaa?Onko tärkeää, että koodia ei voida suunnitella käänteisesti, jolloin lipun asettaminen ohittamaan ei välttämättä ole riittävän turvallista?Vaurioittaisiko koodi toisen kerran laitteistoa?Onko se UX-asia, kuten näyttää opetusviesti ensimmäisen kerran, kun järjestelmää käytetään, jolloin voi olla toivottavaa, että "tehdasasetusten palautus" -toiminto (jos sellainen on) laukaisee koodin suorittamisen uudelleen?
@MichealJohnson Se on kalibrointiosio, jota en halua suorittaa uudelleen. Jos käytän EEPROMia tai Flashia, asetamme lipuksi tosi tai epätosi..
Yleensä on hyvä sallia uudelleenkalibrointi, jos jokin sotkeutuu ensimmäisellä kerralla, tai järjestelmä on kalibroitava uudelleen eri asetuksia varten tai kompensoimaan laitteiston ikääntyminen jne. Minulla on tapana sekoittaa kalibrointiensimmäistä kertaa, koska en tiedä mitä minun pitäisi tehdä.
Entä jos asetat koodin niin, että on tapa komentaa se ajamaan (eli lähetät jotain sarjaportin kautta).Tällä tavalla ei tarvitse huolehtia haihtumattomasta muistista, ja voit käynnistää kalibroinnin tuotannon aikana hallitusti.
Olet kysynyt toistuvasti "mikä olisi satunnaisarvo kyseisellä [EEPROM / FLASH] -muistialueella?"Vastaus - se riippuu mikrokontrolleristasi.Se on todennäköisesti kaikki 0 tai 1, mutta emme tiedä.* Testaa tämä * ... ja sovita sitten koodi tunnistaaksesi * tämän * tilan.Jos "sama", tee kalibrointi ja käännä bitti.Huomaa, etten voi luottaa siihen, että tämä tila pysyy muuttumattomana kaikissa laiteversioissa ja työkaluketjuissa.
Neljä vastused:
followed Monica to Codidact
2016-04-11 11:51:30 UTC
view on stackexchange narkive permalink

Mikrokontrollerissasi voi olla joitain EEPROM-, OTP-muistia, käyttäjän sulakebittejä, joihin voit asettaa lipun.

"Upotetussa C: ssä ei ole parasta menetelmää", haihtumattoman muistin kirjoittaminen on erilaista jokaisessa mikrokontrollerissa .

edit:

FLASH

Flash-muistin sisältö poistetaan laitteen ohjelmoinnin aikana. Ohjelmoinnin jälkeen kaikki tavut, joita ei kirjoitettu, sisältävät 0xFF. Etsi taulukosta alue, joka voidaan ohjelmoida turvallisesti käynnissä olevasta laiteohjelmistosta.

EEPROM

Vaikka sitä ei taata taulukoissa, kaikki EEPROM-tiedostot Olen nähnyt toistaiseksi sisältänyt 0xFF: t tehtaalta lähetettynä (lukuun ottamatta niitä, jotka on esiohjelmoitu yksilöllisellä MAC-osoitteella, mutta se on nimenomaisesti dokumentoitu). Jotkin ohjelmointilaitteet / ohjelmistot pystyvät myös poistamaan tai ohjelmoimaan EEPROM-sisältöä. Jotkut niistä voivat olla kirjoitussuojattuja, pysyvästi tai palautuvasti.

OTP

Ohjelmoitava kertakäyttöinen muisti sisältää aina hyvin määriteltyjä alkuarvoja, jotka on dokumentoitu taulukkoon.

Aina on hyvä sisällyttää kirjoitettuihin tietoihin hyvä tarkistussumma, kuten CRC32, suojautua viallisista osista, lähetysvirheistä, kosmisista säteistä johtuvasta datan vioittumisesta.

Jos käytän EEPROMia tai Flashia, asetamme lipuksi tosi tai epätosi.Joten kun luemme ensimmäisen kerran muistipaikan, mikä olisi satunnaisarvo kyseisellä muistialueella.
Nollaa EEPROM valmistuksen aikana (joko ohjelmoijan avulla, jos mahdollista, tai tekemällä tyhmä pieni pyyhinohjelma, vilkaise se, käynnistä se normaalisti muutaman sekunnin ajan ja lataa sitten tuotanto-ohjelmaasi).
Steve G
2016-04-11 12:40:18 UTC
view on stackexchange narkive permalink

Sanoit:

Ainoa vaihtoehto koodin suorittamiseksi on vilkkuttava taulua uudelleen.

Toiset ovat sanoneet käyttävänsä EEPROMia lipun tallentamiseen. osoittaa, kun run_once () -toiminto on suoritettu. Tällä on kuitenkin takaisku, joka on, että jos päivität mikrokontrolleriä, EEPROM-tiedostossa oleva ran_it_once-lippu on jo asetettu eikä run_once () -toimintoa suoriteta. Jos mikrokontrolleri on upottanut EEPROM-muistin, voi olla mahdollista tyhjentää ran_it_once-lippu, kun päivität mikrokontrollerin, jos ohjelmoija tukee tätä.

Parempi tapa on, että versionumerot ovat sekä EEPROMissa että koodissa. Kun koodi suoritetaan käynnistettäessä, sen tulisi lukea versionumero EEPROMista ja verrata sitä koodiin tallennettuun versionumeroon. Jos ne eivät täsmää, run_once () -funktio kutsutaan, ja run_once () -koodin viimeinen toimenpide on kirjoittaa laiteohjelmistoversion numero EEPROM-tiedostoon. Aina kun muokkaat laiteohjelmiston lähdekoodia, sinun on lisättävä siihen upotettua versionumeroa.

Tällä olisi itse asiassa sama ongelma kuin loogisella lipulla, jos kaikki, mitä käyttäjä teki, päivitti mikrokontrollerin ja se olisi suoritettava uudelleen (tässä skenaariossa).Se ratkaisisi varmasti ongelman, jos laiteohjelmisto päivitettäisiin ja se olisi ajettava uudelleen.
apalopohapa
2016-04-11 12:41:39 UTC
view on stackexchange narkive permalink

Valitse mikro-ohjain, joka voi kirjoittaa / poistaa oman ohjelmamuistinsa. Kun olet suorittanut kyseisen koodin, pyydä mainitun koodin viimeinen osa korvaamaan ensimmäinen käsky hyppyllä, joka ohittaa sen. Vaihtoehtoisesti voit myös poistaa loput (ehkä korvata nopilla), niin että ei ole mitään mahdollisuutta, että se koskaan suorittaa uudelleen.

Tämä viesti tuhoutuu itsestään kohdassa 5..4 ...

Niin älykäs kuin tämä vastaus saattaa olla, mielestäni se on tarpeettoman monimutkainen.Ehkä se voisi käyttää muistiinpanoa, jonka mukaan sitä tulisi todennäköisesti käyttää vain, jos pysyvä muisti koodimuistin ulkopuolella ei ole käytettävissä?
Vaikka muutkin ratkaisut ovat mahdollisia, mielestäni tämä on helpompi ymmärtää kuin muut.
Vaikka muutkin ratkaisut olisivat mahdollisia, mielestäni tätä olisi hyvin vaikea ymmärtää lähdekooditasolla.
Useimmilla PIC-tiedostoilla on vain 35 ohjeita ... mikä voi mennä pieleen?;)
Michael
2016-04-12 04:55:17 UTC
view on stackexchange narkive permalink

Kun käytät tätä koodia kalibrointiin, ehdotan, että luodaan räjähdysprosessi, joka suorittaa kalibrointikoodin ensimmäisenä vaiheena, eikä edes ole sitä levyn valmiissa tuotantoversiossa. Tämä on samanlainen kuin apalopohapan vastaus, paitsi että siinä on erilainen siinä mielessä, että sinulla olisi kaksi erillistä ohjelmakuormitusta: sinulla on räjähdysprosessi, joka välähtää ensimmäisen ohjelmakuormituksen, joka suorittaa kaikki kalibroinnit ja siementää tiedot siitä. Ota sitten nämä tiedot ja sisällytä ne toisen ohjelmalatauksen tietoihin.

Tämän lähestymistavan etuna on, että minimoit ehdottomasti tarvitsemasi tallennustilan määrän - sinun ei tarvitse tallentaa kerran vain koodi, vain sen tuottamat tiedot. Kun sinulla on räjähdysprosessi, joka lataa kaksi erillistä ohjelmaa, eristät itsesi myös alustuskoodin virheistä, jotka voisivat viipyä muuten. Sinulla on myös jonkin verran joustavuutta, jos haluat suorittaa kalibrointikoodisi uudelleen: sen sijaan, että sinun tarvitsisi kirjoittaa ylimääräistä koodia sen tyhjentämiseksi, mikä merkitsee sitä, että koodi on suoritettu (joka voi vahingossa jo tyhjentyä), suoritat yksinkertaisesti uudelleen räjähdysprosessi.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...