?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

질문 | 아두이노 스레드 관련 질문입니다.

페이지 정보

작성자 이지웅 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-09-02 13:38 조회1,842회 댓글7건

본문

안녕하세요^^

개편 전 홈페이지에서 아두이노 스레드 라이브러리인 mthread를 보았습니다.

저 예제코드에서는 loop가 하나인데. setup에서 5개의 스레드를 생성합니다.

스레드마다 각각 코드를 다르게 프로그램 하려면 구성은 어떻게 해야하는지 궁금합니다!

또한 esp8266을 리셋시키는 코드를

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("start!!");
}

void(*resetFunc)(void) = 0;

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("reset!");
  resetFunc();
  delay(1000); 
 
}

이런식으로 사용해도 될까요?

답변 주시면 감사하겠습니다.

 

-------------------------------------추가 질문입니다.

얼마 전 esp8266이 httprequest를 이용한 예제로 실행되다 멈춰버리는 현상이 생겨서 질문을 드렸었습니다.

그래서 위의 스레드를 구현하여서 하나의 스레드에서는 httpreqeust로 구동시키고 하나의 스레드에서는 millis()를 이용하여 응답이 없을 시 리셋 시키면 되겠다 생각해서 구현하였는데요.

구동을 시켜보니 loop 자체가 멈춰버리더군요. 정확히 어디 부분에서 멈추는지는 로그를 찍어서 확인해보려고 합니다. 가장 오래 유지될때는 2일정도, 가장 적게 될때는 몇초만에 멈춰버리기도 합니다..

원인을 찾아야 하는데요.

혹시 제가 개발환경을 arduinoIDE를 이용했는데 혹시 이것이 가상머신으로 돌아가 esp8266 자체를 돌리는 것이 버거운 것이 버거워 멈추는 것이 아닌지..

혹 개발환경을 이클립스로 바꾸면 이 문제가 해결될지 모르겠습니다.

답변 부탁드립니다!

 

------------------------------------추가질문입니다.

  while (client.available() == 0) {
    if (timeout - millis() < 0) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return false;
    }
  }

로그를 찍어서 어디 부분에서 멈추는지 보라고 하셨는데요.

위 타임아웃 코드에서 멈추는데... 답변부탁드립니다.

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

client.stop(); 부분에서 블로킹이 걸릴수도 있을것 같습니다.
가급적 쓰레드는 사용하지 마시고 시간에 따라서 메인루프 안에서 작업관리를 해주시는 것이 안정성 측면에서 더 좋을 것 같습니다. 쓰레드가.. 일반적인 OS에서 지원하는 쓰레드가 아니라서요...  그리고 ESP8266, 아두이노 모두 싱글 쓰레드로 동작하는데 WiFi 처리등을 위해서 이 쓰레드의 작업을 배분해서 사용합니다. (그래서 너무 많은 작업을 메인루프 안에서 하면 안됩니다. ESP8266 의 경우는 종종 delay() 함수로 멈춰줘야 한다고 합니다. 아두이노는 delay() 함수가 쓰레드도 멈춰기 때문에 쓸수 없고...) 쓰레드 라이브러리는 충돌을 일으킬수도 있을 것 같습니다.

이지웅님의 댓글

이지웅 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

그렇다면 일정주기로 esp를 delay시켜주어야 안정화 될까요?

현재 ESP가 get방식으로 변수 3개정도 전달합니다.
DHT11로 온습도 측정하여 더블형으로 보내구요.
하나는 millis로 int형 보냅니다.
시작할때 delay는 1000으로 줄였어요.
실험을 해보니 get전달할때는 금방 멈춰버립니다..
그런데 get방식 전달안하고 request만 했을시 멈추진 않는것 같습니다.(아직 실험중입니다)
문제가 여기에 있을까요?

아니면 client.stop이 블로킹 되는것을 어떻게 잡아야 하나요?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

아래 링크의 내용처럼 stop 외에 사용 가능한 다른 함수가 있는지 찾아보시고 적용해보세요.
http://bbs.espressif.com/viewtopic.php?t=1290
정확한 원인은 저도 잘 모르겠습니다. 여러 함수들을 사용해서 테스트를 해보셔야 할 것 같습니다. HTTP request를 주기적으로 하는 것 자체는 문제가 없어야 정상입니다.

이지웅님의 댓글

이지웅 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

계속 분석해보니 멈추는 부분을 찾은것 같아요.
현재 get방식으로 온습도값을 double 변수로 보내고 있는데 그쪽에서 멈추는듯 하구요.
온습도값을 전송하지 않을 때에는 멈추지 않더군요.
구글 검색을 해보니
http://blog.nyl.io/esp8266-led-arduino/
위 링크에 블로그를 해놓으신 분도 저와 같은 방식으로 했더라구요.
소스 차이가 무엇일까 보았더니
get방식으로 url 전송 후에 delay를 주는 것이 좀 달랐던것 같아요.
close가 아닌 keep-alive로 보내는 것도 좀 달랐구요.
정확한 원인이 무엇인지는 계속 찾아보고 있어요.

이지웅님의 댓글

이지웅 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

esp8266 멈추는 문제를 해결 했습니다^^

http://blog.nyl.io/esp8266-led-arduino/

위 사이트의 소스에 보면 HTTP REQEUST 예제를 활용한 것인데, 관리자님의 강의 소스와 조금 다른점이 있습니다.

client.print(String("GET ") + path + " HTTP/1.1\r\n" +
              "Host: " + host + "\r\n" +
              "Connection: keep-alive\r\n\r\n");

  delay(500); // wait for server to respond

위 부분은 서버에서 응답받는 타임을 delay(500)으로 주며 기다리고 받는데요.
위 처럼 소스를 수정하니 멈추지 않고 잘 동작하더군요.

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

결국 HTTP request 보낸 후에 응답을 받을 동안 약간 delay 가 필요했던 거네요. 그 전에 응답을 처리하고 하면 안되는거 같네요. 좋은 정보 감사합니다.