打印

【讨论】“嵌入式裸奔”、“嵌入式OS”、“OS”各适合什么

[复制链接]
19045|105
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
农民讲习所|  楼主 | 2007-12-6 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果你只能用的心:
A)如果你手上是4位MCU?
B)如果你手上是8位MCU?
C)如果你手上是16位MCU?
D)如果你手上是外设不多的32位MCU?
E)如果你手上是外设丰富的32位MCU?
F)如果你手上是外设极其丰富的64位MCU?

你要做什么产品:
a)如果你想做的是民用小产品?
b)如果你想做的是简单控制的工业产品?
c)如果你想做的是复杂控制的工业产品?
d)如果你想做的是高科技产品?
e)如果你想做的是PC?

你将怎么选择:
1)如果你只会“嵌入式裸奔”?
2)如果你只会“嵌入式OS”?
3)如果你只会“OS”?
4)如果你精通其中一种或两种?
5)如果你什么都会?
6)如果你什么都不会?



相关帖子

来自 2楼
农民讲习所|  楼主 | 2007-12-6 16:05 | 只看该作者

俺的“嵌入式裸奔”一个程序

#include "libRain_M128.h"
#include "MyLib.h"

#include "DriverUmIo.h"
#include "ProtocolProtocol.h"

#include "TaskTask.h"
#include "TaskImportKey.h"
#include "TaskPWM_Wkv.h"
#include "TriggleTriggle.h"

#include "TaskXPower.h"
#include "TaskWaterLoop.h"


#include "WorkLedWorkLed.h"


//--------------------------------------------------------
//5ms中断回调函数
//--------------------------------------------------------
void CallBack_5msInterrupt( void )
{
}

//--------------------------------------------------------
//20ms中断回调函数
//--------------------------------------------------------
void CallBack_20msInterrupt( void )
{

}


//--------------------------------------------------------
//析构
//--------------------------------------------------------
void Main_Destory( void )
{
    WatchDog_Destory();

    //--------------------------user---------------------
    Triggle_Destory();
    PWM_Wkv_Destory();
    ImportKey_Destory();
    Task_Destory();

    Protocol_Destory();
    UmIo_Destory();


    //--------------------------System---------------------
    WorkLed_Destory();

    Package_Destory();

    VirtualUart80_Destory();
    Uart80_Destory();
    Uart81_Destory();

    EDataBase_Destory();
    CPU_Eeprom_Destory();

    MyLib_Destory();

}

//--------------------------------------------------------
//初始化
//--------------------------------------------------------
void Main_Init( void )
{
    //--------------------------System---------------------
    MyLib_Init();

    CPU_Eeprom_Init();
    EDataBase_Init( 4, 1, 500, CPU_Eeprom_Cmd );

    Uart80_Setup( OSC_7p3728MHz_4800, (eUart80_NoneChk | eUart80_Stop1Bit), 250, 250 );
    Uart81_Setup( OSC_7p3728MHz_4800, (eUart80_NoneChk | eUart80_Stop1Bit), 250, 250 );
    VirtualUart80_Setup( 200, 200 );                            //配置信息在VirtualUart80_IO.c中

    Package_Init( 3 );                                        //三个协议转换任务

    //--------------------------user---------------------
    UmIo_Init();
    Protocol_Init();

    Task_Init();
    ImportKey_Init();
    PWM_Wkv_Init();
    Triggle_Init();

    XPower_Init();
    WaterLoop_Init();

    WorkLed_Init();
}


//--------------------------------------------------------
//主程序
//--------------------------------------------------------
int main( void )
{
     Main_Init();

    Msg_RunInit();                                            //执行完全部初始化消息
    WatchDog_Init();                                        //看门狗初始化
    sei();

    Package_Send( psUart_Import, eProto_RequAllState );

    //开始主循环
    while(1){
        //--------------------------System---------------------
        MyLib_MainLoop();

        CPU_Eeprom_MainLoop();
        EDataBase_MainLoop();

        VirtualUart80_MainLoop();
        Uart80_MainLoop();
        Uart81_MainLoop();

        Package_MainLoop();

        //--------------------------user---------------------
        UmIo_MainLoop();
        Protocol_MainLoop();

        PWM_Wkv_MainLoop();
        Task_MainLoop();
        ImportKey_MainLoop();
        Triggle_MainLoop();

        XPower_MainLoop();
        WaterLoop_MainLoop();

        WatchDog_MainLoop();

        WorkLed_MainLoop();
    }
}

