国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網

標題: 用C++開發STM32,解決了中斷向量問題 [打印本頁]

作者: McuPlayer    時間: 2013-7-8 23:48
標題: 用C++開發STM32,解決了中斷向量問題
最近喜歡上了C++開發STM32,C++語法上基本是C的擴展,所以習慣用C的人所有的知識和代碼可以繼續發揮作用。
另外,C++的OO編程,代碼架構更接近人的思考模式,即使我們不需要OO編程,代碼的可維護性也好了很多。

但若要完全C++開發,遇到的問題是中斷向量的問題,用C來包裝一個C++ 函數的方式可以解決,但似乎有些不爽。
中斷向量,就是函數入口地址,這個C++的靜態函數可以對應起來。

我們可以從map文件中,把中斷向量的一個個的C++函數的入口地址符號找到,寫入startup文件中。
但C++的symbol不像C語言那么簡潔了,而且可能隨著源代碼的編輯而改變,包括函數的順序,函數的返回值,函數的參數等。
_ZN10CInterrupt15TIM3_IRQHandlerEv 看看這個符號,是不是很別扭,C語言的Symbol就一個TIM3_IRQHandler,跟函數名完全相同。

這時候,我們應該盡量不要在匯編程序中寫向量表,而是到C++文件中寫向量表了。


作者: McuPlayer    時間: 2013-7-8 23:49
這是修改的的startup.s文件
-----------------------------華麗麗的分界線---------------------------------------------------

Stack_Size      EQU     0x00000800

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
__initial_sp_ex

Heap_Size       EQU     0x00000400

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit


                EXPORT  __initial_sp_ex
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
__Vectors            EQU        0x08006000
__Vectors_End        EQU        0x08006040
__Vectors_Size        EQU        0x40


                PRESERVE8
                THUMB

                AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP


;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      EF:__MICROLIB           
               
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
               
                 ELSE
               
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END
作者: McuPlayer    時間: 2013-7-8 23:49
這個是Interrupt.hpp文件,可根據需要增添,可以把所有的ISR函數都掛上去,也可以只寫自己需要的

class CInterrupt
{
public:
        static void USB_LP_CAN1_RX0_IRQHandler();
        static void TIM3_IRQHandler();
};
作者: McuPlayer    時間: 2013-7-8 23:50
這個是Interrupt.cpp文件,包括2個成員函數的實現
------------------------------------------------------------------------------
void CInterrupt::USB_LP_CAN1_RX0_IRQHandler()
{
        if(!g_bInterruptPause)        AndyUSB.USB_Istr();
}
void CInterrupt::TIM3_IRQHandler()
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
               
                g_nNowTime++;
               
//                if(0==(g_nNowTime%2))
                {
                        AndyHW.HwCallBackKeyScan();
                }
                AndyHW.HwCallBackOverCurrent();
                AndyOS.sysCallBackTimer10ms();   //10mS
        }
}
作者: McuPlayer    時間: 2013-7-8 23:51
下面的這個部分,可以寫在Interrupt.cpp文件中,也可單獨寫一個CPP文件。
-----------------------------------------------------------------------------------------------------------------------------


#ifdef __cplusplus
extern "C" {
#endif

void __initial_sp_ex(void);
void Reset_Handler(void);

#ifdef __cplusplus
}
#endif

void Default_Handler(void);

typedef void(* const ISR_t)(void);

ISR_t IsrVector[] __attribute__ ((section("RESET"))) =
{
                __initial_sp_ex,
                Reset_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                0,
                0,
                0,
                0,
                Default_Handler,
                Default_Handler,
                0,
                Default_Handler,
                Default_Handler,


                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                CInterrupt::USB_LP_CAN1_RX0_IRQHandler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                CInterrupt::TIM3_IRQHandler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler,
                Default_Handler
};

void Default_Handler(void)
{
    while (1);
}

作者: McuPlayer    時間: 2013-7-8 23:51
不過有些遺憾的是,STM32的FwLib沒有C++版本的,不過C++和C混合使用,沒問題的
ST提供的h文件中全加入了兼容C和C++的宏處理
#ifdef __cplusplus
extern "C" {
#endif

當轉到C++后,就可以使用虛函數來代替一部分函數指針,可讀性更好。
MDK中RVDS編譯器,對C++的優化很好,沒用到的成員函數會被優化掉,所以如果做平臺一定記得對相關的成員函數禁止優化,使用--keep選項

OK,享受C++之旅吧




歡迎光臨 電子工程網 (http://m.qingdxww.cn/) Powered by Discuz! X3.4
主站蜘蛛池模板: 91精品综合 | 日韩精品免费视频 | 在线观看欧美三级 | 亚洲人xxx日本人18 | 久久综合五月天婷婷伊人 | 亚洲网站在线免费观看 | 在线免费观看亚洲视频 | 国产三级在线观看视频 | 精品手机在线视频 | 91网站免费观看 | 国模福利在线观看视频 | 九九热在线观看 | 日韩av片免费播放 | 一级做a爰片毛片 | 手机看片国产 | 亚洲欧美专区精品久久 | 在线动漫网| 欧美美女大阴口 | 日本网络视频www色高清免费 | 极品美女一区二区三区 | 99热这里只有精品久久免费 | 国产一进一出视频网站 | 一区二区在线观看视频在线 | 亚洲韩国欧美一区二区三区 | 久久久久国产亚洲日本 | 伊人色强在线网 | 日韩黄色精品 | 91热久久免费精品99 | 99色这里只有精品 | 精品色网| 在线人成精品免费视频 | 干操网| 手机在线国产精品 | 欧美综合第一页 | 久久三级毛片 | 四虎影免看黄 | 9797在线| 日本精品一区二区 | 欧美亚洲精品在线 | 成人久久精品一区二区三区 | 久久综合精品不卡一区二区 |