打印

在OS之争上,大多数人犯了教条主义和经验主义的错误,

[复制链接]
3307|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
后学|  楼主 | 2007-12-10 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在OS之争上,大多数人犯了教条主义和经验主义的错误,
我们要实事求是,在基本的指导原则下,具体情况具体分析,

首先考虑需求
1、简单的强实时系统,自然不用OS;
2、简单的弱实时系统,考虑模块的耦合性可移植性等软件工程要素;
3、复杂多任务的弱实时系统,考虑实时OS;
4、复杂多任务的强实时系统;大侠,你做航天飞机么?抽空指点下弟弟我,


--------------------------------------------------------------------------
尽管99.99%的公司达不到软件工程的要求,但软件工程是个很好的指导原则,
有意识的在工作中运用,会起到事半功倍的效果,

嵌入式系统我们同样可以划分为系统和应用两部分,
可以大量借鉴PC软件开发和高级语言的经验和方法,
而不是因为嵌入式编程的硬件相关性就闭门造车,固步自封,排斥新事物,

至于是自己写os还是用商业os,
商业os可以满足你99.99%的要求,而且经过成千上万的用户检验,为什么不用呢,
我觉得,什么模块都自己写的观念,应该是上个世纪80年代以前的思想,
纯粹学习除外,

21ic像其它大多数技术论坛一样,
在一步步没落,这是趋势,原因很多,
不反思不变化的话,
只能一直这样半死不活了,

我不想在21引起什么争论,
我只是想说,元老和权威也会落伍的,要博纳众长,

一吐为快,谢谢关注,
请不要吹毛求疵,我不会经常回这个帖子的,

相关帖子

沙发
computer00| | 2007-12-10 09:24 | 只看该作者

哈哈~~~我的感觉是,讨论的人大多数还是承认OS是的好处的

但也很喜欢裸奔带来的快感。

使用特权

评论回复
板凳
农民讲习所| | 2007-12-10 09:44 | 只看该作者

MCU设计要走前人没走过的路

OS不适合MCU,裸奔缺乏理论支持,嵌入式裸奔最好。
MCU是单片机,讨论时候先把这个前提搞清楚。

嵌入式裸奔到底是什么?研究中。

使用特权

评论回复
地板
yewuyi| | 2007-12-10 09:50 | 只看该作者

~~,嵌入式裸奔:我刚给别人回答的答案

嵌入式裸奔:使用OS的思想,但没有使用公开的OS代码,而是自己借鉴OS调度的方法安排任务。

使用特权

评论回复
5
农民讲习所| | 2007-12-10 09:54 | 只看该作者

LS有道理,俺100%是同意

但实现的方式如何清楚描述出来?如何让大家遵守嵌入式裸奔设计规则?这是最难的地方,俺已经在黑夜中摸索了八年。

使用特权

评论回复
6
hq_y| | 2007-12-10 10:08 | 只看该作者

估计是众口难调~~~~~~~需要大佬~~~~

使用特权

评论回复
7
yewuyi| | 2007-12-10 10:12 | 只看该作者

俺的理解:

~~,如何让大家遵守嵌入式裸奔设计规则?

俺个人理解,这个设计的原则取决设计者对任务调度方法的理解,如果没有专门研究过OS,那么一般取决设计者将这种方法应用于他的实际设计项目中的平衡能力,很多设计者并没有仔细研究过OS(包括俺啊,惭愧,层次低~~),但这个设计者也是可以运用很多OS的思想的,这主要来源于他的实战演练。

当然,象所长那样做一些设计规则的总结肯定是好事情,但俺个人认为,这个总结出来的设计规则很多也是来源于你自己的实战,这个时候,想要让后来者快速接受这套思想,如果接受者实战能力不够,他就会遇到很多障碍,如果接受者实战能力比较丰富,他往往又有自己的一套,这个时候,往往得到的是‘改良’的结果。

嘿嘿,俺就只能说这么点大道理了~~

~~,看了所长写的代码,俺发现自己写代码确实太随意了……

呵呵,最近一有空就猛啃相关的资料,但实际的情况是,我们都需要为生活努力,所以更多的时候,我们都是在为了完成任务写出可运行的代码而努力,~~,这也是一个设计者成长过程的不断‘改良’把……

~~,期盼着的所长的书没有出来,而是出来一个BLOG,但那个BLOG东西实在是少,呵呵,不知道现在加新内容了没有?!

