打印

带os到底比不带os有哪些优势?

[复制链接]
楼主: doob
手机看帖
扫描二维码
随时随地手机跟帖
61
现实主义| | 2007-11-13 11:21 | 只看该作者 回帖奖励 |倒序浏览

关于dsp的OS

国内是很少用。
但是据说例如ti的DSP/BIOS国外用的就很多。

要不为什么国内的搞单片机的是电工呢.不求上进。
显然,哪怕是搞UCOS,也要费一把力气学习一下。

使用特权

评论回复
62
vimman| | 2007-11-13 12:34 | 只看该作者

8楼,我觉得...

8楼,我觉得你举的例子不是很恰当;比较简单的办法是注册用户定时器;只要软件允许开启关闭软件定时器就应该能实现你所描述的要求,用OS反而更迷茫。另外,个人觉得OS和屏蔽底层没有太大关系,移植OS的时候还不是移植底层的东西。即便是winCE系统也不能脱离BSP(底层驱动)而存在啊。我觉得OS最大的好处就是能够自动决定你哪部分代码在合适的时刻运行或者停止运行,而程序不用过多地细节考虑。

使用特权

评论回复
63
wxj1952| | 2007-11-13 12:36 | 只看该作者

求助农民讲习所

农民老师能不能为我们菜鸟先裸奔一个51上的OS系统心跳看看?假设1Hz的。那边也有菜鸟在求助这个程序呢。农民讲师一奔就是几千行,不会连10行的程序都懒得写吧。

使用特权

评论回复
64
ayb_ice| | 2007-11-13 14:04 | 只看该作者

我是跑了一段时间RTOS,现在又回归裸奔了

使用特权

评论回复
65
huangqi412| | 2007-11-13 14:37 | 只看该作者

听的挺精彩

使用特权

评论回复
66
forthlab| | 2007-11-13 15:03 | 只看该作者

ayb_ice:能说说么?

" 我是跑了一段时间RTOS,现在又回归裸奔了"
----------------------------------------------
欲听其详.....

使用特权

评论回复
67
ddb_21ic| | 2007-11-13 15:08 | 只看该作者

支持OS,不过8位MCU就算了

使用特权

评论回复
68
static| | 2007-11-13 15:22 | 只看该作者

带OS的话,单片机可以处于休眠省电状态吗?

如题....

使用特权

评论回复
69
computer00| | 2007-11-13 15:28 | 只看该作者

可以的,我的ARM-00-OS在空闲任务就是进入到省电模式

不过首先要硬件支持才行. 


相关链接:http://blog.21ic.com/user1/2198/archives/2006/24820.html

使用特权

评论回复
70
ayb_ice| | 2007-11-13 15:29 | 只看该作者

简单点说就是尽量去模拟RTOS的思想

使用特权

评论回复
71
农民讲习所| | 2007-11-13 15:43 | 只看该作者

前后台里面省电很简单:

这是一个AVR的例子:
#include <libRain_Base.h>
#include <libRain_M169.h>

#include "DriverLcdDrvLcdDrv.h"
#include "DriverDADA.h"
#include "DriverLEDLED.h"
#include "DriverSysIdleSysIdle.h"

#include "TaskTask.h"

//--------------------------------------------------------
//主初始化
//--------------------------------------------------------
void Main_Init( void )
{
    ACSR |= (1<<ACD);

    Memory_InitDefault();
    SysTimer_Query_Init( SYSTIMER_QUERY_FREQ_3M6864 );

    //驱动
    LcdDrv_Init();
    DA_Init();
    ADC_Init( ADC_REF_AVCC, ADC_3p6864MHz_115p2KHz );
    LED_Init();
    SysIdle_Init();

    Msg_InitDefault( 30 );
    DdFilter_Init();

    //Task
    Task_Init();
}

//--------------------------------------------------------
//主析构
//--------------------------------------------------------
void Main_Destory( void )
{
    cli();
    Task_Destory();

    DdFilter_Destory();
    Msg_Destory();

    //驱动
    SysIdle_Destory();
    LED_Destory();
    ADC_Destory();
    DA_Destory();
    LcdDrv_Destory();

    SysTimer_Query_Destory();
    Memory_Destory();
}

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

    Lcd_LowPower_Enable();

    sei();
    while(1){
        Memory_MainLoop();

        Msg_MainLoop();
        SysTimer_Query_MainLoop();
        //必须放在此处,紧接消息和系统时间模块
        SysIdle_MainLoop();

        //驱动
        ADC_MainLoop();
        DA_MainLoop();
        LcdDrv_MainLoop();
        LED_MainLoop();

        DdFilter_MainLoop();

        //Task
        Task_MainLoop();
    }
}

因为是事件驱动,所以无事件和中断时自动进入IDLE省电。只要遵守事件驱动原则,任何规模的程序都可以这样简单的省电操作。
事件驱动:状态变化时触发处理。这里采用消息队列存储发生的事件。

