国产毛片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在线
|
日本精品一区二区
|
欧美亚洲精品在线
|
成人久久精品一区二区三区
|
久久综合精品不卡一区二区
|