使用特权

评论回复
8
农民讲习所| | 2007-12-10 10:19 | 只看该作者

俺想到的最好方式,是标准库。

用含着嵌入式裸奔设计规则的标准库,可以极大程度地在可靠性、开发速度、新手上手、资源要求方面取得非常好的效果。
用的人多了,自然也成为替代OS的标准了。
还可以用PC做个工具向导程序,自动化设计。

呵呵,前段时间工作方面变动大,什么都停了。

使用特权

评论回复
9
古道热肠| | 2007-12-10 11:56 | 只看该作者

所长最好做成模板方式。

嵌入式系统开发,中间件最有用,底层硬件抽象层和上层应用层大都难于统一起来,所长如能做成模板,大家肯定愿意照着模子套。

使用特权

评论回复
10
农民讲习所| | 2007-12-10 12:06 | 只看该作者

基本设想

比如51,有个基本库:51Lib_base.lib
然后每个51型号对应着一个硬件库,比如AT89S51,包含着串口、系统时间。内容比较少。

比如:C8051F350硬件库的H文件:
#ifndef __51Lib_C8051F350H
#define __51Lib_C8051F350H

#include "c8051F350.h"

#define TR3        2
#define TF3H    7

#define ET3        7

#define T1M        3
#define SCA1    1
#define SCA0    0

#define IFCN0    0
#define IFCN1    1


#define EADC0C    3

sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;


    #define C8051F350_SysTimer_24p5M        (10208L)    //使用T3做20MS,SysClk/12. 5000*24.5/12.
    #define C8051F350_SysTimer_12p25M        (10208L/2)    //使用T3做20MS,SysClk/12. 5000*24.5/12/2.
    #define C8051F350_SysTimer_6p125M        (10208L/4)    //使用T3做20MS,SysClk/12. 5000*24.5/12/4.
    #define C8051F350_SysTimer_3p0625M        (10208L/8)    //使用T3做20MS,SysClk/12. 5000*24.5/12/8.


    //====================================SysTimer.h===============================================

    extern bool bIn20ms_Touch;                //中断缓冲标志,转循环处理.内部使用.
    
    extern bool bSysTimer_Touch;            //20ms时间到标志
    
    //-------------------------------------------------------------
    //初始化
    //mFreqConfig使用C8051F350_x宏定义
    //-------------------------------------------------------------
    extern void SysTimer_Init( U16 mFreqConfig );

    //-------------------------------------------------------------------------
    //系统时间初始化
    //不使用CallBack的初始化
    //-------------------------------------------------------------------------
    extern void SysTimer_NoCallBack_Init( U16 mFreqConfig );

    //-------------------------------------------------------------
    //析构
    //-------------------------------------------------------------
    extern void SysTimer_Destory( void );

    //-------------------------------------------------------------
    //循环
    //中断缓冲标志有效进入
    //-------------------------------------------------------------
    #define SysTimer_MainLoop()    do{ bSysTimer_Touch = false;
                                    if(bIn20ms_Touch){ bIn20ms_Touch = false; bSysTimer_Touch = true;}
                                }while(0)


    //====================================Uart80.h===============================================
    
    //波特率
    #define C8051F350_OSC_24p5MHz_1200            ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+48*12) /(48*2*12)  ) )
    #define C8051F350_OSC_24p5MHz_2400            ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+48*24) /(48*2*24)  ) )
    #define C8051F350_OSC_24p5MHz_4800            ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+48*48) /(48*2*48)  ) )
    #define C8051F350_OSC_24p5MHz_9600            ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+12*96) /(12*2*96)  ) )
    #define C8051F350_OSC_24p5MHz_14400            ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+12*144)/(12*2*144) ) )
    #define C8051F350_OSC_24p5MHz_28800            ( ( ((0<<T1M)|(0<<SCA1)|(1<<SCA0))<<8 ) | ( 256 - (245000+4*288) /(4*2*288)  ) )
    #define C8051F350_OSC_24p5MHz_38400            ( ( ((0<<T1M)|(0<<SCA1)|(1<<SCA0))<<8 ) | ( 256 - (245000+4*384) /(4*2*384)  ) )
    #define C8051F350_OSC_24p5MHz_57600            ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+1*576) /(1*2*576)  ) )
    #define C8051F350_OSC_24p5MHz_76800            ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+1*768) /(1*2*768)  ) )
    #define C8051F350_OSC_24p5MHz_115200        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (245000+1*1152)/(1*2*1152) ) )

    #define C8051F350_OSC_12p25MHz_1200            ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+48*12) /(48*2*12)  ) )
    #define C8051F350_OSC_12p25MHz_2400            ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+48*24) /(48*2*24)  ) )
    #define C8051F350_OSC_12p25MHz_4800            ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+12*48) /(12*2*48)  ) )
    #define C8051F350_OSC_12p25MHz_9600            ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+12*96) /(12*2*96)  ) )
    #define C8051F350_OSC_12p25MHz_14400        ( ( ((0<<T1M)|(0<<SCA1)|(1<<SCA0))<<8 ) | ( 256 - (122500+4*144) /(4*2*144)  ) )
    #define C8051F350_OSC_12p25MHz_28800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+1*288) /(1*2*288)  ) )
    #define C8051F350_OSC_12p25MHz_38400        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+1*384) /(1*2*384)  ) )
    #define C8051F350_OSC_12p25MHz_57600        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+1*576) /(1*2*576)  ) )
    #define C8051F350_OSC_12p25MHz_76800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+1*768) /(1*2*768)  ) )
    #define C8051F350_OSC_12p25MHz_115200        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (122500+1*1152)/(1*2*1152) ) )

    #define C8051F350_OSC_6p125MHz_1200            ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+48*12) /(48*2*12)  ) )
    #define C8051F350_OSC_6p125MHz_2400            ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+12*24) /(12*2*24)  ) )
    #define C8051F350_OSC_6p125MHz_4800            ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+12*48) /(12*2*48)  ) )
    #define C8051F350_OSC_6p125MHz_9600            ( ( ((0<<T1M)|(0<<SCA1)|(1<<SCA0))<<8 ) | ( 256 - ( 61250+4*96)  /(4*2*96)   ) )
    #define C8051F350_OSC_6p125MHz_14400        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+1*144) /(1*2*144)  ) )
    #define C8051F350_OSC_6p125MHz_28800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+1*288) /(1*2*288)  ) )
    #define C8051F350_OSC_6p125MHz_38400        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+1*384) /(1*2*384)  ) )
    #define C8051F350_OSC_6p125MHz_57600        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+1*576) /(1*2*576)  ) )
    #define C8051F350_OSC_6p125MHz_76800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+1*768) /(1*2*768)  ) )
    #define C8051F350_OSC_6p125MHz_115200        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 61250+1*1152)/(1*2*1152) ) )

    #define C8051F350_OSC_3p0625MHz_1200        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+12*12) /(12*2*12)  ) )
    #define C8051F350_OSC_3p0625MHz_2400        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+12*24) /(12*2*24)  ) )
    #define C8051F350_OSC_3p0625MHz_4800        ( ( ((0<<T1M)|(0<<SCA1)|(1<<SCA0))<<8 ) | ( 256 - ( 30625+4*48)  /(4*2*48)   ) )
    #define C8051F350_OSC_3p0625MHz_9600        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*96)  /(1*2*96)   ) )
    #define C8051F350_OSC_3p0625MHz_14400        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*144) /(1*2*144)  ) )
    #define C8051F350_OSC_3p0625MHz_28800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*288) /(1*2*288)  ) )
    #define C8051F350_OSC_3p0625MHz_38400        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*384) /(1*2*384)  ) )
    #define C8051F350_OSC_3p0625MHz_57600        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*576) /(1*2*576)  ) )
    #define C8051F350_OSC_3p0625MHz_76800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*768) /(1*2*768)  ) )
    #define C8051F350_OSC_3p0625MHz_115200        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - ( 30625+1*1152)/(1*2*1152) ) )

    
    #define C8051F350_OSC_22p1184MHz_1200        ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+48*12) /(48*2*12)  ) )
    #define C8051F350_OSC_22p1184MHz_2400        ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+48*24) /(48*2*24)  ) )
    #define C8051F350_OSC_22p1184MHz_4800        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+12*48) /(12*2*48)  ) )
    #define C8051F350_OSC_22p1184MHz_9600        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+12*96) /(12*2*96)  ) )
    #define C8051F350_OSC_22p1184MHz_14400        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+12*144)/(12*2*144) ) )
    #define C8051F350_OSC_22p1184MHz_28800        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+12*288)/(12*2*288) ) )
    #define C8051F350_OSC_22p1184MHz_38400        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+12*384)/(12*2*384) ) )
    #define C8051F350_OSC_22p1184MHz_57600        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+1*576) /(1*2*576)  ) )
    #define C8051F350_OSC_22p1184MHz_76800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+1*768) /(1*2*768)  ) )
    #define C8051F350_OSC_22p1184MHz_115200        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (221184+1*1152)/(1*2*1152) ) )
    
    #define C8051F350_OSC_11p0592MHz_1200        ( ( ((0<<T1M)|(1<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+48*12) /(48*2*12)  ) )
    #define C8051F350_OSC_11p0592MHz_2400        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+12*24) /(12*2*24)  ) )
    #define C8051F350_OSC_11p0592MHz_4800        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+12*48) /(12*2*48)  ) )
    #define C8051F350_OSC_11p0592MHz_9600        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+12*96) /(12*2*96)  ) )
    #define C8051F350_OSC_11p0592MHz_14400        ( ( ((0<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+12*144)/(12*2*144) ) )
    #define C8051F350_OSC_11p0592MHz_28800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+1*288) /(1*2*288)  ) )
    #define C8051F350_OSC_11p0592MHz_38400        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+1*384) /(1*2*384)  ) )
    #define C8051F350_OSC_11p0592MHz_57600        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+1*576) /(1*2*576)  ) )
    #define C8051F350_OSC_11p0592MHz_76800        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+1*768) /(1*2*768)  ) )
    #define C8051F350_OSC_11p0592MHz_115200        ( ( ((1<<T1M)|(0<<SCA1)|(0<<SCA0))<<8 ) | ( 256 - (110592+1*1152)/(1*2*1152) ) )


    //-------------------------------------------------------------
    //串口0使用的通信队列
    //-------------------------------------------------------------
    extern _SCommunicateQueue *psUart80;
    
    //-------------------------------------------------------------
    //初始化
    //-------------------------------------------------------------
    #define Uart80_Init()        do{ ;}while(0)
    
    //-------------------------------------------------------------
    //设置串口0
    //-------------------------------------------------------------
    extern void Uart80_Setup( U16 uBaud, U16 mSendBufSize, U16 mReciBufSize );
    
    //-------------------------------------------------------------
    //析构,释放使用到的硬件资源
    //-------------------------------------------------------------
    extern void Uart80_Destory(void);

    #define Uart80_MainLoop()    do{ ;}while(0)