SysIdle.c:

//-------------------------------------------------------------
//运行中空闲模式
//-------------------------------------------------------------
#include <libRain_Base.h>
#include <libRain_M169.h>

//-------------------------------------------------------------
//省电模式
//-------------------------------------------------------------
void InSysIdle_Idle( void )
{
    U8 mTemp;
    
    mTemp = TIMSK0;
    TIMSK0 |= ( 1<<OCIE0A );
    SMCR = (1<<SE) | (0<<SM2)|(0<<SM1)|(0<<SM0);    //空闲模式
    __asm__ __volatile__("SLEEP");
    
    TIMSK0 = mTemp;
}

//-------------------------------------------------------------
//运行中空闲
//消息空且系统时间未触发,进入。中断退出。
//-------------------------------------------------------------
void SysIdle_Loop( void )
{
    if( ( sMsg.aReadMsgBuffer[0] == 0 ) && ( !sSysTimer.bSysTouch ) )
    {
        //无消息发出, 无系统时间触发,开始进入空闲模式
        InSysIdle_Idle();
    }

}

//-------------------------------------------------------------
//T0中断
//因系统时间使用T0查询,退出省电模式需中断,故有此函数.中断产生不用.
//-------------------------------------------------------------
SIGNAL( SIG_OUTPUT_COMPARE0 )
{
    sSysTimer.bSysTouch = true;
    TIMSK0 &= ~( 1<<OCIE0A );
}

使用特权

评论回复
72
dld2| | 2007-11-13 16:01 | 只看该作者

顶所长

SysIdle_Loop疑是SysIdle_MainLoop之误。

使用特权

评论回复
73
农民讲习所| | 2007-11-13 16:05 | 只看该作者

在H文件中用宏

#ifndef __SYSIDLEH
#define __SYSIDLEH

    //-------------------------------------------------------------
    //初始化
    //-------------------------------------------------------------
    #define SysIdle_Init()            do{ ;}while(0)
    
    //-------------------------------------------------------------
    //析构
    //-------------------------------------------------------------
    #define SysIdle_Destory()        do{ ;}while(0)

    //-------------------------------------------------------------
    //运行中省电
    //消息空且系统时间未触发,进入。中断退出。
    //-------------------------------------------------------------
    extern void SysIdle_Loop( void );

    #define SysIdle_MainLoop()        do{ SysIdle_Loop();}while(0)

#endif

这样可以加入口条件,加快运行速度。比如 
#define SysIdle_MainLoop()    do{ if(sSysTimer.bSysTouch){SysIdle_Loop();}}while(0)

使用特权

评论回复
74
现实主义| | 2007-11-13 16:17 | 只看该作者

用OS就是为了把精力放到

用OS就是为了把精力放到项目专有的部分。
如果任务复杂了,还要来模拟OS,根本就得不偿失。

有什么意义啊?何况程序的健壮性根本难以保证。

现在单片机的速度越来越快,资源越来越丰富,用OS是趋势,哪怕只是UCOS.

使用特权

评论回复
75
农民讲习所| | 2007-11-13 16:26 | 只看该作者

俺做成标准库,比OS代码还少

OS的健壮性是很差的,特别是不同任务之间的耦合,乱用OS是BUG的根源。

谁说MCU上OS是趋势?乱说是要打PP的。

前面俺例子不就说明:遵守设计规则,健壮性比OS强太多了。1年就搞定,LINUX要2年。
那个代码设计良为200W行,代码200K,说明什么问题?说明极其遵守设计原则。

使用特权

评论回复
76
农民讲习所| | 2007-11-13 16:27 | 只看该作者

俺就怕LS这种似懂非懂的说高不高说低不低的高手

扯皮啊

使用特权

评论回复
77
dld2| | 2007-11-13 16:30 | 只看该作者

继续模拟:taskDelay

taskDelay可以用状态机来实现:
一个任务在需要delay时改变状态,然后退出。
下次进入时如果是该状态,判断定时超时。如果没有超时,退出;如果超时,继续处理。
用在Delay次数比较少的情况下。

裸奔也是一种现实主义。

使用特权

评论回复
78
农民讲习所| | 2007-11-13 16:38 | 只看该作者

MCU上用OS的好处

1)初学者上手快
2)有资源共享
其它好象没什么。反而坏处多。

用裸奔要学习很多的设计理论,时间长点。如果大家水平都上去了,采用标准库来设计,资源同样可以共享。难度大点。

使用特权

评论回复
79
现实主义| | 2007-11-13 16:50 | 只看该作者

我怎么觉得是大言不惭呢

"前面俺例子不就说明:遵守设计规则,健壮性比OS强太多了。"

我怎么觉得是大言不惭呢?

使用特权

评论回复
80
农民讲习所| | 2007-11-13 16:51 | 只看该作者

扯皮开始?

使用特权

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

本版积分规则