arduino初探

  • 前后台系统
    • 初始化
    • 无限循环
void setup()
{}
void loop()
{}
  • 这相当于只开放了两个业务接口,那么main在哪里呢?
  • \hardware\arduino\avr\cores\arduino\main.cpp
int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif
    
    setup();
    
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
        
    return 0;
}
  • 透过这个过程看到还有init()以及initVariant()。init()可能是平台相关的初始化过程,已经编译好了在平台库中,initVariant()可以进行重写。
  • 另外,这是C++风格的
  • 系统的一些变量,常量,预定义对象等在这个目录下也可以找到一些,比如


    serialX
HardwareSerial Serial(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR);
HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1);
#if defined(UBRRH) || defined(UBRR0H)
  extern HardwareSerial Serial;
  #define HAVE_HWSERIAL0
#endif
#if defined(UBRR1H)
  extern HardwareSerial Serial1;
  #define HAVE_HWSERIAL1
#endif
#if defined(UBRR2H)
  extern HardwareSerial Serial2;
  #define HAVE_HWSERIAL2
#endif
#if defined(UBRR3H)
  extern HardwareSerial Serial3;
  #define HAVE_HWSERIAL3
#endif
  • 还有重要的一点,嵌入式系统需要一个链接文件来定义内存等
    \hardware\tools\avr\lib\gcc\avr\7.3.0\device-specs\specs-atmega2560可能是一些链接文件
*avrlibc_startfile:
    crtatmega2560.o%s

*avrlibc_devicelib:
    %{!nodevicelib:-latmega2560}

*cc1_n_flash:
    %{!mn-flash=*:-mn-flash=4}

*cc1_rmw:
    %{mrmw}

*cc1_errata_skip:
    %{!mskip-bug: -mno-skip-bug}

*cc1_absdata:
    %{mabsdata}

*cc1_absdata:
    %{mabsdata}

*asm_arch:
    -mmcu=avr6

*asm_relax:
    %{mrelax:--mlink-relax} 

*asm_rmw:
    %{mrmw}

*asm_errata_skip:
    %{!mskip-bug: -mno-skip-bug}

*link_pmem_wrap:


*link_relax:
    %{mrelax:--relax} 

*link_arch:
    %{mmcu=*:-m%*} 

*link_data_start:
    %{!Tdata:-Tdata 0x800200}

*link_text_start:


*self_spec:
    %{!mmcu=avr*: %<mmcu=* -mmcu=avr6} %<mshort-calls %<msp8
  • “导出已编译的二进制文件”编译链接后的文件在工程目录下可以找到格式是HEX

推荐阅读更多精彩内容