//====================================IDAC0.h===============================================
    #define DACMODE_0p25ma        0                //0.25MA满度
    #define DACMODE_0p50ma        1                //0.50MA满度
    #define DACMODE_1p00ma        2                //1.00MA满度
    #define DACMODE_2p00ma        3                //2.00MA满度

    //-------------------------------------------------------------
    //初始化
    //按DACMODE_xxx宏定义入口
    //-------------------------------------------------------------
    #define IDac0_Init( mMode )        do{ IDA0EN |= mMode;}while(0)

    //-------------------------------------------------------------
    //析构
    //-------------------------------------------------------------
    #define IDac0_Destory()            do{ IDA0EN = 0x70;}while(0)

    //-------------------------------------------------------------
    //输出
    //-------------------------------------------------------------
    #define IDac0_Out( mDa )        do{ IDA0 = mDa; IDA0EN |= 0x80;}while(0)

    //-------------------------------------------------------------
    //循环
    //-------------------------------------------------------------
    #define IDac0_MainLoop()        do{;}while(0)

//====================================IDAC1.h===============================================

    //-------------------------------------------------------------
    //初始化
    //按DACMODE_xxx宏定义入口
    //-------------------------------------------------------------
    #define IDac1_Init( mMode )        do{ IDA1EN |= mMode;}while(0)

    //-------------------------------------------------------------
    //析构
    //-------------------------------------------------------------
    #define IDac1_Destory()            do{ IDA1EN = 0x70;}while(0)

    //-------------------------------------------------------------
    //输出
    //-------------------------------------------------------------
    #define IDac1_Out( mDa )        do{ IDA1 = mDa; IDA1EN |= 0x80;}while(0)

    //-------------------------------------------------------------
    //循环
    //-------------------------------------------------------------
    #define IDac1_MainLoop()        do{;}while(0)

