2016-07-29 7 views
0

최근에 mbed-OS를 Tiva-C 런치 패드 TM4C123으로 포팅하려고합니다. mbed에서 제공하는 cmsis_nvic.c 및 cmsis_nvic 파일에 문제가 있습니다. hmbed-OS에서 TivaC TM4123으로 포팅, 동적 인터럽트 처리로 Trouple

이 모듈은 OS 타이머의 인터럽트 처리기를 주소 지정 기능에 동적으로 할당한다고 가정합니다 (또는 내가 아는 한). 일이 무엇

이 소프트웨어는

vectors[i] = old_vectors[i]; 

여기 여기에 내가

#include "cmsis_nvic.h" 

#define NVIC_RAM_VECTOR_ADDRESS (0x02000000) // Vectors positioned at start of RAM 
#define NVIC_FLASH_VECTOR_ADDRESS (0x0)  // Initial vector position in flash 

void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) { 
    uint32_t *vectors = (uint32_t*)SCB->VTOR; 
    uint32_t i; 

    // Copy and switch to dynamic vectors if the first time called 
    if (SCB->VTOR == NVIC_FLASH_VECTOR_ADDRESS) { 
     uint32_t *old_vectors = vectors; 
     vectors = (uint32_t*)NVIC_RAM_VECTOR_ADDRESS; 
     for (i=0; i<NVIC_NUM_VECTORS; i++) { 
      vectors[i] = old_vectors[i]; 
     } 
     SCB->VTOR = (uint32_t)NVIC_RAM_VECTOR_ADDRESS; 
    } 
    vectors[IRQn + 16] = vector; 
} 

uint32_t NVIC_GetVector(IRQn_Type IRQn) { 
    uint32_t *vectors = (uint32_t*)SCB->VTOR; 
    return vectors[IRQn + 16]; 
} 

을 사용하여 파일의 다음 줄을 실행 한 후에 "하드 오류 처리기를"점프입니다 cmsis_nvic.h입니다

#ifndef MBED_CMSIS_NVIC_H 
#define MBED_CMSIS_NVIC_H 

#define NVIC_NUM_VECTORS  (154) // CORE + MCU Peripherals 
#define NVIC_USER_IRQ_OFFSET 16 

#include "cmsis.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector); 
uint32_t NVIC_GetVector(IRQn_Type IRQn); 

#ifdef __cplusplus 
} 
#endif 

#endif 

및 전화 :

,691,363,210

NVIC_SetVector (IRQn_Type IRQn, uint32_t 벡터)이

NVIC_SetVector (TIMER0A_IRQn (uint32_t) us_ticker_irq_handler)와 같은 파일에서 us_ticker.c

;

는 (내 컴파일러는 ARM의 GCC이다 나는 건물에 대한 CDT를 사용하여, 그리고 디버깅을 위해 GDB openOCD, 이클립스에 대한 모든 도구를 통합하고) 누군가가 알려 주시기 바랍니다 수

이 무엇을 잘못 여기 것입니다을 ? 또는 적어도 어디에 디버깅하거나이 문제를 해결할 수 있도록 읽어야합니까 ???

UPDATE

I 문제의 일부를 알아 낸 상기 벡터이어야 대상 SRAM의 선두 어드레스를 가리키는되지

#define NVIC_RAM_VECTOR_ADDRESS (0x20000000) 

대신

#define NVIC_RAM_VECTOR_ADDRESS (0x02000000) 

이제는 NVIC_SetVector를 호출 할 때 함수가 실행됩니다. 그러나 인터럽트를 활성화 할 때 소프트웨어는 여전히 하드 폴트로 이동합니다. 헤더 파일의 정의가 올바르게 구성되어 있지 않다고 추측합니다 (솔루션의 일부 일 수도 있습니다). 누군가가 내게 의미하는 바가 무엇인지 설명 할 수 있습니까? 및 벡터 주소의 수를 계산하는 방법? USER OFFSET이란 무엇입니까?

+0

'i'의 값은 무엇입니까? 즉,> 0 일 경우 일부 설정은 ok입니다. 그렇지 않은 경우 gdb를 사용하여 값을 인쇄하십시오. 당신은'16 '을 하드 와이어하고 있습니다 - 그것은'NVIC_USER_IRQ_OFFSET'입니까? 그렇다면 사용하십시오. 끝까지 지나칠 수 있습니까 (예 :'i'> ='NVIC_NUM_VECTORS'). gdb로'vectors'를 찌를 수 있습니까? 'VTOR'은 시작할 때 유효합니까? (즉, 두 가지 올바른 값 중 하나입니다 : 0/0x2000000). 'old_vectors'를 가져 오거나 문제가되는 '벡터'를 저장하고 있습니까 (즉,'x = old_vectors [i]; vectors [i] = x;'하고 어떤 라인 오류가 있는지 확인 하시겠습니까?)? 디버깅을 위해'-O0'을하고 싶습니다. 포인터 변수에 'volatile'이 필요합니까? –

+0

질문이 업데이트 되었습니까? 그걸 확인해보고 대답이 있으면 알려주시겠습니까? –

+0

'TIMER0A_IRQn'이란 무엇입니까? 코드 번호가 예상하는 벡터 번호 또는 인터럽트 번호 (벡터 번호에서 16을 뺀 것)입니까? 또한 데이터 시트의 표 2-9를 참조하십시오. 당신은 _lot_ 66 개 이상의 주변 IRQ를 가지고 있습니다 ... – Notlikethat

답변

1

나는 여기에 내가

1 NVIC_RAM_VECTOR_ADDRESS

2 링커 파일이 너무 업데이트해야 '으로 0x20000000'해야 내 목표 RAM의 첫 번째 주소 아니었다 발견 한 무엇,이 문제를 해결 한 스택 포인터는 새로운 복사 된 벡터 테이블을 덮어 쓰지 않아야합니다. 그래서 벡터 테이블이 점유해야하는 바이트 수로 RAM 주소를 이동하십시오.

3- (주 원인) 기능 NVIC_SetVector, iuint32_t으로 선언 된 다음 255 개 미만의 전 처리기 값과 비교되었습니다. 그래서 uint32_tuint8_t으로 비교하여 컴파일러가 혼란에 빠지면 전 처리기 값에 UL을 추가하면 전체 문제가 해결됩니다.