Pixhawk용 Daemon 만들기

px4에서 application을 만드는 방법은 http://dev.px4.io/tutorial-hello-sky.html 에서 다루고 있다.

px4는 보통 서비스나 앱을 daemon의 형태로 만들고 있다. px4 firmware에서 데몬으로 만들어진 앱은 다음 링크에서 볼 수 있다.

그러면 daemon은 무엇인가? application은 유저가 쉘에서 직접 실행을 해주어야 한다. daemon은 유저가 shell에서 직접 실행하지 않고도 백그라운드로 실행하고 앱을 켜고 끌 수 있다.

Daemon app example

다음은 examples폴더안에 있는 daemon 앱 예제코드 이다. 이코드를 보면서 데몬앱의 구조를 알아보자.

px4_daemon_app_main.c

daemon 관리

px4_daemon_app_main 함수는 데몬을 관리한다. 이 함수에는 데몬을 만들고 실행, 끝, 상태등을 볼 수 있는 기능을 넣는다.

int px4_daemon_app_main(int argc, char *argv[])
{
        if (!strcmp(argv[1], "start")) {

        if (thread_running) {
            warnx("daemon already runningn");
            return 0;
        }

        thread_should_exit = false;
        daemon_task = px4_task_spawn_cmd("daemon",
                         SCHED_DEFAULT,
                         SCHED_PRIORITY_DEFAULT,
                         2000,
                         px4_daemon_thread_main,
                         (argv) ? (char *const *)&argv[2] : (char *const *)NULL);
        return 0;
    }

    if (!strcmp(argv[1], "stop")) {
        thread_should_exit = true;
        return 0;
    }
}

px4_task_spawn_cmd 함수는 데몬(px4_daemon_thread_main 함수)을 만들고 실행한다.

daemon_task = px4_task_spawn_cmd("daemon",
        SCHED_DEFAULT,
        SCHED_PRIORITY_DEFAULT,
            2000,
        px4_daemon_thread_main,
        (argv) ? (char *const *)&argv[2] : (char *const *)NULL);

앱 로직

px4_daemon_thread_main에는 앱(비즈니스 로직) 코드가 들어간다.

int px4_daemon_thread_main(int argc, char *argv[]) 
{
      while(true){
              sleep(10);
              if(thread_should_exit)  break;
      }
      return 0;
}

Daemon 실행 및 관리

데몬 실행도 어플리케이션처럼 NSH에서 실행시키고 끌 수 있다.

NSH> px4_daemon_app start

현재 데몬이 실행되어 있는지 프로세스 리스트를 보자. 잘 보이죠?

NSH> top 

부팅할때 데몬 실행하기.

px4가 부팅될때 데몬을 실행하고 싶을때는 ROMFS안에 있는 rc init 스크립트이나 px4_daemon_app start 추가하거나 sd카드안에 /fs/microsd/etc/rc.txt 파일에 px4_daemon_app start를 추가하면 된다.

https://github.com/PX4/Firmware/blob/master/ROMFS/tap_common/init.d/rcS

[Pixhawk] Daemon App 만들기

Leave a Reply

Your email address will not be published. Required fields are marked *