簡體   English   中英

mbed-OS移植到TivaC TM4123,具有動態中斷處理功能的Trouple

[英]mbed-OS porting to TivaC TM4123, Trouple with dynamic interrupt handling

最近,我試圖將mbed-OS移植到Tiva-C啟動板TM4C123,我遇到了mbed提供的文件cmsis_nvic.c和cmsis_nvic.h的問題。

該模塊應該將OS計時器的中斷處理程序動態分配給可尋址功能(據我所知)。

發生的是,執行以下行后,軟件跳至“ Hard Fault Handler”

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矢量)

來自文件us_ticker.c這樣

NVIC_SetVector(TIMER0A_IRQn,(uint32_t)us_ticker_irq_handler);

(我的編譯器是ARM​​ GCC,我使用CDT進行構建,使用GDB openOCD進行調試,並將所有這些工具集成到Eclipse上)

有人可以讓我知道這里出了什么問題嗎? 或至少我應該在哪里調試或閱讀以幫助我解決此問題???

更新

我發現了問題的一部分,向量沒有指向目標SRAM的第一個地址,應該是

#define NVIC_RAM_VECTOR_ADDRESS (0x20000000)

代替

#define NVIC_RAM_VECTOR_ADDRESS (0x02000000)

因此,現在在調用NVIC_SetVector時,將執行該函數。 但是,當啟用中斷時,軟件仍然跳到“硬故障”,我猜(只是猜測,或者可能是解決方案的一部分),頭文件中的定義配置不正確,有人可以向我解釋它們的意思嗎? 以及如何計算向量地址的數量? USER OFFSET是什么?

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

1- NVIC_RAM_VECTOR_ADDRESS不是我目標RAM的第一個地址,應該是0x20000000

2-鏈接器文件應進行更新,以使堆棧指針不應覆蓋新復制的向量表。 因此,將RAM地址移動向量表應占用的字節數。

3-(主要原因)的內部功能NVIC_SetVectori被宣布為uint32_t ,然后相對於小於255預處理器的值。 因此,通過將uint32_tuint8_t進行比較,將UL添加到預處理器值中,可以使編譯感到困惑,從而解決了整個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM