/*------------------------------------------------------------------------ MCS51之裸奔框架C++程序源码(菜农C++裸奔大法) 本程序主要表现了C++多文件系统的MCU构建方法,任何支持C++的MCU/ARM/DSP都可用 此法构建。说实话在51上玩C++是很郁闷的~~~一般别玩~~~这里主要讲构建之法. 特别要注意变量的重复定义问题: 最好每个C/CPP文件包含与自己同名的H头文件,在其H头文件中再包含一个中间 起桥梁作用的H头文件,我一般喜欢main.h 变量或函数要在C/CPP中定义,绝对不要在H头文件中定义! 但一定要在H头文件中用extern加变量或函数声明。 C++中要切记全局的类的构造函数肯定要在main()前运行,对于IAR编译器有个 __low_level_init()函数也会在main()前运行,它主要控制所有变量或类的初始化 一般类的成员函数是不能作为中断服务程序ISR()的,但Cortex-M3确是一个意外 总之中断程序要用__interrupt修饰的ISR()的,其类成员函数不能为ISR() 最好用一个单独的文件interrupt.cpp来编写所有中断服务程序ISR(),可能其 H头文件什么都没有也最好加上。 每个头文件的构成结构基本如下: #include "main.h"
#ifndef __MSC1210_INTERRUPT_H #define __MSC1210_INTERRUPT_H
#ifdef __IAR_SYSTEMS_ICC__ #ifndef _SYSTEM_BUILD #pragma system_include #endif #endif
#ifdef __cplusplus extern "C" { #endif
#define INT0_vect (0x03) #define TIMER0_OVF_vect (0x0b) #define INT1_vect (0x13) #define TIMER1_OVF_vect (0x1b) #define UART0_vect (0x23) #define TIMER2_OVF_vect (0x2b)
#define SPI_Receive_vect (0x33) #define SPI_Transmit_vect (0x33) #define ADC_vect (0x33) #define AVDDLowVoltage_vect (0x33) #define SummationRegister_vect (0x33) #define MillisecondsTimer_vect (0x33) #define SecondsTimer_vect (0x33)
#define UART1_vect (0x3b) #define INT2_vect (0x43) #define INT3_vect (0x4b) #define INT4_vect (0x53) #define INT5_vect (0x5b) #define WDT_vect (0x63)
#ifdef __cplusplus } #endif
#endif//__MSC1210_INTERRUPT_H "桥梁"H头文件要包含所有用到的H头文件!!!否则"桥梁"倒塌~~~
菜农HotPower@126.com 2008.6.14 3:18 作于特殊的节日来奉贤给大家~~~ -------------------------------------------------------------------------*/
#include "main.h"
/* extern "C" __root void __cstart_call_ctors(void) { //1.阻止产生movx @R0,A;movx a,@R1指令 //2.重载该函数的结果构造函数将不会被自动调用!!! } */
extern "C" __root void __exit(void) { //重载该函数将优化代码48个字节 }
extern "C" __root char __low_level_init (void) { //重载该函数的目的就是抢在main()前加入初始化代码 __disable_interrupt();//关闭总中断 C51_Init(); /* System.Init(); Timer.Init(); Adc.Init(); Uart.Init(); Keyboard.Init(); Lcd.Init(); */ return 0;//0-变量不初始化,1-变量初始化 }
//加__no_init可以优化50个字节 __root __no_init SystemObj System; __root __no_init TimerObj Timer; __root __no_init AdcObj Adc; __root __no_init UartObj Uart; __root __no_init KeyboardObj Keyboard; __root __no_init LcdObj Lcd;
int main() { unsigned char i; System.RamTest = 0x55aa; for (i = 0; i < 200; i ++) __nop(); __enable_interrupt();//开放总中断 while(1) { if (System.SysTickFlag)//节拍曾中断过 { System.MainLoopFlag = true;//报告节拍中断中的喂狗程序主循环正常 System.SysTickFlag = false;//准备下次测试 } } }
相关链接:http://space.ednchina.com/Upload/Blog/2008/6/14/7b57678e-807c-489b-8044-c89f6ce7f44c.rar |