BASIC4MCU | 8051/PIC | DT-516 강좌 | 인터럽트 안에서 딜레이를 실행 하면 안된다?
페이지 정보
작성자 키트 작성일2017-08-23 14:26 조회1,776회 댓글0건본문
인터럽트는 각각의 주기와 인터럽트 함수 실행시간이 있습니다.
가장 짧은 인터럽트 주기를 찾으세요
모든 인터럽트 함수의 실행 시간을 더한 것이 가장 짧은 인터럽트 주기보다 빨라야 합니다.
위 조건을 만족 하면
어느 순간 모든 인터럽트가 겹치더라도 전부 깔끔하게 실행 됩니다.
그러기 위해서는 인터럽트 안에서 시간이 많이 걸리는 딜레이를 호출 한다거나
시간이 많이 걸리는 LCD루틴을 실행 한다거나 하는 일은 하지 않아야 합니다.
시리얼통신 보오레이트 115200이면
스타트비트,데이터8비트,스톱비트1 = 10비트이고
수신인터럽트 주기는 115200/10=11520비트마다 걸리게 됩니다.
1/11520 = 86.80556 us
다른 인터럽트가 없으면 갠찮지만 여러개의 인터럽트를 사용 한다면 상당히 짧은 시간입니다.
인터럽트 주기가 짧을 때에는 신경을 더 많이 써야 합니다.
시리얼 115200 인터럽트와
1ms 주기의 타이머 인터럽트를 사용 한다고 해보죠
두개의 인터럽트 실행 시간을 합한 것이 86us 보다 짧으면 신경 쓸일이 없지만
시리얼 인터럽트 실행 시간은 20us
타이머 인터럽트 실행 시간은 100us 라고 가정 해보죠
시리얼 수신 도중에 타이머 인터럽트가 걸리면
타이머 인터럽트 실행에 100us가 소요되므로 시리얼 수신데이터 1바이트를 못 받게 됩니다.
이경우 시리얼 인터럽트를 우선 순위 레벨로 지정 하면
타이머 인터럽트 실행 도중에 시리얼 인터럽트가 걸려도 시리얼수신 인터럽트 실행을 하게되므로 문제가 생기지 않습니다.
단 한개의 시리얼 수신 인터럽트를 사용 하더라도
시리얼 수신 인터럽트 주기가 86us인데
시리얼 수신 인터럽트의 실행 시간이 86us를 넘게되면 그 자체로 데이터를 못 받는 일이 발생 합니다.
(인터럽트 함수를 진입하고 빠져나가는데에도 시간이 조금씩 걸리는 것을 생각 해서 시간적인 여유가 있어야 합니다.)
속도가 빠른 ARM이라고 해도
115200의 시리얼 포트 8개를 처리 한다고 하면 (ARM중에 시리얼8포트 내장도 있습니다.)
86.80556 us / 8= 10.8506944 us
한개의 시리얼 처리를 10us에 완료 해야 하므로 만만한 작업이 아닙니다.
댓글 0
조회수 1,776등록된 댓글이 없습니다.