Kysymys:
Onko mahdollista suorittaa binäärikoodia RAM-muistista?
pierre
2015-07-04 19:03:51 UTC
view on stackexchange narkive permalink

Etsin halpaa yhden kortin tietokonetta, jonka voisin ohjelmoida kokoonpanokielellä käyttäen rajoitettuja tiloja kohdekoodin lataamiseen tietokoneelta ja yksinkertaisista I / O-oheislaitteista.

Ihannetapauksessa haluaisin pystyn kirjoittamaan kohtuullisessa ajassa kaikki koneen koodit itse. En halua käyttöjärjestelmää tavallaan, koska haluan, että minulla on ohjelma, joka kirjoittaa RAM-muistiin jonkin koodin ja haarautuu sen suorittamiseksi.Arduino olisi todennäköisesti paras valinta, sikäli kuin kokoonpanon ohjelmointiin soveltuva järjestelmän yksinkertaisuus menee, mutta sillä on Harvard-arkkitehtuuri, eikä se salli minun suorittaa suoritusta RAM-muistista.

Vuosia sitten käytin Von Neumannin arkkitehtuurin 8-bittistä prosessoria, joka pystyi haaroittamaan suorituksen mihin tahansa osoitteeseen riippumatta siitä, onko se kartoitettiin ROM-muistiin, RAM-muistiin tai mihin tahansa. Tämän haluaisin tehdä nyt.

Voin todennäköisesti kirjoittaa ja ladata Flash-muistiin RAM-muistiin kirjoitettujen op-koodien tulkin, mutta se on hyvin monimutkainen ja aikaa vievä ratkaisu, ellei virtuaalikoneita tällaisia ​​on jo olemassa.

Onko ehdotuksia muista Arduinon tai muiden mahdollisesti käyttämieni mikro-ohjainten kiertotavoista?

Kiitos!

Pierre

PIC32 on Princeton (Von Neumann) -arkkitehtuurisiru. Se on MIPS-prosessori, joten se on hyvin dokumentoitu ja standardoitu, vaikkakin hieman monimutkaisempi kuin matala AVR. ChipKIT-levyt voivat olla enemmän mieleisesi.
Vaikka ARM Cortex-M -sarja on optimoitu Harvardin arkkitehtuuriksi, se voidaan suorittaa RAM-muistista siedettävällä tehohäviöllä, ja se olisi silti paljon nopeampi kuin AVR. Ainakin puoli tusinaa siruyritystä tekee laajalti käytettyjä tarjouksia tämän ytimen lisensoinnin perusteella, ja vaikka monet ihmiset käyttävät myyjä- ja / tai puolikokoisia kirjastoja, se on täysin mahdollista tehdä kaikki itse tietolomakkeiden perusteella. Menin ensin STM32: n kanssa, koska heidän etsintälevyt ovat erittäin halpoja, toimivat Linux / OSX: llä avoimen lähdekoodin työkaluilla ja voivat ohjelmoida siruja mukautetuille levyille, mutta ovat nyt käyttäneet myös Kinetisiä.
Pääkysymys on miksi? Miksi tarvitset ASM-suorituksen RAM-muistista? Ja millaista kokoonpanoa haluat käyttää? Koska jokaisella arkkitehtuurilla on oma kielensä ... Teetkö tämän oppimistarkoituksiin? Tai onko sinulla tietty kohde?
Pyydän erimielisyyttä, miksi halusin tehdä tämän, ei ole merkitystä tuolloin esittämälleni kysymykselle, koska tämä ei ole kiertotapa johonkin muuhun asiaan. Noudatin muuten Majenkon neuvoja, ja minulla on tällä hetkellä Uno32 plus ulkoiset rajapinnat, jotka suorittavat kokoonpanoa (ja kutsuvat C-toimintoja kokoonpanosta), kirjoittavat oman muokatun asm-koodin RAM-muistiin ja suorittavat sen.
Forth on mitä etsit :)
@ChrisStratton: n asettaminen koodiin RAM-muistiin Flashin sijaan voi tosiasiallisesti johtaa nopeampaan koodiin, ainakin niissä prosessoreissa, joissa osa sisäisestä RAM-muistista on koodialueella. (osoite enintään 0x1FFFFFFF). Salama on tyypillisesti hidasta, ja huolimatta "muistin kiihdyttimestä / puskurista" (joka on yksinkertaisesti pieni välimuisti), et koskaan saa todellista yhden jakson käyttöoikeutta. Siksi sinulla on paljon rangaistuksia, varsinkin jos koodissa on paljon hyppyjä (puskuri on täytettävä uudelleen) ja se suoritetaan Flashista RAM: n sijaan. Eri asia on ulkoinen RAM, joka saattaa olla hyvin hidasta (esim. Väylärajoitusten vuoksi).
@next-hack, jos sinulla on koodin käyttöä varten optimoitu RAM, kyllä. Mutta monet perusmikrot, jotka * sallivat * koodin pääsyn RAM-muistiin, on optimoitu vain siihen pääsyyn tietoihin - vaikka voit käyttää niitä RAM-muistista, se on hitaampaa kuin ajaa niitä flash-muistista, koska ohjeiden noutamisen ja tietojen käytön on jaettava sama muistiväylä , kun tavallisesti he eivät. Mutta jos sinulla on erityisesti suunniteltu tätä varten, niin jatka. Ja tämä saattaa selittää, miksi (jos muistan oikein), joissakin Kinetis-osissa RAM-koot kasvavat symmetrisesti noin 0x20000000, eikä lineaarisesti sen yläpuolella, kuten sanotaan STM32: ssä.
üks vastaus:
Nick Gammon
2015-07-05 04:41:22 UTC
view on stackexchange narkive permalink

