I want to implement an interrupt vector table with using Nim only.

My code:
    
    
    proc main() {. importc .}
    
    const weakAttr = "__attribute__((weak)) $# $#$#"
    
    proc ResetHandler()      {. exportc, codegenDecl: weakAttr .} = main()
    proc NMIHandler()        {. exportc, codegenDecl: weakAttr .} = discard
    proc HardFaultHandler()  {. exportc, codegenDecl: weakAttr .} = discard
    ...
    
    let isrVector {. exportc: "_isrVector" .} = [
      ResetHandler,
      NMIHandler,
      HardFaultHandler,
      ...
    ]
    
    
    Run

expected array in ROM: 
    
    
    N_LIB_PRIVATE NIM_CONST tyArray__oXFh4MvEDAk4hEbFQSH7yQ _isrVector = {
      ResetHandler,
      NMIHandler,
      HardFaultHandler
    ...
    };
    __attribute__((weak)) void ResetHandler(void) { main(); }
    __attribute__((weak)) void NMIHandler(void) { }
    __attribute__((weak)) void HardFaultHandler(void) { }
    ...
    
    
    Run

but got a runtime initialization of the array in RAM:
    
    
    N_LIB_PRIVATE tyArray__eT4n0wdQ8ecm15lH5Od2Ag _isrVector;
    
    __attribute__((weak)) void ResetHandler(void) { main(); }
    __attribute__((weak)) void NMIHandler(void) { }
    __attribute__((weak)) void HardFaultHandler(void) { }
    ...
    
    N_LIB_PRIVATE N_NIMCALL(void, 
atmstm32f303ccatsstartupdotnim__startupInit000)(void) {
      _isrVector[0] = ResetHandler;
      _isrVector[1] = NMIHandler;
      _isrVector[2] = HardFaultHandler;
      ...
    }
    
    
    Run

Reply via email to