계산을 어디에서 넣을 수 있습니까?인터럽트 처리기 또는 메인 루프 내부?(임베디드 실시간 응용 프로그램)

StackOverflow https://stackoverflow.com//questions/9609882

문제

복합기 제어를위한 임베디드 응용 프로그램을 개발하고 ADC 숫자 값을 서명 한 물리적 값 (AMPS)으로 변환하는 일부 계산을 수행 할 수 있습니다.

인터럽트 핸들러에서 계산을 수행하거나 플래그가 설정되었을 때 전역 플래그를 설정하고 메인 루프에서 계산을 수행해야합니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

이에 대한 모든 답변이 없습니다.그것은 당신의 타이밍 요구 사항, 기존 인터럽트 하중 등에 따라 다릅니다.

상당히 간단한 곱하기 또는 뭔가가 있으면 인터럽트에서 그냥 수행하고 계속해서 이동할 것입니다.

당신이 무엇을하고 있는지 알고 있는지 확인하고 인터럽트에서 더 많은 시간을 보내지 마십시오.

다른 팁

인터럽트 처리기에서 할 수있는 작업이 적을수록 더 좋습니다.지금 당장 응용 프로그램에 큰 문제가 아닐 수도 있지만 시스템로드가 더 높을 때 시간이 올 것이므로 인터럽트를 처리하기 위해 다른 상위 우선 순위 작업을 유지하지 않으려합니다.전역 플래그를 설정하기보다는 세마포어와 적절한 멀티 스레딩을 살펴보고 싶을 수도 있습니다.

ADC 값으로하고 싶은 것과 수행 해야하는 속도에 따라 다릅니다. ADC 값을 기반으로 시간에 중요한 작업을 수행 해야하는 경우 인터럽트에서 해당하는 것을 처리해야합니다. 그러나 이것이 사실이라면 ADC 카운트에서 "실제"아날로그 값을 먼저 계산하는 비용을 절감하기 위해 ADC 카운트 측면에서 중요한 임계 값을 표현해야합니다.

ADC가 VOL 당 8 개 카운트를 출력하면 ADC가 1.5 볼트보다 큰 경우 비상 정지를 방출 해야하는 경우 인터럽트 코드를 작성하여 12 개 카운트에서 e- 스톱을 발사합니다. 그런 다음 사용자 친화적 인 단위를 사용자 인터페이스 목적으로 번역하기 위해 ADC 카운트를 메인 루프로 전달할 수 있습니다.

일반적인 원칙은 기한을 충족시킬 수있는 것을 보장하는 것입니다. 응용 프로그램과 모든 설정을 구조화하여 해당 마감일을 충족시키기 위해 가능한 한 쉽게 만들 수 있습니다. 무언가가 하드 마감일이 없으면 메인 루프 (일반적으로 다시)를 넣으십시오.

데이터 일관성은 생각할 것입니다.ADC (위치, 전압, 전류 등)에서 여러 가지 관련 값을 가져 오는 경우 일관된 세트로 작업하는지 확인하기 위해 무언가를 수행 할 수 있습니다.이는 백그라운드 업데이트가 ISR의 업데이트보다 낫다는 것을 의미 할 수 있습니다.알고리즘의 주어진 통과에 대한 단일 독서의 일관성조차도 중요 할 수 있습니다.이 배경 코드를 고려하십시오.

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top