EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 2명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

임베디드! - MSP430 Timer 모드와, Nested Interrupt
글쓴이: EzDoum 글쓴날: 2006년 02월 27일 오전 12:13
하드웨어



msp430 타이머를 다루면서 생긴 논리적인 버그 탐색에 관한 글이다.


msp430에는 타이머가 두개가 있는데, 이걸 조합 하기에 따라서는 여러 주기의 타이머를 만들 수 있다. 대표적인 방법이 아래의 답장에 달린 코드 처럼 메인 타이머를 연속 모드로 설정을 하고 CCRx 레지스터를 인터럽트 루틴에서 덧셈을 해서 다음 인터럽트 주기를 설정해 줄 수 있다.

예제만 돌려보면 그리 복잡하지도 않고 적당히 이해가 되는 코드인데 실제 작업에서 이 코드를 적용하다보면 문제가 생긴다. 상황을 상상해 보자.

시스템 코어에 공급되는 MCLK을 타이머A의 클럭으로 사용을 하고, 모드는 contmode로 지정했다. 타이머 ISR에서 CCR1 레지스터를 += 16 으로 설정했다. 그리고 I/O PORT 인터럽트를 발생시켜 타이머A에서 주기적으로 증가하는 값을 사용한다고 하자.

이때 ioport쪽 ISR 이 짧다면 문제가 안된다. 하지만 ioport쪽 ISR에서 특정 조건에서 16clk이상 소요되는 코드가 들어간다면 CCR1에서 원하는 타이머의 주기가 안 만들어 지는 것이다. 왜냐면 MCLK가 공급되는한 CCR1과 비교를 하는 타이머 카운터 core의 동작과는 별개로 계속 증가를 할 것이고, CCR1 인터럽트가 발생을 못해 += 16이 안되었으니, 16비트 카운터 만큼 진행하는 동안은 ccr1 인터럽트는 발생하지 않게 된다.

문제를 더 어렵게 만든것이 나는 timerA의 인터럽트가 ioportB의 인터럽트 보다 우선순위가 높길래 당연히 nested interrupt가 적용되어 문제가 안 생길 줄 알았다. 하지만 메뉴얼을 읽어보면

Interrupt Nesting
Interrupt nesting is enabled if the GIE bit is set inside an interrupt service
routine. When interrupt nesting is enabled, any interrupt occurring during an
interrupt service routine will interrupt the routine, regardless of the interrupt
priorities.

GIE를 켜지 않으면 인터럽트가 발생하면 플래그가 셋팅되어 pending 되고 있다가 ISR에서 RETI 명령어로 반환이 되면 pending 된것들 중에 우선 순위가 높은 것부터 처리를 하는데, ISR 처리 중에 GIE가 켜져있으면 nesting은 되지만 우선 순위와 상관없이 interrupt가 발생한다고 하니 이것도 그리 바람직 한것은 아니네. 내가 설계를 했다면 지금 수행중인 ISR 보다 우선 순위가 낮은 녀석들은 pending하고 높은 것들에 대해서만 처리를 하게 했을텐데 구조를 쉽게 가져갈려고 지금 수행중인 인터럽트 소스를 기록하는 레지스터는 없고 단순히 플래그로만 표시하니까 지금과 같은 구조가 된듯 보인다.

그리고 ISR에거 명령어가 길어지만 문제가 발생하는 증상을 보고 명령어 처리에 대한 사이클 조사를 했는데, msp430의 경우엔 레지스터를 다루는 명령어들은 대부분 1클럭에 처리가 되지만 메모리 참조 같은 경우엔 클럭 효율이 심하게 떨어졌다.


[분류: 하드웨어 인쇄용 페이지 본문 email로 보내기 ]

