打印

MCS51之裸奔框架C++程序源码(菜农C++裸奔**系列之三)

[复制链接]
4868|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-6-14 03:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*------------------------------------------------------------------------
                  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

相关帖子

沙发
yewuyi| | 2008-6-14 10:45 | 只看该作者

俺最喜欢这个风格了……

int main()
{
    。。。
    __nop();
    __enable_interrupt();//开放总中断
    while(1)
    {
        if (System.SysTickFlag)//节拍曾中断过
        {
            System.MainLoopFlag = true;//报告节拍中断中的喂狗程序主循环正常
            System.SysTickFlag = false;//准备下次测试
           。。。。
        }
    }
}

哈哈,这也是俺最常用的一个结构……


但对老农的这句有点疑惑“但一定要在H头文件中用extern加变量或函数声明”,俺都是在H文件中对函数做extern声明,但变量的extern声明一般都是放在C文件中的,不知道这样为什么不好?!

使用特权

评论回复
板凳
dld2| | 2008-6-14 10:54 | 只看该作者

俺不喜欢在头文件声明变量

使用特权

评论回复
地板
雁舞白沙| | 2008-6-14 12:26 | 只看该作者

jiafen

使用特权

评论回复
5
古道热肠| | 2008-6-14 16:41 | 只看该作者

补充一下,宏常量定义应该放在头文件中

宏常量放在头文件中,所有的C文件均可引用宏常量,非常的方便.
个人觉得变量引用不放在头文件中较好,哪个C文件要用外部的变量,自己在C文件中声名一下,做到心中有数.这样会形成一种尽量少引用外部变量的习惯,而是通过函数来传递,这是一种良好的编程风格的基础,全局变量乱用,很容易出问题.

使用特权

评论回复
6
栏杆| | 2008-6-15 11:56 | 只看该作者

~~

"个人觉得变量引用不放在头文件中较好,哪个C文件要用外部的变量,自己在C文件中声名一下,做到心中有数.这样会形成一种尽量少引用外部变量的习惯,而是通过函数来传递,这是一种良好的编程风格的基础,全局变量乱用,很容易出问题.
"

oula


----------------------------------------

我建议开个C语言版就是这个目的啦,  把良好的习惯,或者建议集中在一起置顶,这些是书上没有的,全靠个人得悟性。后来还看到一篇什么嵌入式C规范,  真是好啊!  偶最恨那些i+++4的写法了。

还有什么宏和变量得区别与适应场合,为什么这么说,等,都可以归纳出来放在一起,是真正得整体提高推动啊。


菜农得宏C那些东西,其实可以写个读后感的!







使用特权

评论回复
7
xwj| | 2008-6-15 12:10 | 只看该作者

嗯,赞同5楼的方法

意识、习惯很重要

使用特权

评论回复
8
HWM| | 2008-6-15 15:09 | 只看该作者

若用C++的话,在main内决不会出现while(1)...之类的玩意儿。

要玩就彻底的将其精髓玩出来。

使用特权

评论回复
9
gyt| | 2008-6-16 15:21 | 只看该作者

谢谢发表

使用特权

评论回复
10
将军令| | 2008-6-18 17:19 | 只看该作者

这是哪门子的C++呀

没有对象
都是ansi c的语法。这也叫做C++

使用特权

评论回复
11
将军令| | 2008-6-18 17:20 | 只看该作者

这是哪门子的C++呀?? ,狂汗ing...

这是哪门子的C++呀 

没有对象
都是ansi c的语法。这也叫做C++??????
 
 

使用特权

评论回复
12
machunshui| | 2008-6-18 17:37 | 只看该作者

11楼说道点子上面了

11楼说道点子上面了.

裸奔嵌入式,C++意义不大.

代码重用,多态用不上.

很多的什么运算符重载,什么类的各种属性,很多东西对与硬件直接驱动关系密切的裸奔嵌入式小系统,没什么意义.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