최근에 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는 (내 컴파일러는 ARM의 GCC이다 나는 건물에 대한 CDT를 사용하여, 그리고 디버깅을 위해 GDB openOCD, 이클립스에 대한 모든 도구를 통합하고) 누군가가 알려 주시기 바랍니다 수NVIC_SetVector (IRQn_Type IRQn, uint32_t 벡터)이
NVIC_SetVector (TIMER0A_IRQn (uint32_t) us_ticker_irq_handler)와 같은 파일에서 us_ticker.c
;
이 무엇을 잘못 여기 것입니다을 ? 또는 적어도 어디에 디버깅하거나이 문제를 해결할 수 있도록 읽어야합니까 ???
UPDATE
I 문제의 일부를 알아 낸 상기 벡터이어야 대상 SRAM의 선두 어드레스를 가리키는되지
#define NVIC_RAM_VECTOR_ADDRESS (0x20000000)
대신
#define NVIC_RAM_VECTOR_ADDRESS (0x02000000)
이제는 NVIC_SetVector를 호출 할 때 함수가 실행됩니다. 그러나 인터럽트를 활성화 할 때 소프트웨어는 여전히 하드 폴트로 이동합니다. 헤더 파일의 정의가 올바르게 구성되어 있지 않다고 추측합니다 (솔루션의 일부 일 수도 있습니다). 누군가가 내게 의미하는 바가 무엇인지 설명 할 수 있습니까? 및 벡터 주소의 수를 계산하는 방법? USER OFFSET이란 무엇입니까?
'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'이 필요합니까? –
질문이 업데이트 되었습니까? 그걸 확인해보고 대답이 있으면 알려주시겠습니까? –
'TIMER0A_IRQn'이란 무엇입니까? 코드 번호가 예상하는 벡터 번호 또는 인터럽트 번호 (벡터 번호에서 16을 뺀 것)입니까? 또한 데이터 시트의 표 2-9를 참조하십시오. 당신은 _lot_ 66 개 이상의 주변 IRQ를 가지고 있습니다 ... – Notlikethat