<  노트북 모뎀으로 팩스 송수신 | 폴더 & 다중 업로드 자문 대화 내용  >
임베디드! - MSP430 Timer 모드와, Nested Interrupt | 답장: 1개 | 본문에 답장
정렬 :  
답장 EzDoum 2006년 02월 27일 오전 12:14 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
//******************************************************************************
//  MSP-FET430P140 Demo - Timer_A, Toggle P1.0-3, Cont. Mode ISR, 32kHz ACLK
//
//  Description: Use Timer_A CCRx units and overflow to generate four
//  independent timing intervals. For demonstration, CCR0, CCR1 and CCR2
//  output units are optionally selected with port pins P1.1, P1.2 and P1.3
//  in toggle mode. As such, these pins will toggle when respective CCRx
//  registers match the TAR counter. Interrupts are also enabled with all
//  CCRx units, software loads offset to next interval only - as long as
//  the interval offset is added to CCRx, toggle rate is generated in
//  hardware. Timer_A overflow ISR is used to toggle P1.0 with software.
//  Proper use of the TAIV interrupt vector generator is demonstrated.
//  ACLK = TACLK = 32kHz, MCLK = SMCLK = default DCO ~800kHz
//  //* An external watch crystal on XIN XOUT is required for ACLK *//
//
//  As coded and with TACLK = 32768Hz, toggle rates are:
//  P1.1= CCR0 = 32768/(2*4) = 4096Hz
//  P1.2= CCR1 = 32768/(2*16) = 1024Hz
//  P1.3= CCR2 = 32768/(2*100) = 163.84Hz
//  P1.0= overflow = 32768/(2*65536) = 0.25Hz
//
//               MSP430F149
//            -----------------
//        /|\|              XIN|-
//         | |                 | 32kHz
//         --|RST          XOUT|-
//           |                 |
//           |         P1.1/TA0|--> CCR0
//           |         P1.2/TA1|--> CCR1
//           |         P1.3/TA2|--> CCR2
//           |             P1.0|--> Overflow/software
//
//  M. Buccini
//  Texas Instruments Inc.
//  Feb 2005
//  Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************

#include  <msp430x14x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1SEL |= 0x0E;                            // P1.1 - P1.3 option select
  P1DIR |= 0x0F;                            // P1.0 - P1.3 outputs
  CCTL0 = OUTMOD_4 + CCIE;                  // CCR0 toggle, interrupt enabled
  CCTL1 = OUTMOD_4 + CCIE;                  // CCR1 toggle, interrupt enabled
  CCTL2 = OUTMOD_4 + CCIE;                  // CCR2 toggle, interrupt enabled
  TACTL = TASSEL_1 + MC_2 + TAIE;           // ACLK, contmode, interrupt enabled

  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
  CCR0 += 4;                                // Add Offset to CCR0
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
  switch( TAIV )
  {
  case  2: CCR1 += 16;                      // Add Offset to CCR1
           break;
  case  4: CCR2 += 100;                     // Add Offset to CCR2
           break;
  case 10: P1OUT ^= 0x01;                   // Timer_A3 overflow
           break;
 }
}





[수정]

임베디드! - MSP430 Timer 모드와, Nested Interrupt | 답장: 1개 | 본문에 답장
정렬 :  

답장 쓰기
글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

검색
Google

분류
·공지 (6)
·인터넷 (87)
·하드웨어 (260)
·C/C++ (65)
·어셈블리 (7)
·리눅스 (136)
·리눅스 커널 (67)
·윈도우즈 (25)
·데이터베이스 (20)
·보안 (16)
·.NET (25)
·그래픽 (13)
·책소개 (42)
·호기심 천국 (80)
·잡담 (111)
·사랑 (3)

전체 본문수: 963
전체 답장수: 525


분류 : 하드웨어
최근글
최근글
가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
뜨거운 감자
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

EzDoum투표
이지도움 어때요?
이게 뭐야. 다시 안올란다. --;
아이 좋아라~ +_+;
관심없다.
먼가는 있는거 같은데 뭐하는 곳이지?
기타 (자유게시판에 글로 남겨 주세요)
[ 결과 | 투표 ]

랜덤 링크
http://kldp.net


 Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
 Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum