Ce este codul sursă? Ce este codul programului, aplicația, erorile

  • Programare
  • Unii pentru distracție, alții pentru a dovedi existența sau a infirma o ipoteză, alții pentru a-și exercita creierul (călătorind pe suprafața unei sticle Klein sau în spațiu cu patru dimensiuni), dar sute de oameni au creat limbaje de programare „ezoterice”. Am trecut prin aproximativ 150 dintre aceste limbi și nu voi mai fi niciodată la fel.

    „Argh!”, „Oof!”, „2-ill”, „Nhohnhehr”, „Noit o" mnain gelb”, „DZZZZ”, „Ypsilax”, „YABALL”, la naiba - acestea sunt vrăji, poezia este doar nume ... sub catom - exemple de cod în cele mai atrăgătoare limbaje de programare.

    gaura iepurelui este adâncă.

    INTERCAL (Turing-complet)



    Don Woods și Jim Lyon

    Unul dintre cele mai vechi limbaje de programare ezoterice. Potrivit creatorilor, numele său înseamnă „Limbajul compilatorului fără acronim pronunțabil”. Limbajul a fost creat în 1972 de studenții Don Woods și James M. Lyon ca o parodie a limbajelor de programare existente și a gimnasticii mentale.

    Salut Lume

    Fiecărei comenzi de program i se poate da o probabilitate cu care va fi executată la pornirea programului. În plus, există comenzi care blochează executarea comenzilor ulterioare de un anumit tip sau modificări ale variabilelor.

    Salut Lume!

    // „Hello World” de Stephen McGreal.
    // Rețineți că opiniile exprimate în acest cod sursă nu coincid neapărat cu cele ale

    Gr34t l33tN3$$?
    M3h...
    iT 41n"t s0 7rIckY.

    L33t sP33k este U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh.
    1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h4xX0r1ng s1tE!!! ;p
    w4r3Z c0ll3cT10n2 r 7eh l3Et3r!

    Qu4k3 cL4nS r 7eh bE5t tH1ng 1n teh 3nTIr3 w0rlD!!!
    g4m3s wh3r3 u g3t la 5h00t ppl r 70tAl1_y w1cK1d!!!
    I"M teh fr4GM4ster aN I"lL t0t41_1Ly wipE the phr34k1ng fL00r ***j3d1 5tylE*** WWITH Y0uR h1dE!!! L0L0L0L!
    t3lEphR4gG1nG l4m3rs cu mY m8tes r34lLy k1kK$ A$$

    L33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff ca n34t pR0gR4mm1nG LANGURI$…
    s0m3tIm3$ teh l4nGu4gES l00k doar l1k3 rE41_ 0neS 7o mAkE ppl Th1nk th3y"r3 ju$t n0rMal lEE7 5pEEk dar th3y"re 5ecRetLy c0dE!!!
    n080DY sub5tAnd$ l33t SPeaK 4p4rT fr0m j3d1!!!
    50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t E mL0d l33t cL0d!!! el i5 și u8ER!!!
    1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch34t c0dE.
    1t 3v3n MiTe jUs7 s4y „H3LL0 W0RLD!!!” u ju5t can"T gu3s5.
    tH3r3"s n3v3r any p0iNt l00King sC3pT1c4l c0s th4t, be1_1Ev3 iT 0r n0t, 1s what th1s 1s!!!

    5uxX0r5!!!L0L0L0L0L!!!

    ArnoldC

    Limbajul de programare Terminator.

    Salut Lume!

    Ok!

    Fie limba urangutanilor, fie visul lui William of Occam.

    Salut Lume!

    bucătar

    Un limbaj de programare ezoteric dezvoltat de David Morgan-Mar, în care programele sunt similare cu rețetele culinare. Fiecare program din limbaj constă dintr-un nume, o listă de variabile și valorile acestora și o listă de instrucțiuni. Variabilele pot fi denumite numai după numele produselor alimentare de bază. Se numește stiva în care sunt plasate valorile variabilelor. bol de amestecare, iar operațiunile de manipulare a variabilelor sunt amestecare, amestecare și așa mai departe.

    Salut Lume

    Salut World Souffle.

    Ingrediente.
    72 g fasole
    101 ouă
    108 g untură
    111 căni de ulei
    32 de dovlecei
    119 ml apă
    114 g somon roșu
    100 g muștar dijon
    33 de cartofi

    Metodă.
    Pune cartofii în bolul de amestecare.
    Pune muștarul dijon în bolul de amestecare.

    Puneți somonul roșu în bolul de amestecare.

    Pune apă în bolul de amestecare.
    Puneți dovleceii în bolul de mixare.
    Pune ulei în bolul de amestecare.
    Pune untură în bolul de amestecare.
    Pune untură în bolul de amestecare.
    Pune ouăle în bolul de amestecare.
    Pune fasolea în bolul de amestecare.
    Lichefiați conținutul vasului de amestecare.
    Turnați conținutul bolului de amestecare în tava de copt.

    Orice program sau serviciu online, de exemplu, Word, Microsoft Windows, WhatsApp sau un browser, pe care sute de milioane de oameni îl lansează în fiecare zi, într-un fel sau altul, constă în instrucțiuni speciale. Sau un cod de program special pe care mașina îl înțelege și îi spune ce să facă sau, dimpotrivă, să nu facă. Sau cum să răspundeți corect la acțiunile utilizatorului. Ce este codul programului va fi discutat în acest articol.

    Descriere

    Codul de program al unui program este un text scris într-un limbaj special care poate fi înțeles de o mașină. Poate fi executat direct din text folosind un interpret sau tradus într-o formă specială folosind un compilator.

    Codul sursă al unui program poate consta din mai multe fișiere. În plus, toate trebuie să aibă același format. Textul programului conținut în acestea trebuie să fie scris în aceeași limbă. Adevărat, pot exista și excepții. De exemplu, în dezvoltarea web, un fișier de pagină poate conține mai multe limbaje și standarde de programare diferite. În funcție de complexitatea proiectului, pot fi prezente limbi și tehnologii precum PHP, HTML și altele.

    Când sunt asamblate, sistemele software complexe pot necesita un număr mare de fișiere, care se pot număra la sute. Pentru a colabora la proiecte atât de mari, programatorii folosesc foarte des sisteme de control al versiunilor. Acestea vă permit să lucrați simultan cu mai multe copii ale codului sursă, care la un anumit stadiu de dezvoltare pot fi combinate într-una comună.

    Calitatea codului

    Computerul nu este capabil să înțeleagă cum este scris codul pentru acesta, rău sau bun. Dacă este operațional și nu conține erori, atunci aparatul îl va lansa în orice caz. Codul greșit poate complica sarcinile de întreținere a software-ului. Acest lucru este valabil mai ales pentru proiectele mari. De obicei, codul de înaltă calitate este caracterizat de mai mulți parametri:

    • Lizibilitatea codului. O singură privire ar trebui să fie suficientă pentru a înțelege în general ce este implementat de o bucată de cod.
    • Prezența unor comentarii clare și succinte. Acest parametru afectează foarte mult lizibilitatea, ușurința depanării, testarea suportului și depanarea codului programului.
    • Dificultate scăzută.
    • Optimizarea codului. Ar trebui să fie organizat în așa fel încât programul să folosească cât mai puține resurse de sistem, cum ar fi memoria, timpul procesorului și spațiul pe hard disk.
    • Fara gunoi. Adică variabile neutilizate sau blocuri de cod în care controlul programului nu intră niciodată.

    Cod rău intenționat

    Pe lângă programele utile, există unele care pot dăuna sistemului sau chiar echipamentului. De regulă, un astfel de cod este scris de persoane care sunt interesate de unele beneficii din procesul în curs. De exemplu, programe care pot fura date personale de pe computerele utilizatorilor. Acestea pot fi numere de carduri de plată, date de pașaport sau orice alte informații confidențiale. Alții pot interfera pur și simplu cu funcționarea sistemului, provocând astfel defecțiuni și împiedicând funcționalitatea completă.

    Jeff Vogel, un programator de multă vreme, a împărtășit câteva sfaturi pentru a-i învăța pe dezvoltatorii aspiranți regulile unui cod bun.

    În special, el sugerează să comentați întotdeauna codul programului dvs. Ce este un comentariu? Este o descriere clară și concisă a ceea ce se întâmplă într-o anumită linie de cod sau funcție. Faptul este că dezvoltarea unui anumit program poate dura o lună sau chiar se poate opri de ceva timp. Revenind la lucru la un proiect după câteva luni, chiar și unui programator experimentat îi va fi greu să-și înțeleagă propriul program. Dar comentariile detaliate vor putea restabili lanțul de evenimente și comportamentul codului.

    În plus, el recomandă utilizarea variabilelor globale în programul dvs. cât mai des posibil. Acest lucru se explică prin faptul că atunci când schimbați codul programului, va trebui să ajustați valoarea variabilei într-un singur loc. În acest caz, toate funcțiile sau procedurile care utilizează valoarea vor ști imediat despre aceasta și vor efectua operațiuni cu noile date.

    Nume variabile și detectarea erorilor

    Numele corect al variabilelor va ajuta, de asemenea, la reducerea semnificativă a timpului petrecut studiind codul sursă al programului, chiar dacă codul a fost scris de dvs. Adică, codul bun este considerat text în care variabilele și funcțiile au nume care arată clar ce anume fac sau stochează. În acest caz, ar trebui să încercați să nu utilizați nume lungi de variabile.

    Este foarte important să acordați o mare atenție eliminării în timp util a erorilor. Ce este codul de program care se execută perfect? Acesta este un cod care nu are erori. Adică, orice ramificare a buclei sau modificare a variabilei, sau chiar orice acțiune neașteptată a utilizatorului, va duce întotdeauna la rezultatul așteptat. Acest lucru se realizează prin testarea produsului finit de mai multe ori.

    Identificarea erorilor de cod de program sau, mai degrabă, prezicerea acestora este posibilă în etapa de proiectare a programului. Prezența în cod a diferitelor verificări ale condițiilor și posibile excepții va ajuta la controlul programului de-a lungul unui anumit curs.

    Optimizarea este de o importanță enormă pentru scrierea unui program funcțional care va folosi economic resursele computerului și, în același timp, va evita erorile în execuția codului programului. Ce este un program optimizat? Acesta este un produs care este capabil să îndeplinească toate funcționalitățile declarate, în timp ce se comportă „liniștit” și economic.

    Aproape întotdeauna, optimizarea pentru funcționarea stabilă a programului poate fi realizată numai prin efectuarea mai multor teste pe platforme diferite și în condiții diferite. Dacă un program începe să se comporte imprevizibil, trebuie să determinați ce l-a cauzat și, dacă este posibil, să eliminați sau să interceptați procesul.

    Concluzie

    Ce este codul programului? În termeni simpli, este un set de instrucțiuni și concepte pentru un computer. Conține text pe care un compilator sau un interpret îl poate transforma într-un limbaj care poate fi citit de mașină. Adică, în esență, codul programului este un intermediar între o persoană și un computer, ceea ce simplifică relația lor.

    Sursă(de obicei doar textul programului, Engleză cod sursa) - orice set de instrucțiuni sau declarații scrise într-un limbaj de programare pentru computer și într-o formă care poate fi citită de o persoană. Codul sursă permite programatorului să comunice cu computerul folosind un set limitat de instrucțiuni.

    Cod sursă scris în HTML folosind JavaScript

    Codul sursă care reprezintă un program este de obicei conținut în unul sau mai multe fișiere text, uneori stocate în baze de date ca proceduri stocate și poate apărea, de asemenea, ca fragmente de cod tipărite în cărți sau alte medii de imprimare. O colecție mare de fișiere de cod sursă poate fi organizată într-un arbore de directoare, caz în care poate fi cunoscut și ca arborele codului sursă(Engleză) arborele sursă) sau arborele de cod arborele de cod sursă etc.

    Codul sursă al programului este un set de fișiere necesare pentru a converti dintr-o formă care poate fi citită de om într-o formă de cod executabil de computer. Există două direcții posibile pentru execuția codului: tradus în Codul mașinii folosind un compilator conceput pentru un anumit arhitectura calculatorului, sau efectuat direct pe text folosind un interpret.

    Goluri

    Codul sursă este folosit în primul rând ca intrare într-un proces care produce programe executabile (adică este compilat sau interpretat). De asemenea, este folosit ca mijloc de transfer de algoritmi între oameni (de exemplu, fragmente de cod în cărți). Portarea unui program pe alte platforme de computer fără cod brut este de obicei destul de dificilă. Deși opțiunile de portare fără coduri sursă sunt posibile, de exemplu, traducerea binară sau emularea platformei originale.

    Licențiere

    Instrumentele software și codul sursă care le însoțesc, se încadrează de obicei în una dintre cele două paradigme de licențiere: software cu sursă deschisă și software neliber (sau proprietar). În general, software-ul este deschis, dacă codul sursă poate fi folosit, distribuit, modificat și analizat în mod liber și proprietate, dacă codul sursă este păstrat secret sau este proprietate privată și accesul la acesta este limitat. Pentru a asigura secretul, sunt utilizate în primul rând prevederile diferitelor legi privind drepturile de autor, dar sunt adesea folosite și secretele comerciale și brevetele. În plus, distribuția programului vine de obicei cu un acord de licență (EULA), care interzice în primul rând decompilarea, ingineria inversă, analiza, editarea sau eludarea protecției la copiere. Tipuri de protecție a codului sursă (în plus față de compilarea tradițională în codul obiect includ criptarea codului, ofuscarea codului). ofuscarea codului) sau transformarea codului.

    Calitate

    Modul în care este scris un program poate avea consecințe foarte importante pentru întreținerea lui. Multe manuale de stil de programare insistă asupra importanței lizibilității, iar multe ghiduri se concentrează pe menținerea codului sursă al unui program, care include depanarea și actualizările. Alte priorități, cum ar fi viteza de execuție a programului și capacitatea de a compila un program pentru mai multe arhitecturi, fac adesea ca lizibilitatea codului să fie mai puțin importantă, deoarece calitate Codul depinde în întregime de scopul său.

    Deoarece programarea a existat la scară industrială de zeci de ani, au fost dezvoltate standarde adecvate de formatare a codului. Unele standarde sunt formalizate, în timp ce altele sunt reguli nerostite. De exemplu, notația maghiară reglementează denumirea identificatorilor într-un program (adesea acest lucru este decis prin emiterea unei convenții de denumire la nivel de întreprindere), alte standarde definesc regulile de aranjare a elementelor de sintaxă.

    Astăzi, multe companii, precum și persoane fizice, simt nevoia să aibă propriul site web, motiv pentru care informațiile pe tema dezvoltării și promovării proiectelor pe Internet sunt atât de solicitate. Mulți oameni sunt interesați de întrebarea - cum să vă creați propriul dvs site-ul web, codul programului pentru care este ca o fundație pentru o casă? Să încercăm să înțelegem această problemă aprofundând în subiectul dezvoltării web.

    Un site web nu este doar o colecție de text, link-uri, imagini și bannere colorate, este și un cod de program care rulează pe computerul utilizatorului sau pe partea serverului. Și dacă astăzi aproape oricine poate crea imagini în formatul necesar în rezoluția și calitatea necesare, folosind imagini gata făcute de pe Internet sau orice editor grafic popular, atunci creați codul site-ului pentru un nespecialist este plin de dificultăți considerabile.

    Calitatea aplicațiilor și a proiectului Internet în ansamblu depinde în mare măsură de priceperea programatorului care dezvoltă site-ul, al cărui cod de program poate conține erori care afectează foarte mult viteza de încărcare a paginilor web și multe alte aspecte ale funcționării întregului site. site-ului, inclusiv cele legate de securitate. Prin urmare, detectarea și eliminarea erorilor din cod este o componentă obligatorie la crearea oricărui site web. Cel mai bine este să încredințați specialiștilor dezvoltarea unui site web corporativ complex (dacă nu sunteți unul), deoarece unele erori sunt greu de detectat, iar multe dintre ele pot duce în continuare la încărcarea lentă și afișarea incorectă a paginilor web în browserele de calculatoarele utilizatorilor de internet. Încărcarea prea mult timp poate provoca o ieșire de vizitatori de pe site și o scădere a calității traficului, ceea ce reduce profitul și eficiența utilizării proiectelor comerciale de internet.

    HTML și CSS mai întâi

    Baza unui document web este codul scris în limbajul de marcare HTML. Un limbaj de marcare nu trebuie confundat cu un limbaj de programare și care este diferența reală este scrisă în detaliu. În principiu, folosind setul de comenzi pe care HTML-ul îl oferă dezvoltatorului site-ului, puteți seta toți parametrii necesari ai unui document web static - aranjarea elementelor (marcare bloc), titluri, paragrafe, tabele, imagini etc. Și cu ajutorul CSS, un add-on special pentru HTML, puteți poziționa toate obiectele de marcare listate, le puteți schimba stilul - culoare, dimensiune, format etc.

    Apoi JavaScript

    Elementele interactive și animate, de exemplu, bannere, ticker-uri, formulare de feedback, pe paginile web funcționează datorită prezenței scripturilor și codului scris în limbaje de programare server sau client. Scripturile dezvoltate folosind limbajul de programare JavaScript sunt foarte populare. Astfel de scripturi client nu folosesc capacitățile serverului în munca lor și sunt executate pe partea laterală a computerului utilizatorului, adică în browser. Acest lucru face aplicațiile JavaScript simple și rapide.

    Și în sfârșit PHP

    Când este necesar să scrieți coduri complexe și voluminoase, de exemplu pentru forumuri sau cărți de oaspeți, programatorii apelează la limbaje de programare de pe server pentru ajutor și în special la . Codurile PHP sunt executate pe partea de server, astfel încât performanța lor poate fi puțin mai lentă, în funcție de viteza conexiunii la computerul de la distanță și de cât de ocupat este. Folosind comenzi PHP și SQL (un limbaj de interogare special pentru o bază de date relațională), puteți organiza interacțiunea unui site cu baze de date și puteți crea proiecte interactive pe Internet - forumuri, magazine online, panouri de buletin, diverse directoare etc.

    Baza site-ului este codul programului a fost modificat ultima dată: 3 martie 2016 de către Admin

    (Ghidul dezvoltatorului pentru microcontrolerele din familia HCS08)

    În Exemplul 12.1, vom analiza codul care vă permite să scrieți și să ștergeți datele native din memoria flash. Astfel de acțiuni sunt necesare dacă utilizatorul unui dispozitiv face setări suplimentare pentru acest dispozitiv și dorește ca configurația selectată să fie păstrată după oprirea alimentării.

    Anterior, am observat că familia de MCU-uri HCS08 nu permite ștergerea și programarea operațiunilor de memorie flash, executând programul de control al acestor moduri și din memoria flash. Asigurați-vă că mai întâi rescrieți codul programului responsabil de ștergerea și programarea operațiunilor în RAM, apoi rulați acest cod pentru execuție. În timpul procesului de ștergere și programare, modulului de memorie flash va fi aplicat o tensiune crescută. Cu toate acestea, acest lucru nu va duce la întreruperea programului, deoarece la un moment dat va fi executat din RAM.

    NXP a dezvoltat un set de utilitare în limbaj de asamblare care facilitează crearea de cod personalizat pentru a programa memoria flash sub controlul programului de operare al dispozitivului. Aceste utilitare se află în fișier doonsstack.asm. Acest fișier ar trebui inclus în proiect, așa cum se arată în Fig. 12.3.

    Orez. 12.3. Fereastra de proiect cu fișierul inclus doonsstack.asm.

    Conținutul fișierului doonsstack.asm prezentat mai jos. Este dat textul original al codului de program utilizat, astfel încât comentariile nu pot fi traduse.


    ;* Această papetărie este menită să servească drept cadru pentru un *
    ;* aplicație utilizator. Pentru un program mai cuprinzător care *
    ;* demonstrează funcționalitatea mai avansată a acestui *
    ;* procesor, vă rugăm să vedeți aplicațiile demonstrative *
    ;* situat în subdirectorul exemple al *
    ;* Metrowerks Codewarrior pentru directorul programului HC08 *
    ;**************************************************************
    ; simboluri de export
    XDEF DoOnStack
    XDEF FlashErase
    XDEF FlashProg
    ; folosim export „Entry” ca simbol. Acest lucru ne permite
    ; referiți „Entry” fie în fișierul linker .prm
    ; sau din C/C++ mai târziu

    ; includ macrocomenzi specifice derivate
    Includeți „MC9S08GB60.inc”

    Următoarele două rânduri ar trebui să nu fie comentate și să li se atribuie valorile dorite.

    ;mPageErase equ $40
    ;mByteProg equ $20
    mFACCERR equ $10
    mFPVIOL equ $20
    mFCBEF equ 80 USD
    ; secțiunea variabilă/date
    MY_ZEROPAGE: SECȚIUNEA SCURTĂ
    ; Introduceți aici definiția datelor dvs. Pentru demonstrație, se folosește temp_byte.
    ; temp_byte ds.b 1
    ; secțiunea de cod
    MyCode: SECȚIUNE
    ;**************************************************************
    ; această rutină de asamblare se numește aplicație C/C++
    DoOnStack: pshx
    pshh; salvează indicatorul pentru a clipi
    psha; comanda de salvare pe stivă
    ldhx #SpSubEnd ;punctează ultimul octet pentru a se muta în stivă;
    SpMoveLoop: lda ,x ;citește din flash
    psha ;mutare pe stivă
    aix #-1 ;următorul octet de mutat
    cphx #SpSub-1 ;sfârșit trecut?
    bne SpMoveLoop; buclă până la întregul sub pe stivă
    tsx ;punctează către sub pe stivă
    tpa ;mută CCR în A pentru testare
    și #$08 ;verificați masca I
    bne I_set ;skip dacă am setat deja
    sei ;block se întrerupe în timp ce FLASH este ocupat
    lda SpSubSize+6,sp ;preîncărcare date pentru comandă
    cli ;ok pentru a șterge masca acum
    bra I_cont ;continuați să stivuiți de-alocarea
    I_set: lda SpSubSize+6,sp ;preîncărcare date pentru comandă
    jsr ,x ;execută sub-ul pe stivă
    I_cont: ais #SpSubSize+3 ;dealocarea subcorpului + H:X + comandă
    Indicatorul flash ;H:X OK de la SpSub
    lsla ;A=00 & Z=1 cu excepția cazului în care PVIOL sau ACCERR
    rts ;pentru a clipi unde a fost apelat DoOnStack
    ;**************************************************************
    SpSub: ldhx LOW (SpSubSize+4), sp; obțineți adresa flash din stivă
    sta 0,x ;scrie pe flash; latch adresă și date
    lda SpSubSize+3,sp ;get comandă flash
    sta FCMD ;scrie comanda flash
    lda #mFCBEF ;mască pentru a iniția comanda
    sta FSTAT ; comanda de înregistrare
    nu ;[p] vreau min 4~ de la ciclul w la r
    ChkDone: lda FSTAT ; deci FCCF este valabil
    lsla ;FCCF acum în MSB
    bpl ChkDone ;buclă dacă FCCF = 0
    SpSubEnd: rts; înapoi în DoOnStack în flash
    SpSubSize: equ (*-SpSub)
    ;**************************************************************
    FlashErase: psha; ajusta sp pentru intrarea DoOnStack

    lda #mPageErase ;model de mască pentru comanda de ștergere a paginii
    bsr DoOnStack ;comandă de finalizare de la sub baza de stivă
    rts
    ;**************************************************************
    FlashProg: psha ;salvați temporar datele de intrare
    lda #(mFPVIOL+mFACCERR) ;mască
    sta FSTAT; anulează orice comandă și șterge erorile
    lda #mByteProg ;model de mască pentru comanda byte prog
    bsr DoOnStack ;execută codul de prog din stiva RAM
    ais #1 ;dealocarea locației datelor din stivă
    rts
    ;**************************************************************

    De asemenea, în textul codului programului în C este necesar să se directive #include fișier de conectare doonsstack.h, al cărui text este prezentat mai jos.


    /* */
    /* Numele proiectului: doonstack.h */
    /* Ultima modificare: 04/11/2004 */
    /* De către: r60817 */
    /* */
    /* */
    /**********************************************************************/
    /* */
    /* Descriere: MC9S08GB60_FLASH_DOONSTACK - demo */
    /* */
    /* */
    /* Documentație: MC9S08GB60/D Rev. 2,2 */
    /* HCS08RMv1/D Rev. 1(4.8Exemple de aplicații FLASH) */
    /* */
    /* Acest software este clasificat ca Software Sample de inginerie. */
    /* */
    /**********************************************************************/
    /* */
    /* Serviciile efectuate de FREESCALE în această chestiune sunt efectuate CA ESTE */
    /* și fără nicio garanție. CLIENTUL își păstrează decizia finală */
    /* raportat la designul și funcționalitatea totală a produsului final. */
    /* FREESCALE nici nu garantează și nici nu va fi tras la răspundere de către CLIENT */
    /* pentru succesul acestui proiect. FREESCALE RENUNȚĂ TOATE */
    /* GARANȚII, EXPRESE, IMPLICITE SAU STATUTARE INCLUSIV, DAR NU */
    /* LIMITAT LA GARANȚIA IMPLICITĂ A VANZĂBILITĂȚII SAU ADEVĂRII PENTRU O */
    /* SCOP PARTICULAR PRIVIND ORICE CONSULTARE HARDWARE, MINERU SOFTWARE FURNIZAT */
    /* LA PROIECTUL PE FREESCALE SAU NU PRODUSUL REZULTAT DIN */
    /* SERVICII FREESCALE . ÎN NICIO CAZ FREESCALE NU VA FI RESPONSABIL PENTRU */
    /* DAUNE INCIDENTALE SAU CONSECUȚIONALE DERIVATE DIN ACEST ACORD. */
    /* */
    /* CLIENTUL este de acord să țină FREESCALE inofensiv împotriva oricăror */
    /* revendică cereri sau acțiuni ale oricui din cauza oricărei daune sau */
    /* vătămare, fie comercială, contractuală sau sinuoasă, în creștere */
    /* direct sau indirect ca urmare a sfaturilor sau asistenței */
    /* a furnizat CLIENTUL în legătură cu produse, servicii sau bunuri */
    /* furnizat în temeiul prezentului acord. */
    /* */
    /**********************************************************************/
    /*
    - acest fișier API între main.c și doonstack.asm
    */
    #ifndef _doonsstack
    #define_doonstack
    #ifdef __cplusplus
    extern "C" ( /* funcțiile noastre de asamblare au convenția de apelare C */
    #endif
    void DoOnStack(void); /* prototip pentru rutina DoOnStack */
    void FlashErase(unsigned char *); /* prototip pentru rutina FlashErase */
    /* Comanda de ștergere a paginii */
    void FlashProg(unsigned char *, unsigned char); /* prototip pentru rutina FlashProg */
    /* Comanda programului octet */
    #ifdef __cplusplus
    }
    #endif

    #endif /* _doonsstack */
    /**********************************************************************/

    În exemplul nostru, un bloc de 512 octeți este rezervat pentru înregistrarea datelor nevolatile. Această dimensiune a blocului a fost aleasă deoarece este cantitatea minimă de celule de memorie flash permisă pentru ștergere în microcontrolerul MC9S08QG8. Blocul selectat va fi situat la începutul spațiului de adrese al memoriei flash rezidente a MK: de la 0xE000 la 0xE1FF. Codul programului va începe la adresa 0xE200 și poate ocupa spațiu de adresă până la 0xFFFF.

    Pentru a implementa plasarea intenționată a datelor și a codurilor de program, ar trebui să modificați setările linkerului din fișier proiect.prm.

    În proiectul standard a existat o intrare:


    ROM = READ_ONLY 0xE000 TO 0xFFAD;

    Ar trebui inlocuit:

    SEGMENTE /* Aici sunt listate toate zonele RAM/ROM ale dispozitivului */
    ROM = READ_ONLY 0xE200 TO 0xFFAD;

    În exemplul nostru, se folosește și modul de protecție la scriere al zonei de cod de program, adică. spațiu de adrese de la 0xF200 la 0xFFFF. În fig. Figura 12.4 prezintă procesul de generare a codului pentru registrul FPROT, care protejează spațiul de adrese 0xF200...0xFFFF de ștergerea/scrierea accidentală. Cei mai semnificativi șapte biți ai ultimei adrese 0xF1FF a spațiului de adrese neprotejat trebuie să fie scriși în registrul FPROT.

    Abordare A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
    0xE1FF 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1
    FPROT FPS7 FPS6 FPS5 FPS4 FPS3 FPS2 FPS1 FPDIS
    0xE0 1 1 1 0 0 0 0 0

    Orez. 12.4. Generarea unei intrări de cod de securitate pentru registrul FPROT.

    Exemplul 12.1. Operații cu date nevolatile în memoria flash

    // Placă demonstrativă DEMO9S08QG8
    // șterge/scrie/citește memoria flash rezidentă
    #include /* pentru macrocomanda EnableInterrupts */
    #include "derivative.h" /* include declarații periferice */
    #include "hcs08.h" /* Acesta este fișierul nostru de declarație! */
    #include „doonstack.h”
    #define BUSCLK 8000000
    #define vFCDIV (BUSCLK/200000-1)
    char fdata, operare;
    unsigned int faddress;
    // Atribuiți o zonă de adrese protejată la scriere: de la 0xE200 la 0xFFFF
    const byte NVPROT_INIT @0x0000FFBD = 0xE0;
    // Inițializarea MK
    void mcu_init(void)
    {
    SOPT1 = bBKGDPE; // Activați funcția de linie de depanare BKGD
    ICSSC = NV_FTRIM; // Scrieți valoarea de tăiere FTRIM
    ICSTRM = NV_ICSTRM; // Scrieți valoarea TRIM trim
    ICSC2 = 0; // ICSOUT = DCOOUT / 1
    // BUSCLK = 8 MHz
    FCDIV = vFCDIV; // Scrieți valoarea codului divizor pentru frecvența FCLK
    // (FCLK = 200 kHz)
    }
    #pragma inline
    // Funcție pentru citirea unui octet dintr-o celulă de memorie cu o adresă dată
    char flash_read (adresă int nesemnată)
    {
    unsigned char *pointer;
    pointer = (car*) adresa;
    return (*pointer);
    }
    // Funcție pentru scrierea unui octet într-o celulă de memorie cu o adresă dată
    char flash_write (adresă int nesemnată, date char nesemnate)
    {
    unsigned char *pointer;
    pointer = (car*) adresa;
    FlashProg(pointer,date); // Apelați funcția de programare flash
    dacă (FSTAT_FACCERR) date=1; else data=0;
    if (FSTAT_FPVIOL) date|=2;
    returnare(date);
    }
    // Funcție pentru ștergerea unui bloc specificat în zona de memorie flash
    unsigned char flash_sector_erase (adresă int nesemnată)
    {
    unsigned char *pointer, res;
    pointer = (car*) adresa;
    FlashErase(pointer);
    dacă (FSTAT_FACCER) res=1; else res=0;
    if (FSTAT_FPVIOL) res|=2;
    returnare(res);
    }
    void main(void)
    {
    mcu_init();
    fdata = 0;
    faddress = 0xE000;
    operare = 0;
    în timp ce (1)
    {
    comutator (operare)
    {
    cazul 1: // Șterge bloc
    fdata = flash_sector_erase(faddress);
    operare = 0;
    pauză;
    cazul 2: // Scrie un octet
    fdata = flash_write(faddress,fdata);
    operare = 0;
    pauză;
    cazul 3: // Citiți octetul
    fdata = flash_read(faddress);
    operare = 0;
    pauză;
    }
    }
    }

    Să luăm în considerare metodologia de testare a codului de program din Exemplul 12.1. Pentru a face acest lucru, în fereastra de depanare Date hai sa adaugam trei variabile: faddress, fdata, Operațiune. De asemenea, vom seta fereastra în modul de actualizare periodică, de exemplu, la fiecare 200 ms.

    Înainte de a rula codul programului, scrieți-l într-o variabilă faddress adresa pentru scriere și într-o variabilă fdata— octetul de date de scris. Lângă variabilă Operațiune notează codul 0x02. După rularea codului exemplu, va începe să scrie un octet de date în celula de memorie flash selectată. Vă rugăm să rețineți că celula selectată trebuie să fie într-o stare ștearsă, de ex. ar trebui să conțină codul 0xFF.

    Pentru a șterge blocul de memorie 0xE00...0xE1FF, scrieți la faddress orice adresă din intervalul specificat și setați variabila Operațiuneîn 1. Apoi, rulați din nou codul pentru execuție.

    Citirea datelor din memoria flash este, de asemenea, ușoară. Pentru a face acest lucru, scrieți în variabilă faddress codul adresei, într-o variabilă Operațiune- cod 0x03. Conținutul celulei de memorie flash selectată va fi afișat în variabilă fdata după executarea codului programului.

    Vă rugăm să rețineți că funcțiile flash_write()Și flash_sector_erase() returnează o variabilă de tip muncă de sezon cu un cod de eroare la efectuarea acțiunii: 0 - nu a fost nicio eroare, 0x02 - a existat o eroare de acces, 0x04 - a existat o încercare de ștergere/scriere a spațiului de adrese protejat. Ambele funcții menționate mai sus necesită aproximativ 35 de octeți de memorie stivă pentru a fi executate. Dacă suprafața reală a stivei este mai mică, va apărea o eroare fatală. Va fi posibil să restabiliți funcționalitatea programului numai prin resetarea MK.

    Pentru a vedea modificările flash în depanator, trebuie să faceți unele modificări la configurația debugger. Urmând setările implicite, depanatorul citește zona de memorie flash MCU o singură dată după începerea unei sesiuni de depanare. Pentru a modifica configurația, selectați opțiunea din meniul principal de depanare MultilinkCyclonPro > Depanare hartă memorie. Se va deschide fereastra prezentată în fig. 12.5, a. Selectați în această fereastră bloc de memorie 3și apăsați butonul Modificare/Detalii. În noua fereastră prezentată în Fig. 12.5, b, selectați opțiunea marcată. Acest lucru va permite depanatorului să actualizeze periodic fereastra de memorie.

    Orez. 12.5. Modificați configurația depanatorului pentru a actualiza periodic conținutul ferestrei de memorie.