Hallo zusammen, In einem Anflug von Sicherheitsbewusstsein dachte ich mir, man könnte die MPU auch ohne OS ganz sinnvoll verwenden. Mein Ziel wäre es, zumindest mal das RAM gegen Codeausführung zu Sperren und im RAM einen am Ende des Stacks ein paar Byte gegen jedweden Zugriff zu sperren (zur Erkennung des Stack-Overflow) ST schweigt sich zur MPU ziemlich aus (bzw vielleicht finde ich es ganz einfach nicht). Und die Doku bei ARM stiftet bei mir eher mehr Verwirrung und verwendet zudem noch Assembler für die Beispiele. Allerdings ist es das erste mal, dass ich überhaupt eine MPU in nem Controller zur Verfügung hab, insofern kann's auch an meinen mangelnden Vorkenntnissen liegen... Gibts irgendwo einen einfachen Samplecode mit ein paar verständlichen Erleuterungen? Schon mal Dank im voraus. Hannes
Gegenfrage, hat der STM32 überhaupt eine MPU ? Ich denke die gibts nur bei manchen Cortex M3 Typen optional, sonst wär das Ding ja im Datenblatt angegeben. Aber Interessant ist es auch für mich zu wissen, welcher Chip eine MPU hat, da ich Sicherheitsaplicationen mache. Gruß Sascha
>>Sicherheitsaplicationen
welch grauslich denglisches Wort - dazu falsch geschrieben...
Alle neueren STM32 haben eine MPU. Namentlich also F103F/G (XL Density), STM32L und STM32F2xx. Mittlerweile hab ich auch rausgefunden, wie das Teil funktioniert. Falls es mal jemand braucht, hier mal as Schützen des RAM gegen Ausführung von Code (getestet auf F205E und F103F): // Disable MPU MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; // Region #0: No code execution in SRAM: MPU->RNR = 0; MPU->RBAR = SRAM_BASE; // startaddress of SRAM MPU->RASR = (0x10UL << MPU_RASR_SIZE_Pos) // region size: 128kb (b10000 = 0x10) | (0x03UL << MPU_RASR_AP_Pos) // R/W access allowed | MPU_RASR_XN_Msk // set XN bit | MPU_RASR_ENA_Msk; // enable region // Enable the memory fault exception SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; // Enable MPU MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;
Ups... kleines Formatierungsproblem: Das (b10000 = 0x10) gehört noch zum Kommentar der Zeile darüber.
So sieht das dann in der dafür gedachten Code-Umgebung aus :-)
1 | // Disable MPU
|
2 | MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; |
3 | |
4 | // Region #0: No code execution in SRAM:
|
5 | MPU->RNR = 0; |
6 | MPU->RBAR = SRAM_BASE; // startaddress of SRAM |
7 | MPU->RASR = (0x10UL << MPU_RASR_SIZE_Pos)// region size:128kb (b10000=0x10) |
8 | | (0x03UL << MPU_RASR_AP_Pos)// R/W access allowed |
9 | | MPU_RASR_XN_Msk // set XN bit |
10 | | MPU_RASR_ENA_Msk; // enable region |
11 | |
12 | // Enable the memory fault exception
|
13 | SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; |
14 | |
15 | // Enable MPU
|
16 | MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk; |
Sehr schön. Danke schön! Ich werd's mir merken. Und mich bei Gelegenheit vielleicht sogar mal hier anmelden...
Hallo Hannes, in welcher PDF von ST ist die Doku zu finden ? Ich kenne bis jetzt nur die MMU vom ARM926EJS, die ich schon mehrfach für Betriebssysteme verwendet habe. Und jetzt muss ich auf einem Cortex M3 etwas zaubern, na wenigstens MPU !!! Bei ST ist es etwas schwieriger gleich an die PDF zu kommen. Danke, Gruß Sascha PS. an derapplikator, danke für die Info, zum GLÜCK muss ich mein Geld nicht mit Deutsch verdienen.
Sascha P. schrieb: > in welcher PDF von ST ist die Doku zu finden ? Cortex M3 Programming Manual, PM0056. Ist nicht unter den References sondern folgerichtig unter "Programming Manuals" zu finden, wo man sonst nur die Flash Programmierung sucht. Aber Achtung: In den meisten 101/102/103 Typen, denen unterhalb XL Density (Suffix-F/G), ist die MPU nicht enthalten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.