Wio Terminal의 TOPPERS/ASP 커널 : Getting started

몇 년 전에 R2CA을 개발했지만 Arduino M0이 디스콘이되어 개발을 중지했습니다.

Arduino M0에 가까운 Wio Terminal이 출시되어 라이브러리를 보면 FreeRTOS의 Arduino 라이브러리이 있다는 것을 알고 코드를 읽으면 ASP 커널에서도 할 수 있다고 생각 작성했습니다.

Wio Terminal용 Arduino 환경 설치



Seeed wiki을 참조하여 Arduino 환경과 라이브러리를 설치하여 Blink가 작동하는지 확인하십시오.

ArduinoIDE는 1.8.6 이상이 필요합니다.

하드웨어 설정 (선택 사항)



UART를 통해 콘솔을 출력하려면 적용 가능한 USB-UART을 후면 확장 커넥터의 다음 핀에 연결하십시오.


단자 번호
기능


6
GND

8
TXD

10
RXD




라이브러리 설치



여기에서 최신 릴리스의 ZIP 파일을 다운로드하십시오.

Arduino IDE를 시작하고 스케치 -> 라이브러리 포함 -> .ZIP 형식 라이브러리 설치를 선택합니다.



파일 대화 상자가 표시되므로 다운로드 한 ZIP 파일을 지정하여 설치합니다.

샘플 실행



ArduinoIDE 파일 -> 스케치 예제 -> ToppersASP -> ToppersASP_Blink를 선택하여 샘플을로드합니다.
  • Wio Terminal의 USB 단자와 PC를 접속한다.
  • 마이크로 컴퓨터 보드에 쓰기를 선택하여 씁니다.

  • 터미널 에뮬레이터 연결
  • Wio Terminal의 USB 단자를 통한 COM 포트
  • USB UART를 통한 COM 포트 (선택 사항)

  • 실행
  • Wio Terminal의 USB 단자를 통해 COM 포트에 터미널 에뮬레이터를 연결하면 실행이 시작됩니다.


  • 코드 해설



    ToppersASP_Blink는 다음 세 가지 작업을 수행합니다 (정확하게는 로그 작업을 추가하여 네 개).
  • task1()
  • task2()
  • loop()

  • setup()



    이하의 내용을 기재한다.
  • USBUart 초기화 (선택 사항)
  • 반드시 샘플과 동일한 순서로 기재한다.

  • 기타 초기화(선택 사항)
  • 포트의 초기화 등을 기재한다.

  • 커널 시작
  • StartToppersASP ()를 호출하면 커널이 시작됩니다.


  • 커널 객체 초기화(user_inirtn())



    커널 시작 후 호출됩니다. 커널 객체의 초기화 처리를 설명한다.
    이러한 서비스 호출은이 함수 내에서 마실 수 있습니다.
        ER  cre_tsk(ID tskid, const T_CTSK *pk_ctsk);
        ER  cre_sem(ID semid, const T_CSEM *pk_csem);
        ER  cre_flg(ID flgid, const T_CFLG *pk_cflg);
        ER  cre_dtq(ID dtqid, const T_CDTQ *pk_cdtq);
        ER  cre_pdq(ID pdqid, const T_CPDQ *pk_cpdq);
        ER  cre_mbx(ID mbxid, const T_CMBX *pk_cmbx);
        ER  cre_mpf(ID mpfid, const T_CMPF *pk_cmpf);
        ER  cre_cyc(ID cycid, const T_CCYC *pk_ccyc);
        ER  cre_alm(ID almid, const T_CALM *pk_calm);
        ER  cfg_int(INTNO intno, const T_CINT *pk_cint);
        ER  att_isr(const T_CISR *pk_cisr);
        ER  def_inh(INHNO inhno, const T_DINH *pk_dinh);
        ER  def_exc(EXCNO excno, const T_DEXC *pk_dexc);
    

    각 객체의 ID는 다음 값을 사용합니다. n은 1~10을 지정 가능. 10 개 이상의 객체를 사용하려면 ./doc/customize.txt를 참조하십시오.


    개체
    매크로


    작업
    TASKn

    세마포
    SEMn

    이벤트 플래그
    FLGn

    데이터 큐
    DTQn

    우선순위 데이터 큐
    PDQn

    사서함
    MBXn

    메시지 버퍼
    MBFn

    주기 핸들러
    CYCHDRn

    알람 핸들러
    ALMHDRn


    태스크 생성 예



    태스크를 생성하는 예는 다음과 같습니다.
    void
    user_inirtn() {
    
      T_CTSK  ctsk;
      ER    ercd;
    
      ctsk.tskatr = TA_ACT;
      ctsk.exinf = 1;
      ctsk.task = task1;
      ctsk.itskpri = 10;
      ctsk.stksz = 1024;
      ctsk.stk = NULL;
      ercd = cre_tsk(TASK1, &ctsk);
    
      ....
    }
    

    작업 본문의 설명은 일반 ASP 커널과 동일합니다. 작업 본문에서는 ASP 커널 API와 Arduino를 모두 호출 할 수 있습니다.
    void
    task1(intptr_t exinf)
    {
      int count = 0;
      while(1){
        syslog(LOG_NOTICE, "task1 is running. %d", count++);
        dly_tsk(1000);
      }
    }
    

    loop()



    loop () 함수는 ASP 커널의 최소 우선 순위 작업으로 실행됩니다. 작업 ID는 IDLE_TASK입니다.

    ToppersASP_Blink 소스 코드


    #include <ToppersASP.h>
    
    #define USE_SERIALUSB
    
    void setup() {
    #ifdef USE_SERIALUSB
      SerialUSB.begin(115200);
      ToppersASPDelayMs(1000);
      while (!SerialUSB);
    #endif /* USE_SERIALUSB */
    
      pinMode(LED_BUILTIN, OUTPUT);
    
      StartToppersASP();
    }
    
    void
    task1(intptr_t exinf)
    {
      int count = 0;
      while(1){
        syslog(LOG_NOTICE, "task1 is running. %d", count++);
        dly_tsk(1000);
      }
    }
    
    void
    task2(intptr_t exinf)
    {
      int count = 0;
      while(1){
        syslog(LOG_NOTICE, "task2 is running. %d", count++);
        dly_tsk(1000);
      }
    }
    
    void
    user_inirtn(void)
    {
      T_CTSK  ctsk;
      ER    ercd;
    
      ctsk.tskatr = TA_ACT;
      ctsk.exinf = 1;
      ctsk.task = task1;
      ctsk.itskpri = 10;
      ctsk.stksz = 1024;
      ctsk.stk = NULL;
      ercd = cre_tsk(TASK1, &ctsk);
    
      ctsk.task = task2;
      ercd = cre_tsk(TASK2, &ctsk);
      assert(ercd == E_OK);  
    }
    
    int loop_count;
    
    void loop() {
    #ifdef USE_SERIALUSB
      SerialUSB.print("loop: ");
      SerialUSB.println(loop_count++);
    #else /* USE_SERIALUSB */
        syslog(LOG_NOTICE, "loop is running. %d", loop_count++);
    #endif /* USE_SERIALUSB */
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);                       // wait for a second
      digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);                       // wait for a second
    }
    

    변경 내역


  • 2020/09/21
  • 신규 작성


  • 좋은 웹페이지 즐겨찾기