8IBUTSVOOJOHCFIJOEUIJT import SwiftUI // We start here @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } } } 8IBU)BQQFOT#FIJOE!NBJO
8IBUTSVOOJOHCFIJOEUIJT import SwiftUI // We start here @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } } } 8IBU)BQQFOT#FIJOE!NBJO
0x4000_0000 Peripherals 0xD000_0000 SIO 0xE000_0000 System UART Serial I2C Display PWM Sound, LED GPIO LED on/off SysTick Timer .FNPSZ.BQQFE*0 "MMDPOUSPMMFEUISPVHINFNPSZ >_ OLED CPU
SwiftUI / Foundation macOS / iOS Kernel Device Drivers Memory-Mapped I/O Bare Metal Your App No frameworks No OS No drivers Memory-Mapped I/O Display Network Storage Audio Sensors
initial value static let ledPin: UInt32 = 25 // non-zero initial value static var counter: UInt32 = 0 // zero initial value static var name: String? // nil = zero in memory ROM (Flash) .text (code) .data 0xD000_0000 25 ... .bss (size info only, no data stored) counter, name, ... ...
to RAM var src = dataOrigin var dst = dataStart while dst != dataEnd { dst.pointee = src.pointee dst = dst.advanced(by: 1) src = src.advanced(by: 1) } // Zero out the rest while dst != bssEnd { dst.pointee = 0 dst = dst.advanced(by: 1) } } JOJUJBMJ[F.FNPSZ4FDUJPOT $PQZBOE[FSP fi MM
to RAM var src = dataOrigin var dst = dataStart while dst != dataEnd { dst.pointee = src.pointee dst = dst.advanced(by: 1) src = src.advanced(by: 1) } // Zero out the rest while dst != bssEnd { dst.pointee = 0 dst = dst.advanced(by: 1) } } JOJUJBMJ[F.FNPSZ4FDUJPOT $PQZBOE[FSP fi MM @_extern(c, "__data_origin") var __data_origin: UInt8 @_extern(c, "__data_start") var __data_start: UInt8 @_extern(c, "__data_end") var __data_end: UInt8 @_extern(c, "__bss_end") var __bss_end: UInt8
clocks, GPIO, USB while true { let gpioState = board.buttons.poll() // Poll button states board.usb.poll() // Handle USB events if board.usb.configured { board.usb.sendXInputReport( // Send button states to host gpioState: gpioState ) } } } 4VQFS-PPQ 64#(BNF$POUSPMMFS
Render (I2C display) Game Logic Render Music Music Music Music Music Music Button Input Scheduler tasks Music (timer interrupt) Button Input (GPIO interrupt)
TDIFEVMFS r #VUUPOJOQVUOFFETJOTUBOUSFTQPOTF (1*0JOUFSSVQU r -JOFDMFBSBOJNBUJPOQFSJPEJD TDIFEVMFS (BNF$POUSPMMFSˠ4VQFSMPPQJTFOPVHI r 3FBECVUUPOTUBUFTQPMMJOHJT fi OF r 64##-&USBOTNJTTJPOTFOEPOTUBUFDIBOHF r /POFFEGPSDPNQMFYUBTLNBOBHFNFOU
r "GUFSNBJO JUTBMNPTUOPSNBM4XJGU r 1JDLUIFSJHIUEFTJHOQBUUFSO TVQFSMPPQTDIFEVMFSIZCSJE r 8SJUJOHFWFSZUIJOHJO4XJGUUPMFBSOIPXDPNQVUFSTBDUVBMMZXPSL ˠUIFQSJNBMKPZPGTPGUXBSFEFWFMPQNFOU