( apal | 2024. 04. 22., h – 08:56 )

Mar anno jopar eve leszedtem innen-onnan a szukseges fileokat es ezeket hasznalom mindenhol. Igen, ugy latom en is hogy azota tenyleg egy kicsit atrendeztek, de azert relative konnyen osszeszedheto most is ha tudjuk mit kell keresni. Konkretan:

  • Innen le tudod szedni ezt a STM32F0xx standard peripherals library nevu dolgot.
  • Ebben a *.zip-ben a
    • ./STM32F0xx_StdPeriph_Lib_V1.6.0/Libraries/CMSIS/Include alkonyvtarban vannak a CMSIS-es headerek, es a 
    • ./STM32F0xx_StdPeriph_Lib_V1.6.0/Libraries/CMSIS/Device/ST/STM32F0xx/Include konyvtarban vannak az ST32F0xx specifikus headerek
  • A nagyon "bare metal" programozashoz a tobbi lenyegtelen.
  • Ezt a ket konyvtarat masold be valahova (nekem omlesztve vannak egy konyvtarba), az legyen benne az -I... include search path-ba
  • A forrasfileok-ba eleg csak az <stm32f0xx.h>-t behuznod, az maga utan rantja a tobbit (azaz CMSIS-es headereket, mint pl a core_m0.h meg az egyeb absztrakcios headereket mint a core_cmInstr.h meg ilyesmik, amikbe a rendszerszintu utasitasokhoz /barrier-ek, wait-for-interrupt, stb/ tartozo makrok vannak)

A "nagyon bare metal" az itten azt jelenti hogy a periferiakhoz tartozo definciokat (azaz a periferia-objektumokat illetve azok cimtartomanyait) megkapod - felteve ha a forditaskor definialod azt hogy milyen MCU-val dolgozol, esetedben a -DSTM32F051 kapcsolo az kell - de az fontos hogy ezeken felul semmi mast nem kapsz meg. Azaz ami itten hianyzik meg a teljes build folyamathoz, az a 

  • execution startup rutinok (crt0) es a
  • linker script

En ezt a kettot mindig magamnak szoktam megirogatni meg modositgatni ha kell (marpedig kell, pl bootloader-ekhez meg ilyesmikhez), de kiindulasnak a bundle-ban levo fileok is jok. Azaz lasd:

  • ./STM32F0xx_StdPeriph_Lib_V1.6.0/Libraries/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f051.s, illetve 
  • ./STM32F0xx_StdPeriph_Lib_V1.6.0/Projects/STM32F0xx_StdPeriph_Templates/TrueSTUDIO/STM32F051/STM32F051R8_FLASH.ld.

Sot, vsz alapszintu hasznalatre ezek jobbak is azert mint a full sajat :) De a sajat valtozatok is kb 50-50 sorosak (mind a crt0.c, mind a main.ld), szoval akar ide is be tudom masolni ha erdekel :] Ha sajat exectuion startup rutinokat hasznalsz, akkor a linkelest a -nostartfiles opcioval kell csinalnod, de azt leszamitva nincs (erdemi) kulonbseg a ket folyamat kozott. 

Szerk: a gcc es/vagy libc (itt: newlib, picolibc) is tartalmazhat mindenfele implementaciokat execution startup-ra illetve linker scriptre, de jo kerdes hogy ezzel mennyire jarsz jol... szoval itt talan inkabb a gyarto es/vagy MCU-specifikus implementaciokat erdemes alapul venni, de ketsegtelen hogy bizonyos, jobban egyesegesitett architekturaknal (pl RISC-V) mar a libc specs-ben hivatkozott megoldasok is jok lehetnek. Tapasztalat az az hogy az ARM az sajnos nem ennyire egysegesitett.