Teknologian jakaminen

STM32-kaatumisongelmien vianmääritys

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Esipuhe

Äskettäin huomasin, että sulautettuani joitakin koodeja muilla alustoilla STM32:een, tapahtui kaatumisongelma, joten halusin selvittää STM32:n kaatumisongelmien vianmäärityksen periaatteet.

1. Ongelman kuvaus

Lisää kuvan kuvaus tähän
Yllä oleva on osa kaatumistulostustietoa Tutkinnan jälkeen havaittiin, että FreeRTOS:n ajastinpinon syvyys oli asetettu liian pieneksi ei päästetty ajoissa, ja lopulta tapahtui kolari.

Puhutaanpa ajastimesta FreeRTOSissa. Se voidaan itse asiassa ymmärtää tehtävänä, joka vastaa säikeen luomista ajan säilyttämiseksi ja sitten nykyisen ajastinluettelon kyselyä selvittääkseen, mikä ajastimen käyttöaika on umpeutunut se.

Siksi ajastimen käyttämä muistin koko on myös määritettävä.

2. STM32-rekisterit (Cortex M4 -ydin)

Lisää kuvan kuvaus tähän
R0~R12 ovat yleiskäyttöisiä rekistereitä

R13 on pinoosoitin, ja fyysisesti pinoosoittimia on kaksi:Pääpinoosoitin (MSP) on oletuspinoosoitin, joka valitaan käytettäväksi nollauksen jälkeen, ja kun prosessori on käsittelytilassa, toinen pinoosoitin on prosessipinoosoitin (PSP), jota voidaan käyttää vain säikeessä tila (kun on RTOS) )

R14 on linkkirekisteri (LR), jota käytetään palautusosoitteen tallentamiseen, kun funktiota tai aliohjelmaa kutsutaan. Toiminnon tai aliohjelman lopussa ohjelman ohjaus voi palata kutsuvaan ohjelmaan lataamalla LR:n arvon ohjelmalaskuriin (PC) ja jatkamalla suoritusta Poikkeuskäsittelyn aikana LR päivitetään automaattisesti erityiseksi EXC_RETURN (poikkeuspalautus). ) arvo.

Esimerkiksi a kutsuu b Tällä hetkellä alifunktion osoite sijoitetaan PC-osoittimeen, ja a:n osoite sijoitetaan LR:ään PC-osoitin suoritusta varten.

3. Törmäysongelmien analyysi

3.1 Mistä kaatumistiedot ovat peräisin?

Kaatuminen käsissä on itse asiassa epänormaali keskeytys Kun keskeytys tulee, prosessori tallentaa nykyisen tehtävän tilan pinoon.

  • pinokehys
    Lisää kuvan kuvaus tähän
    Pinokehys viittaa muistialueeseen, jota käytetään toimintoparametrien, paikallisten muuttujien, palautusosoitteiden ja muiden tietojen tallentamiseen funktiokutsun aikana.

    Kun funktiota kutsutaan, STM32 varaa sille pinokehyksen Pinokehyksen koko riippuu tekijöistä, kuten parametrien määrästä, paikallisten muuttujien määrästä ja kääntäjän optimointiasetuksista.

    Yhdistämällä yllä olevat tiedot voimme tietää, että jos haluamme saada selville, mikä toiminto kaatui, kun toiminto kaatui, meidän on löydettävä pinokehys, joka työnnettiin pinoon, kun poikkeuskeskeytys laukaistiin, ja tämä pinokehys on R13:ssa. (Pinopiste) pinoosoitin Tallennettu.

    Löydämme tavan saada R13-rekisterin osoittimen osoittama sisältö kaatumisenkäsittelyfunktiossa HardFault_Handler() ja tulostaa sen sitten.

3.2 Jokaisen avainsanan merkitys kaatumistiedoissa

STM32-mikro-ohjain käyttää ARM Cortex-M -ydintä, jossa on kaksi pinoosoitinta, joista toinen on pääpinoosoitin (MSP) ja toinen on prosessipinoosoitin (PSP).

MSP (Main Stack Pointer): Pääpinon osoitinta käytetään pääasiassa käyttöjärjestelmän ytimen tai keskeytyspalvelurutiinin yhteydessä.

PSP (Process Stack Pointer): Prosessipinon osoitinta käyttävät pääasiassa käyttäjäsovellukset.

Kun Cortex-M-ydin palaa säietilaan, se voi vaihtaa takaisin pääpinoosoittimeen MSP tai prosessipinoosoittimeen PSP CONTROL-rekisterin asetusten mukaisesti.

PSP tallentaa käynnissä olevaan käyttäjäsovellukseen liittyvän kontekstin. Sisällytä erityisesti seuraavat:

一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。

Program Counter(PC):指向下一条将要执行的指令。

Processor Status Register(PSR)的值:包含标志位状态。

Pinoosoitin: Tallentaa edellisen pinokehyksen sijainnin.

Yleensä tehtäviä vaihdettaessa (tai kontekstin vaihtamisessa) nämä tiedot tallennetaan pinoon Kun uusi tehtävä alkaa, sen kontekstitiedot palautetaan pinosta.

On huomattava, että tietty tallennettu sisältö vaihtelee tietyn aikataulutusstrategian ja käyttöjärjestelmän suunnittelun mukaan.

3.3 Käytä kaatumistietoja löytääksesi pisteen, joka aiheutti kaatumisen

Määritä LR/PC-osoittimen arvo
Lisää kuvan kuvaus tähän
Ensin meidän on määritettävä, käytetäänkö RTOS:a, niin kaatumistietomme tulee tallentaa PSP:hen.
Meidän on ensin luettava nämä tiedot, ja sitten kun tiedämme LR:n ja PC:n arvot, voimme löytää kaatumiskohdan Debugin kautta keil5:ssä tai löytää vastaavan kaatumiskohdan käännösprosessin aikana luodun karttatiedoston kautta.
Lisää kuvan kuvaus tähän

3.4 Ongelmapisteiden löytäminen keil5:n osoitteiden perusteella

Napsauta hiiren kakkospainikkeella Purkaminen-ikkunaa -