只要任意再添加一百个任务,即使TCP/IP也可以(当然要改造下),只要MCU能处理过来,同样也可以user下面任何一个任务去掉,而其它任务工作正常。这就是规则和约束的好处。

使用特权

评论回复
来自 3楼
农民讲习所|  楼主 | 2007-12-6 16:59 | 只看该作者

自建库中的消息处理函数中的消息弹出函数

是别的任务传递的消息。


if(  sUmIo.aMessage[eMessage_TriggleMode] != this.mTrigModeTemp )
        {
            //设置发生改变
            sUmIo.aMessage[eMessage_TriggleMode] = this.mTrigModeTemp;

这段可以看到怎么样去检测外部状态改变:只有外部监测状态发生改变,才执行下面代码。而sUmIo.aMessage[eMessage_TriggleMode] 又是IO驱动程序产生的结果。

很多时候不要直接处理,需要各种转换,这样结构清晰,处理效率高,可靠。

使用特权

评论回复
来自 4楼
xwj| | 2007-12-6 17:47 | 只看该作者

呵呵,对于单片机程序,我也一般都是写成mainloop

呵呵,对于单片机程序,我也一般都是写成mainloop

全部做成非独占式状态机,通过信号来耦合,通过状态标志来控制流程
写程序时分配好优先级并画好状态迁移图就一切OK了

基本架构都是:
void main(void)
{
    SysInit();

#if (DEBUG)                     //调试//
    Debug();                    //调试程序
#endif
    
    while(1)
    {
        if (inbuf_sign)
            do_serial();        //串口数据处理程序
        if (outbuf_sign)
            sendcmd();          //发送一个命令包
        if (key_sign)
            do_key();           //按键处理程序
        if (ir_sign)
            do_ir();            //红外处理程序
        if (error_sign)
            do_error();         //按键处理程序
        if (out_time_sign)
            timeout();          //超时处理程序,同时承担软狗的作用
        if(DOG1&&DOG2&&DOGn)
            free_dog();         //有条件喂狗程序,free_dog()里还有一层判断
//        delayms(5);           //延时n mS
    }
}

使用特权

评论回复
5
athlon64fx| | 2007-12-6 14:47 | 只看该作者

沙发

沙发

使用特权

评论回复
6
yewuyi| | 2007-12-6 15:07 | 只看该作者

板凳……

使用特权

评论回复
7
dld2| | 2007-12-6 15:16 | 只看该作者

俺裸奔的时候会戴块手表。

穿衣服的时候希望能冷了加件毛衣,热了脱掉外套。这样才能适应或简单或复杂、或资源紧缺或吃穿不愁的应用环境。

使用特权

评论回复
8
hq_y| | 2007-12-6 15:21 | 只看该作者

这次没有沙发~~~~~~

使用特权

评论回复
9
农民讲习所|  楼主 | 2007-12-6 15:22 | 只看该作者

OS俺不排斥

毕竟“嵌入式黑奔”太难学很多,学好了什么OS都能做出来。但反对“嵌入式黑奔”就是俺要坚决抵制的,“嵌入式黑奔”包含的基础设计理论太多。
基础设计理论学不好,用OS也只是站在巨人脚板上的一只蚂蚁,可千万别认为自己站到了巨人的肩膀上了。

使用特权

评论回复
10
圆圈| | 2007-12-6 15:28 | 只看该作者

赫赫,给我们说说啥叫嵌入式黑奔

我倒是很感兴趣~~~   因为在我经历里,只有普通单片机程序+中断===〉单线程状态机+中断====〉多线程+中断

学习学习

使用特权

评论回复
11
一朝成名| | 2007-12-6 15:29 | 只看该作者

农民已经超脱入境了...牛....

使用特权

评论回复
12
dai_weis| | 2007-12-6 15:31 | 只看该作者

4Bit的就不要想OS了

基本上连使用C编程都被禁止了,哪有那么多的地方?
8Bit的要看FLASH和RAM的大小,太小的话,想不裸奔都难,撑爆了可就飞程序了

使用特权

评论回复
13
圆圈| | 2007-12-6 15:45 | 只看该作者

真是晕倒了

我把ucos代码可是基本都读懂了的,对于如何实现任务调度,内存管理我也可是比较清楚实现细节的,所以我也说过,不是你写不了普通得os,而问题是有没必要,而且你得os稳定吗?  真不想说这些没实质性的东西~~

使用特权

评论回复
14
农民讲习所|  楼主 | 2007-12-6 15:48 | 只看该作者

和OS一样

“嵌入式裸奔”相对于“裸奔”,多了可以大幅度提高了程序的健壮性的许多规则和约束,多了可以高度复用代码的模块标准化、可以最小代码化的可裁剪化,有OS特点,无OS讲究的通用性。


使用特权

评论回复
15
农民讲习所|  楼主 | 2007-12-6 15:53 | 只看该作者

俺做的比LINUX和WINCE还稳定,何况ucos

使用特权

评论回复
16
athlon64fx| | 2007-12-6 16:06 | 只看该作者

不排斥OS,也不是所有的情况下OS都比裸奔好..

如果裸奔是徒步,那么OS就好比驾车..而车也要分自行车,摩托车,汽车,火车等..
个人以为这个比喻比较恰当。

使用特权

评论回复
17
chunyang| | 2007-12-6 16:11 | 只看该作者

同意所长的说法

    基础设计理论学不好,用OS也只是站在巨人脚板上的一只蚂蚁,可千万别认为自己站到了巨人的肩膀上了。

    

使用特权

评论回复
18
athlon64fx| | 2007-12-6 16:15 | 只看该作者

所长的程序架构已经类似于合作式OS了,

我以前是这样的,

uint8_t s = wait_signal(TIMEOUT | ADC | KEY, timeout);

if(s & TIMEOUT)
    // ...
if(s & ADC)
    // ...
if(s & KEY) {
    switch(get_key()) {
        case KEY_UP:
            // ...
        default:
            // ...
    }
}

使用特权

评论回复
19
圆圈| | 2007-12-6 16:22 | 只看该作者

恩,看了

也就是你现在将系统划分为三条线|任务,对吧。两条中断任务(你将他设计成任务了),另外一条主循环任务,主循环放非实时处理任务,两个中断任务满足更强的实时性需求。应该是这样吧~~

没错,这个程序基本算是个通用的模式了~  一般情况下确实能满足需求了。不过并不是所有需求都能满足的,因为你的中断处理能力毕竟是受限制的,而且你的任务只有这么几个,你不可能再多开个八个10个任务吧,如果你认为将这些任务放到其中某个任务内串接就算解决问题的话,那对我来说,不管如何加,实质上这都还只是3个任务(线程)。这个我想也是赞同的吧~

不过呢,你的框架结构确实通用,可移植性也强。但是你把刀玩神了之余可也不能忘记外面还有飞机大**坦克的啊~~  赫赫~~  我这么说不要生气,没有恶意的实话~~

使用特权

评论回复
20
农民讲习所|  楼主 | 2007-12-6 16:29 | 只看该作者

OS处理中断能力比这个快?

俺可以用全部时间去响应中断去了,即使“(5)20ms中断回调函数”在小系统里面也可以改为查询方式,所有中断是极其极其快响应,OS肯定比不上。这可是可裁剪出来的。

使用特权

评论回复
21
dcp| | 2007-12-6 16:34 | 只看该作者

听课...

使用特权

评论回复
22
农民讲习所|  楼主 | 2007-12-6 16:34 | 只看该作者

所有实时,经过分层后,向下层转换了

最后转到主循环,这时候还讲究优先级别是没任何意义的。

使用特权

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

本版积分规则

22

主题

1275

帖子

15

粉丝