Tulkki-ajatus on mielestäni paljon toteutettavissa. Käsitteen kirjoittaminen assemblerissa koodiin, joka itse tuottaa konekoodin RAM-muistissa ja suorittaa sen, on itsessään uskomattoman monimutkainen.

Et ole sanonut miksi haluat tehdä tämän, joten jonkin verran XY-ongelma.

En halua käyttöjärjestelmää tavalla ...

Normaalilla Arduinolla ei ole käyttöjärjestelmää - periaatteessa kirjoittamasi koodi ladataan sirulle.

Sanalla sanoen ei. Kyvyttömyys suorittaa muunneltavaa muistia on melko epätavallinen rajoitus tänä päivänä, jolloin useimpia muita nimellisesti Harvardin arkkitehtuurilaitteita muokataan tämän rajoituksen välttämiseksi. Ohjelmistotulkin kirjoittaminen on sekä paljon enemmän työtä että paljon vähemmän tehokasta kuin käsitellä yhtä monista edullisista, korkean suorituskyvyn ja helppokäyttöisistä siruista, jolla on tarvittavat sisäiset yhteydet koodin yksinkertaiseen suorittamiseen RAM-muistista. Hieman vähemmän tehokas putkisto operaatio tässä tilassa on edelleen kaukana ohjelmistojen tulkinnasta.
Luulen, että aliarvioit vaatimuksen, jonka mukaan on oltava "ohjelma, joka kirjoittaa RAM-muistiin jonkin koodin ja haarautuu sen suorittamiseksi". Jos kysymyksessä sanotaan "lataa koodi levyltä ja suorita se", kyllä, se olisi vähäistä arkkitehtuureissa, jotka tukevat koodin lataamista RAM-muistiin. Mutta onko sinulla koodi, joka tuottaa konekoodin? Kääntäjä / kokoonpanija toisin sanoen? Ehkä ymmärsin väärin kysymyksen tarkoittavan "koodin luomista" eikä "latauskoodia". Mutta OP sanoi: "Haluaisin pystyä kirjoittamaan kohtuullisessa ajassa kaiken koneen koodin itse." Kuulostaa koodin luomiselta minulle.
Ei. Jos aiot suorittaa ajonaikaisen koodin muokkaamisen, konekoodin luominen on selvästi helpompaa kuin korkean tason koodin luominen, ja * myös * on luotava kääntäjä tai tulkki suosituksesi mukaisesti. Saattaa olla syytä viettää aikaa käsin kirjoittamalla ohjeita näkökulman saamiseksi. Ja ei, "kirjoita kaikki koodit koneelle itse" ** ei viittaa aluksi ajonaikakoodien luomiseen, vaan pikemminkin pelkästään alkuperäisen teoksen luomiseen verrattuna muihin tekijöihin luottamiseen komponenttien tukemisessa.
Mielestäni tätä vastausta voitaisiin parantaa linkittämällä luettelo tulkeista, jotka jo toimivat Arduinolla. Onko olemassa kattavampi luettelo kuin http://playground.arduino.cc/CommonTopics/InterpretedLanguages?
Tässä on yksinkertainen neljäs tyyli-kuori Arduinolle, joka suorittaa koodin mistä tahansa muistivälineestä (SRAM, EEMEM, EEPROM). Ei nopein tulkki, mutta näyttää kuinka käskyn nouto (muistin käyttö) ja käskyosoitin (puhelu- / paluuosoitteet) voidaan erottaa. https://github.com/mikaelpatel/Arduino-Shell
Olen vaikuttunut, Mikael. Kirjoitin Forth-tulkin Apple II: lle vuosia sitten. Epäilen edes löytää koodin näinä päivinä. Vanha hyvä Forth, vielä elossa ja potkimassa! :)
@NickGammon Kirjoitin äskettäin perinteisemmän neljännen virtuaalikoneen (fvm) Arduinolle. Se mahdollistaa upottaa tavun käskytulkin Arduino-luonnokseen, koska se on monitehtäväinen (sallii fvm: n tuoton). https://github.com/mikaelpatel/Arduino-FVM. On token-kääntäjä (toimii Arduinolla :) ja perinteinen neljäs vuorovaikutteinen tulkki. Katso esimerkkiluonnokset.
@MikaelPatel - no, se on vaikuttavaa! Käytin tunnuskartoitusta Pascal-kääntäjässäni vuosia sitten ja hännänpuhelun vähentämistä myös lähinnä koodin puristamiseksi käytettävissä olevaan tilaan. :)


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...