//====================================ADC.h===============================================

    //放大倍数
    #define Adc_Zoom1()            do{ ADC0CN = (ADC0CN & (~0x7)) | 0x0;}while(0)    //信号放大1倍
    #define Adc_Zoom2()            do{ ADC0CN = (ADC0CN & (~0x7)) | 0x1;}while(0)    //信号放大2倍
    #define Adc_Zoom4()            do{ ADC0CN = (ADC0CN & (~0x7)) | 0x2;}while(0)    //信号放大4倍
    #define Adc_Zoom8()            do{ ADC0CN = (ADC0CN & (~0x7)) | 0x3;}while(0)    //信号放大8倍
    #define Adc_Zoom16()        do{ ADC0CN = (ADC0CN & (~0x7)) | 0x4;}while(0)    //信号放大16倍
    #define Adc_Zoom32()        do{ ADC0CN = (ADC0CN & (~0x7)) | 0x5;}while(0)    //信号放大32倍
    #define Adc_Zoom64()        do{ ADC0CN = (ADC0CN & (~0x7)) | 0x6;}while(0)    //信号放大64倍
    #define Adc_Zoom128()        do{ ADC0CN = (ADC0CN & (~0x7)) | 0x7;}while(0)    //信号放大128倍

    #define Adc_Offset(x)        do{ ADC0DAC = x;}while(0)                        //Adc输入偏移
    #define Adc_OutVref()        do{ ADC0CF |= 1<<2;}while(0)                    //设置Adc为外部基准源
    #define Adc_Start( Channel0, Channel1 )    do{ ADC0MUX = (Channel0<<4)|Channel1;
                                                ADC0MD = (1<<7) | (0x2);
                                            }while(0)                            //启动AD,入口:通道号
    #define Adc_Busy()            AD0BUSY                                            //忙标志

    
    #define C8051F350_AdcMDCLK_24p5MHz        9                                    //2.45
    #define C8051F350_AdcMDCLK_12p25MHz        4                                    //2.45
    #define C8051F350_AdcMDCLK_6p125MHz        1                                    //3.0625
    #define C8051F350_AdcMDCLK_3p0625MHz    0                                    //3.0625
    #define C8051F350_AdcMDCLK_22p1184MHz    8                                    //2.4576
    #define C8051F350_AdcMDCLK_11p0592MHz    3                                    //2.7648

    //D = MDCLK/(f*128) - 1
    #define C8051F350_AdcDec_24p5MHz(f)        ( (19141+(f>>1) )/f - 1 )            //最大960Hz
    #define C8051F350_AdcDec_12p25MHz(f)    ( (19141+(f>>1) )/f - 1 )            //最大960Hz
    #define C8051F350_AdcDec_6p125MHz(f)    ( (23926+(f>>1) )/f - 1 )            //最大1200Hz
    #define C8051F350_AdcDec_3p0625MHz(f)    ( (23926+(f>>1) )/f - 1 )            //最大1200Hz
    #define C8051F350_AdcDec_22p1184MHz(f)    ( (19200+(f>>1) )/f - 1 )            //最大960Hz
    #define C8051F350_AdcDec_11p0592MHz(f)    ( (21600+(f>>1) )/f - 1 )            //最大1080Hz
    
    //-------------------------------------------------------------------------
    //Adc结果数据
    //-------------------------------------------------------------------------
    extern S32 Adc_Data(void);
    
    //-------------------------------------------------------------------------
    //初始化
    //Adc配置,全部校准一次
    //Adc在双极性方式,不使用Burnout,
    //默认使用SINC3,内部2.5V基准
    //输入参数:调制时钟(2.4576M最佳),抽样比
    //-------------------------------------------------------------------------
    extern void Adc_Init( U8 mMDCLK, U16 mSampleClk );
    
    //-------------------------------------------------------------------------
    //析构
    //-------------------------------------------------------------------------
    extern void Adc_Destory(void);
    
    //-------------------------------------------------------------------------
    //循环
    //-------------------------------------------------------------------------
    #define Adc_MainLoop()                    do{ ;}while(0)
        
#endif

使用特权

评论回复
11
fsaok| | 2007-12-10 12:19 | 只看该作者

非丞相在梦中

有一次,曹操杀了一个给自己盖被子的侍从,人们都以为曹操果然是梦中杀人。只有杨修明白曹操的用意,指着死者说:“非丞相在梦中,君在梦中!”

