搜索
bottom↓
回复: 13

Small RTOS FOR AVR(ATmega16)(第三版)

[复制链接]

出0入0汤圆

发表于 2007-5-14 21:16:06 | 显示全部楼层 |阅读模式
我是AVR新手,移植Small RTOS是学AVR做的第一件事,欢迎测试,期待高手指点。

更新:修复EN_OSStkChk BUG



根据AVR实际情况,改动原版Small RTOS51的地方:

1.任务切换保存全部32个寄存器,SREG,Os_Enter_Sum和返回地址(共36字节),不区分任务快速切换和一般任务切换,OSCtxSw()和OSIntCtxSw()为同一函数。

#define OSIntCtxSw()        OSCtxSw()  //在OS_CPU.h。

2.空闲任务OSIdle()也有自己一份堆栈。

3.不是将所有剩余SRAM空间分配给系统堆栈,系统堆栈空间大小由自己设定

#define         OS_STACK_SIZE         512                //在OS_CPU.h,系统堆栈空间大小(包括空闲任务OSIdle的堆栈)

4.新加EN_OSStkChk,在OS_CPU.h里,#define EN_OSStkChk                        1

根据两个全局变量OS_Stk_Null,OS_Stk_Min_Null查看切换任务时系统堆栈剩余大小。可以参考此值调整OS_STACK_SIZE大小。

5.非系统管理中断(不受OS_ENTER_CRICITAL()影响)用法:

打开非系统管理中断编译开关

#define EN_SP2                        1  //在OS_CPU.h

定义非系统管理中断预留堆栈大小

#define          Sp2Space            32          //在OS_CPU.h

改写三个宏

OS_ENTER_CRITICAL():打开总中断,关闭系统管理中断(包括系统时钟中断),Os_Enter_Sum加一

OS_ENTER_EXIT ():Os_Enter_Sum减一,如果为0,则打开总中断,打开系统管理中断(包括系统时钟中断)

OS_SET_INT打开总中断(R0暂存SREG,将R0最高位置位即可,不要直接操作SREG),打开系统管理中断(包括系统时钟中断),不需要对Os_Enter_Sum减一操作,

注意:非系统管理中断中不能再开中断。



测试例子12个任务控制12个LED闪烁,硬件连线:

PORTB0-------------------LED0        //20ms闪烁一次

PORTB1-------------------LED1         //40ms闪烁一次

PORTB2-------------------LED2         //80ms闪烁一次

PORTB3-------------------LED3        //160ms闪烁一次

PORTB4-------------------LED4        //320ms闪烁一次

PORTB5-------------------LED5        //640ms闪烁一次

PORTB6-------------------LED6        //1.28s闪烁一次

PORTB7-------------------LED7        //2.56s闪烁一次

PORTD0-------------------LED8        //5.12s闪烁一次       

PORTD1-------------------LED9         //10.24s闪烁一次

PORTD2-------------------LED10        //20.48s闪烁一次

PORTD3-------------------LED11  //40.96s闪烁一次





#include "config.h"





#define LED_PORT0        PORTB

#define LED_DDR0        DDRB

#define LED_PORT1        PORTD

#define LED_DDR1        DDRD



void Task0(void)

{

        LED_PORT0=0XFF;

        LED_DDR0=0XFF;

        LED_PORT1=0X0F;

        LED_DDR1=0X0F;





        while(1)

        {

        OSWait(K_TMO,OS_TICKS_PER_SEC/50);

        LED_PORT0^=_BV(0);                                //20ms闪烁一次

        OSSendSignal(1);

        }

}





void Task1(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);               

        }

        LED_PORT0^=_BV(1);                //40ms闪烁一次

        OSSendSignal(2);

        }



}



  void Task2(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);               

                }

        LED_PORT0^=_BV(2);        //80ms闪烁一次

        OSSendSignal(3);

        }



}



  void Task3(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);               

                }

        LED_PORT0^=_BV(3);                //160ms闪烁一次

        OSSendSignal(4);

        }



}



  void Task4(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);               

                }

        LED_PORT0^=_BV(4);                //320ms闪烁一次

        OSSendSignal(5);

        }



}

   void Task5(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);               

                }

        LED_PORT0^=_BV(5);                //640ms闪烁一次

        OSSendSignal(6);

        }



}



   void Task6(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);               

                }

        LED_PORT0^=_BV(6);                        //1.28s闪烁一次

        OSSendSignal(7);

        }



}

    void Task7(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);        //2.56s闪烁一次       

                }

        LED_PORT0^=_BV(7);

        OSSendSignal(8);

        }



}

    void Task8(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);        //5.12s闪烁一次       

                }

        LED_PORT1^=_BV(0);

        OSSendSignal(9);

        }



}



     void Task9(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);                //10.24s闪烁一次       

                }

        LED_PORT1^=_BV(1);

        OSSendSignal(10);

        }

}



     void Task10(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);                //20.48s闪烁一次

                }

        LED_PORT1^=_BV(2);

        OSSendSignal(11);

        }

}





     void Task11(void)

{

uint8 i;

                while(1)

        {

        for(i=0;i<2;i++)

                {

                OSWait(K_SIG,0);                //40.96s闪烁一次       

                }

        LED_PORT1^=_BV(3);

        }

}



点击此处下载armok01154097.rar





-----此内容被ATmega8515于2007-05-14,21:16:33编辑过


-----此内容被ATmega8515于2007-05-14,21:42:03编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-5-14 21:36:27 | 显示全部楼层
这么好的东西    我先顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2007-5-14 21:52:01 | 显示全部楼层
在好多地方见过 ATmega8515 这个会员名字。

出0入0汤圆

发表于 2007-5-14 23:12:03 | 显示全部楼层
关注

出0入0汤圆

发表于 2007-5-14 23:40:03 | 显示全部楼层
再关注!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2007-5-15 08:10:35 | 显示全部楼层
顶顶!!

出0入0汤圆

发表于 2007-5-15 19:40:59 | 显示全部楼层
什么运行环境,用的那个C编译器

出0入0汤圆

发表于 2007-5-16 14:05:26 | 显示全部楼层
是Keil 自带的实时系统吗?

出0入0汤圆

发表于 2007-6-20 08:38:15 | 显示全部楼层
先顶

再用用看!!!!!

出0入0汤圆

发表于 2007-6-20 09:16:27 | 显示全部楼层
什么运行环境?????顶顶

出0入0汤圆

发表于 2007-6-20 09:20:06 | 显示全部楼层
太乱,以后整理下在发上来。



Small rtos 将所有任务堆栈分配给当前任务,用时间换空间,在51上优点,在AVR上反而是累赘。8个任务,1K任务堆栈,SMALL RTOS切换任务就非常慢,严重影响了中断的实时性。



还有,非系统管理中断还是有问题,原因是任务切换的时候,会把所有系统管理中断打开,

导致任务中无法对系统管理中断进行控制。

出0入0汤圆

发表于 2011-7-12 13:41:58 | 显示全部楼层
多谢楼主了!我也正在学习RTOS,也想移植到AVR,学习了!

出0入0汤圆

发表于 2012-2-23 15:44:59 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-2-25 10:16:08 | 显示全部楼层
恩,先下载消化后在发表评论!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 23:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表