最近我試圖將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
和我打電話
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的調試,並集成在Eclipse中的所有這些工具)
任何人都可以請讓我知道是怎麼回事錯在這裏?或者至少我應該在哪裏調試或閱讀以幫助我解決這個問題?
UPDATE
我想出問題的一部分,所述的載體不指向哪個應該是目標SRAM的第一地址
#define NVIC_RAM_VECTOR_ADDRESS (0x20000000)
代替
#define NVIC_RAM_VECTOR_ADDRESS (0x02000000)
所以現在當調用NVIC_SetVector時,函數被執行。但是,當啓用中斷時,軟件仍然跳轉到硬故障,我猜(只是猜測或可能是解決方案的一部分)頭文件中的定義配置不正確,有人可以向我解釋它們是什麼意思?以及如何計算向量地址的數量?什麼是用戶偏移?
'i'的價值是什麼?也就是說,如果> 0,那麼一些設置好了。如果沒有,使用gdb打印值。你正在接線'16' - 是NVIC_USER_IRQ_OFFSET嗎?如果是這樣,請使用它。你可能會跑到最後(例如'i'> ='NVIC_NUM_VECTORS')。你能用gdb戳「矢量」嗎? 'VTOR'在開始時是否有效? (即,兩個正確值中的一個:0/0x2000000)。它是獲取'old_vectors'還是存儲'vectors'這個問題(即做'x = old_vectors [i]; vectors [i] = x;'並且看哪條線路故障)?我希望你正在做'-O0'來進行調試。你在任何指針變量上都需要'volatile'嗎? –
我已經更新了這個問題?你能否檢查出來,讓我知道你是否有答案? –
TIMER0A_IRQn定義爲什麼?它是代碼期望的向量編號還是中斷編號(向量編號減16)?另請參閱數據表中的表2-9;你有一個_lot_多於66個外設IRQs ...... – Notlikethat