使用特权

评论回复
12
hotpower| | 2007-12-10 12:54 | 只看该作者

念经~~~

使用特权

评论回复
13
123654789| | 2007-12-10 13:04 | 只看该作者

还有 唯物主义 唯心主义

还有 孙中山 的三民主义

使用特权

评论回复
14
koon| | 2007-12-11 00:31 | 只看该作者

所长什么时候出本实体书?

使用特权

评论回复
15
chunyang| | 2007-12-11 01:00 | 只看该作者

我用的是商业眼光来看待嵌入式OS

    性价比是追求的首要目标,技术要为商业服务,但技术水平越高,可选择的机会就越多,从这一点讲,如果能掌握OS的思想精髓是很有价值的,只是不能强求。
    正所谓:“师”可遇,“匠”可求,“工”满地跑。

使用特权

评论回复
16
西安化易| | 2007-12-11 01:22 | 只看该作者

看一个IAR430的头文件,IAR430 for 51没有安装,应该也差不多

/********************************************************************
*
* Standard register and bit definitions for the Texas Instruments
* MSP430 microcontroller.
*
* This file supports assembler and C development for
* MSP430x11x devices.
*
* Texas Instruments, Version 2.2
*
* Rev. 1.2, Additional Timer B bit definitions.
*           Renamed XTOFF to XT2OFF.
*
* Rev. 1.3, Removed leading 0 to aviod interpretation as octal
*            values under C
*           Included <In430.h> rather than "In430.h"
*
* Rev. 1.4, Corrected LPMx_EXIT to reference new intrinsic _BIC_SR_IRQ
*           Changed TAIV to be read-only
*
* Rev. 1.5, Enclose all #define statements with parentheses
*
* Rev. 2.1, Alignment of defintions in Users Guide and of version numbers
*
* Rev. 2.2, Removed unused def of TASSEL2
*
********************************************************************/

#ifndef __msp430x11x
#define __msp430x11x

#ifdef  __IAR_SYSTEMS_ICC__
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#endif

#if (((__TID__ >> 8) & 0x7F) != 0x2b)     /* 0x2b = 43 dec */
#error MSP430X44X.H file for use with ICC430/A430 only
#endif


#ifdef __IAR_SYSTEMS_ICC__
#include <in430.h>
#pragma language=extended

#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFW(name, address) __no_init volatile unsigned short name @ address;

#endif  /* __IAR_SYSTEMS_ICC__  */


#ifdef __IAR_SYSTEMS_ASM__
#define DEFC(name, address) sfrb name = address;
#define DEFW(name, address) sfrw name = address;

#endif /* __IAR_SYSTEMS_ASM__*/

#ifdef __cplusplus
#define READ_ONLY
#else
#define READ_ONLY const
#endif

/************************************************************
* STANDARD BITS
************************************************************/

#define BIT0                (0x0001)
#define BIT1                (0x0002)
#define BIT2                (0x0004)
#define BIT3                (0x0008)
#define BIT4                (0x0010)
#define BIT5                (0x0020)
#define BIT6                (0x0040)
#define BIT7                (0x0080)
#define BIT8                (0x0100)
#define BIT9                (0x0200)
#define BITA                (0x0400)
#define BITB                (0x0800)
#define BITC                (0x1000)
#define BITD                (0x2000)
#define BITE                (0x4000)
#define BITF                (0x8000)

/************************************************************
* STATUS REGISTER BITS
************************************************************/

#define C                   (0x0001)
#define Z                   (0x0002)
#define N                   (0x0004)
#define V                   (0x0100)
#define GIE                 (0x0008)
#define CPUOFF              (0x0010)
#define OSCOFF              (0x0020)
#define SCG0                (0x0040)
#define SCG1                (0x0080)

/* Low Power Modes coded with Bits 4-7 in SR */

#ifndef __IAR_SYSTEMS_ICC /* Begin #defines for assembler */
#define LPM0                (CPUOFF)
#define LPM1                (SCG0+CPUOFF)
#define LPM2                (SCG1+CPUOFF)
#define LPM3                (SCG1+SCG0+CPUOFF)
#define LPM4                (SCG1+SCG0+OSCOFF+CPUOFF)
/* End #defines for assembler */

