2016-07-29 140 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 

和我打電話

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時,函數被執行。但是,當啓用中斷時,軟件仍然跳轉到硬故障,我猜(只是猜測或可能是解決方案的一部分)頭文件中的定義配置不正確,有人可以向我解釋它們是什麼意思?以及如何計算向量地址的數量?什麼是用戶偏移?

+0

'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'嗎? –

+0

我已經更新了這個問題?你能否檢查出來,讓我知道你是否有答案? –

+0

TIMER0A_IRQn定義爲什麼?它是代碼期望的向量編號還是中斷編號(向量編號減16)?另請參閱數據表中的表2-9;你有一個_lot_多於66個外設IRQs ...... – Notlikethat

回答

1

我已經解決了這個問題,這裏是我發現

1- NVIC_RAM_VECTOR_ADDRESS不應該是`0x20000000'

2 - 連接文件應如此更新我的目標RAM的首地址堆棧指針不應寫入新複製的向量表。所以按照向量表佔用的字節數來移動RAM地址。

函數NVIC_SetVector,i內部的3-(主要原因)被宣佈爲uint32_t,然後與小於255的預處理器值進行比較。所以編譯通過比較uint32_tuint8_t,通過將UL添加到預處理器的值來弄糊塗,它解決了整個問題。