#else /* Begin #defines for C */
#define LPM0_bits           (CPUOFF)
#define LPM1_bits           (SCG0+CPUOFF)
#define LPM2_bits           (SCG1+CPUOFF)
#define LPM3_bits           (SCG1+SCG0+CPUOFF)
#define LPM4_bits           (SCG1+SCG0+OSCOFF+CPUOFF)

#include <In430.h>

#define LPM0      _BIS_SR(LPM0_bits)     /* Enter Low Power Mode 0 */
#define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */
#define LPM1      _BIS_SR(LPM1_bits)     /* Enter Low Power Mode 1 */
#define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */
#define LPM2      _BIS_SR(LPM2_bits)     /* Enter Low Power Mode 2 */
#define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */
#define LPM3      _BIS_SR(LPM3_bits)     /* Enter Low Power Mode 3 */
#define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */
#define LPM4      _BIS_SR(LPM4_bits)     /* Enter Low Power Mode 4 */
#define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */
#endif /* End #defines for C */

/************************************************************
* PERIPHERAL FILE MAP
************************************************************/

/************************************************************
* SPECIAL FUNCTION REGISTER ADDRESSES + CONTROL BITS
************************************************************/

#define IE1_                (0x0000)  /* Interrupt Enable 1 */
DEFC(   IE1               , IE1_)
#define WDTIE               (0x01)
#define OFIE                (0x02)
#define NMIIE               (0x10)
#define ACCVIE              (0x20)

#define IFG1_               (0x0002)  /* Interrupt Flag 1 */
DEFC(   IFG1              , IFG1_)
#define WDTIFG              (0x01)
#define OFIFG               (0x02)
#define NMIIFG              (0x10)

/************************************************************
* WATCHDOG TIMER
************************************************************/
#define __MSP430_HAS_WDT__            /* Definition to show that Module is available */

#define WDTCTL_             (0x0120)  /* Watchdog Timer Control */
DEFW(   WDTCTL            , WDTCTL_)
/* The bit names have been prefixed with "WDT" */
#define WDTIS0              (0x0001)
#define WDTIS1              (0x0002)
#define WDTSSEL             (0x0004)
#define WDTCNTCL            (0x0008)
#define WDTTMSEL            (0x0010)
#define WDTNMI              (0x0020)
#define WDTNMIES            (0x0040)
#define WDTHOLD             (0x0080)

#define WDTPW               (0x5A00)

/* WDT-interval times [1ms] coded with Bits 0-2 */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MDLY_32         (WDTPW+WDTTMSEL+WDTCNTCL)                         /* 32ms interval (default) */
#define WDT_MDLY_8          (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)                  /* 8ms     " */
#define WDT_MDLY_0_5        (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)                  /* 0.5ms   " */
#define WDT_MDLY_0_064      (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)           /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ADLY_1000       (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)                 /* 1000ms  " */
#define WDT_ADLY_250        (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)          /* 250ms   " */
#define WDT_ADLY_16         (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)          /* 16ms    " */
#define WDT_ADLY_1_9        (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)   /* 1.9ms   " */
/* Watchdog mode -> reset after expired time */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MRST_32         (WDTPW+WDTCNTCL)                                  /* 32ms interval (default) */
#define WDT_MRST_8          (WDTPW+WDTCNTCL+WDTIS0)                           /* 8ms     " */
#define WDT_MRST_0_5        (WDTPW+WDTCNTCL+WDTIS1)                           /* 0.5ms   " */
#define WDT_MRST_0_064      (WDTPW+WDTCNTCL+WDTIS1+WDTIS0)                    /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000       (WDTPW+WDTCNTCL+WDTSSEL)                          /* 1000ms  " */
#define WDT_ARST_250        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)                   /* 250ms   " */
#define WDT_ARST_16         (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)                   /* 16ms    " */
#define WDT_ARST_1_9        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)            /* 1.9ms   " */

/* INTERRUPT CONTROL */
/* These two bits are defined in the Special Function Registers */
/* #define WDTIE               0x01 */
/* #define WDTIFG              0x01 */

/************************************************************
* DIGITAL I/O Port1/2

使用特权

评论回复
17
西安化易| | 2007-12-11 01:27 | 只看该作者

论坛长度限制,没有发完,请参见IAR头文件


 

使用特权

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

本版积分规则

21

主题

1050

帖子

0

粉丝