搜索
bottom↓
回复: 62

C代码移植的实时操作系统small RTOS for AVR with GCC ,欢迎测试

[复制链接]

出0入0汤圆

发表于 2005-7-14 20:18:07 | 显示全部楼层 |阅读模式
1、动态堆栈,静态堆栈可选

2、不用在考虑函数的可重入的问题

3、内核具有的小的数据结构,和少的代码量,适合用在mega8~mega32里面,只占用5~15%的rom资源

4、全部是由C语言写成,具有重要的学习价值。



以下是连接:

    第一个:静态堆栈

    第二个:动态堆栈



点击此处下载armok0157106.rar

点击此处下载armok0157107.rar

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

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
头像被屏蔽

出0入0汤圆

发表于 2005-7-14 22:08:36 | 显示全部楼层
谢谢共享!

出0入0汤圆

发表于 2005-7-14 23:05:06 | 显示全部楼层
谢谢。

出0入0汤圆

发表于 2005-7-15 00:36:02 | 显示全部楼层
好东西!

出0入0汤圆

发表于 2005-7-15 08:23:33 | 显示全部楼层
谢谢先!!

出0入0汤圆

发表于 2005-7-15 21:49:56 | 显示全部楼层
这么好的资料没有人顶,而一些普通内容却很热,喜欢钻研的人少啊

出0入0汤圆

发表于 2005-7-15 22:02:22 | 显示全部楼层
void OSIntCtxSw(void)

{

        uint8 * cp ;

        SP += 4;                                                       

        ExtraPush();            这里是什么意思,没看明白。被点说明。谢谢!

        cp = (uint8 *)SP;   

        *cp-- = Os_Enter_Sum ;

        *cp-- = (uint8)(uint16)LinkCtxSw;

        *cp-- = (uint8)((uint16)LinkCtxSw/256);

        SP = (uint16)cp;

        __asm__ __volatile__("reti");       

}

出0入0汤圆

发表于 2005-7-16 10:02:32 | 显示全部楼层
谢谢。

出0入0汤圆

 楼主| 发表于 2005-7-17 17:55:36 | 显示全部楼层
ExtraPush()是一个宏在OS_CPU.H里面有定义,您一看就会明白。





-----此内容被qjhu0433于2005-07-17,18:00:38编辑过

出0入0汤圆

发表于 2005-7-18 21:18:37 | 显示全部楼层
smalll RTOS的自由堆栈最大是256字节,我还未详细看过qjhu0433仁兄的代码,敢文移植过来的small RTOS for avr 对自由堆栈的大小有没有重新调整,否则AVR片内SRAM比51的丰富的优势就失去了,最终使得移植过来的RTOS在使用上很受限制。

晚辈对仁兄表示至深的敬意!

出0入0汤圆

发表于 2005-7-18 22:12:02 | 显示全部楼层
搂主,改变了 SmallRTOS 的一些原貌。 对内存的要求更大了。

出0入0汤圆

 楼主| 发表于 2005-7-19 08:22:08 | 显示全部楼层
是啊,我改变了堆栈的处理方式,已经和原来的small RTOS51处理堆栈的方式大不一样了,与uC/OS-ii处理堆栈的方式是一致的,这样更合理的使用了avr里面的大RAM。加快了任务切换的速度,4MHz时钟频率时,任务切换可以低至76us,使内核本身占用CPU资源更少。

出0入0汤圆

发表于 2005-8-29 13:24:51 | 显示全部楼层
要是能移植到ICC就好了~~~~

出0入0汤圆

发表于 2005-8-30 11:16:32 | 显示全部楼层
十分感谢,这样的东西拿出来给大家分享,是不是阿莫有什么奖励活动的时候,一定要想到这位楼主呢?

另外:有个问题,静态和动态是什么区别?哪个更好一些呢?

出0入0汤圆

发表于 2005-8-30 23:22:58 | 显示全部楼层
十分感谢,真的不错,不过我发现了一个问题,不用OS的时候呢,中断里面的变量可以用,但是用了OS以后呢,中断里的变量不能被任务调用,还望指导!

1:我的中断是ADC中断,被任务三调用中断里面的变量,不能用该变量,但是中断是在执行的

如果不用OS的时候呢,可以用中断里面的变量

2:因为中断里的变量不能用,我改成中断函数象任务3发送一个信号调用:OSIntSendSignal (uint8 TaskId);,但是,发现不行,不知道是OSIntSendSignal (uint8 TaskId);不好用,还是OSWait(K_SIG,10);,有问题

-----此内容被lcqqcl于2005-08-30,23:26:41编辑过


-----此内容被lcqqcl于2005-08-31,01:13:32编辑过

出0入0汤圆

发表于 2005-8-31 09:39:05 | 显示全部楼层
这的确是一个好东西 顶一下

中断内的变量一般用消息来发送给任务

或者你申请一个全局数组来存储

出0入0汤圆

发表于 2005-9-3 20:00:51 | 显示全部楼层
lcqqcl

请容我说一句

不管怎么样

请你不要破坏这里的气氛好么?

出0入0汤圆

发表于 2005-9-3 21:46:57 | 显示全部楼层
violit

我不是破坏气氛,你不觉的你很滑稽吗?这里是技术交流的地方,可以说只要在这里提出了问题,都是实践中遇到的不能解决的问题,如果在不懂的情况下,乱提建议,这样给调试的人带来多大的苦恼,多走多少弯路.

另外,请问violit:

你调试过程序吗?你知道在遇到困难的时候要调试多长时间吗?

发言是要付责任的,这是做人的基本道理.

如果大家都看到着个贴子不知道谁有道理,你自己想想吧!



为了弄清楚着个问题,我晚上要调试到2点,现在终于弄明白了!



我看了一下论坛,发现violit你可能是一个高手,我不知道,但是你正在用RTOS,你为什么不

帮忙解决问题,搞这没用的做什么呢?
-----此内容被lcqqcl于2005-09-03,22:32:50编辑过
头像被屏蔽

出0入0汤圆

发表于 2005-9-4 07:39:23 | 显示全部楼层
请lcqqcl注意用词。



“乱发言”、“不屑一顾”、“滑稽”等词,都是技术交流中尽量避免使用的。

出0入0汤圆

发表于 2005-9-4 11:39:13 | 显示全部楼层
既然ARM你这样说我无话可说了,事实自有公断.我要澄清一下:

1:我说的"滑稽"

           

               不是评论人家的技术问题"滑稽",而是他这种不帮忙解决问题,来评论人家的发言是滑稽的,(ARMOK,我不知道你的中文怎么样)



2:针对"乱发言"

               我说过了,只要是碰到问题的,都是暂时解决不了的.我说了中断里的变量不能被任务调用,难道还不明白这是全局变量吗?那个仁兄,居然建议我设"全局数组",请问:既然全局变量都不能用了,全局数组就能用?!!!!!!



3:关于"不屑一顾"

       请大家看一下这个帖子,有很多高手,对这个贴子技术方面的问题都进行了评论,相反,我一点都不懂,我只是学习着用.对于RTOS具体是怎样工作的我一点都不懂,既然那么多精通的人,我的问题居然没有一个人解决,我看来有两种可能:

                                    1;就是对我的问题不屑一顾

                                    2;



ARMOK:

           1   我没有用"滑稽""不屑一顾"来形容别人的技术,我是说的这种做法

           2   "乱发言" 我认为我用的没错,请ARMOK看一下我的问题,然后再看一下别人的回        复           




-----此内容被lcqqcl于2005-09-04,11:56:47编辑过

出0入0汤圆

发表于 2005-9-8 01:07:32 | 显示全部楼层
#define ExtraPush()                        \

{                                                        \

__asm__ __volatile__(                \

"PUSH R2"   "
\t"                        \

"PUSH R3"        "
\t"                        \

"PUSH R4"        "
\t"                        \

"PUSH R5"   "
\t"                        \

"PUSH R6"        "
\t"                        \

"PUSH R7"        "
\t"                        \

"PUSH R8"   "
\t"                        \

"PUSH R9"        "
\t"                        \

"PUSH R10"        "
\t"                        \

"PUSH R11"  "
\t"                        \

"PUSH R12"        "
\t"                        \

"PUSH R13"        "
\t"                        \

"PUSH R14"  "
\t"                        \

"PUSH R15"        "
\t"                        \

"PUSH R16"        "
\t"                        \

"PUSH R17"        "
\t"                        \

"PUSH R28"  "
\t"                        \

"PUSH R29"        "
\t"                        \

);                                                        \

}





#define POPALL()                        \

{                                                        \

__asm__ __volatile__(                \

"POP R29"                "
\t"                \

"POP R28"                "
\t"                \

"POP R17"           "
\t"                \

"POP R16"           "
\t"                \

"POP R15"           "
\t"                \

"POP R14"           "
\t"                \

"POP R13"           "
\t"                \

"POP R12"           "
\t"                \

"POP R11"           "
\t"                \

"POP R10"           "
\t"                \

"POP R9"            "
\t"                \

"POP R8"            "
\t"                \

"POP R7"            "
\t"                \

"POP R6"            "
\t"                \

"POP R5"            "
\t"                \

"POP R4"            "
\t"                \

"POP R3"            "
\t"                \

"POP R2"            "
\t"                \

"POP R31"                  "
\t"          \

"POP R30"                  "
\t"          \

"POP R27"                  "
\t"          \

"POP R26"                  "
\t"          \

"POP R25"                  "
\t"          \

"POP R24"                  "
\t"          \

"POP R23"                  "
\t"          \

"POP R22"                  "
\t"          \

"POP R21"                  "
\t"          \

"POP R20"                  "
\t"          \

"POP R19"                  "
\t"          \

"POP R18"                  "
\t"          \

"POP R0"                   "
\t"          \

"OUT 0x3F,R0"          "
\t"          \

"POP R0"                   "
\t"          \

"POP R1"                   "
\t"          \

);                                                        \

}



#define PUSHALL()           \

{                                                        \

__asm__ __volatile__(                \

"PUSH R1"                   "
\t"         \

"PUSH R0"                   "
\t"          \

"IN R0,0x3F"           "
\t"          \

"PUSH R0"                   "
\t"          \

"PUSH R18"           "
\t"          \

"PUSH R19"           "
\t"          \

"PUSH R20"           "
\t"          \

"PUSH R21"           "
\t"          \

"PUSH R22"           "
\t"          \

"PUSH R23"           "
\t"          \

"PUSH R24"           "
\t"          \

"PUSH R25"           "
\t"          \

"PUSH R26"           "
\t"          \

"PUSH R27"            "
\t"          \

"PUSH R30"                 "
\t"                \

"PUSH R31"                 "
\t"                \

"PUSH R2"            "
\t"                \

"PUSH R3"                 "
\t"                \

"PUSH R4"                 "
\t"                \

"PUSH R5"            "
\t"                \

"PUSH R6"                 "
\t"                \

"PUSH R7"                 "
\t"                \

"PUSH R8"            "
\t"                \

"PUSH R9"                 "
\t"                \

"PUSH R10"                 "
\t"                \

"PUSH R11"           "
\t"                \

"PUSH R12"                 "
\t"                \

"PUSH R13"                 "
\t"                \

"PUSH R14"           "
\t"                \

"PUSH R15"                 "
\t"                \

"PUSH R16"                 "
\t"                \

"PUSH R17"                 "
\t"                \

"PUSH R28"                  "
\t"                \

"PUSH R29"                 "
\t"                \

);                                                        \

}



define ExtraPush()  #define PUSHALL() 为什么要写成两个

"PUSH R1"                   "
\t"         \

"PUSH R0"                   "
\t"          \

"IN R0,0x3F"           "
\t"          \              为什么要用0x3F ,请问有什么用

"PUSH R0"                   "
\t"          \

出0入0汤圆

发表于 2005-9-8 01:12:50 | 显示全部楼层
0x3F 原来是 SREG 现搞懂呢,保存此变量

define ExtraPush()  #define PUSHALL() 还不是懂呢

出0入0汤圆

发表于 2005-9-15 11:01:32 | 显示全部楼层
楼主是否能写一些应用实例给我们这些菜鸟?或者干脆出本书。

出0入0汤圆

 楼主| 发表于 2005-11-24 10:44:34 | 显示全部楼层
好久没上来了,这段时间有用small RTOS for AVR和Mega16做了个新项目,发现了一些新问题,主要是OS管理中断上的问题,经过我长时间的测试,发现只能用OS管理一个中断,其他的中断不能纳入管理,这样损失一点实时性能,用起来还不错,现在那个项目已完成.目前我正在尝试AVRX,看看能不能给我一点启发.



在用RTOS和Mega16做完项目后,我发现small RTOS for AVR有了一些变化,主要是使用C++封装对IO口的操作可以和51相媲美,还封装OS管理中断的接口,虽然目前还有些未查明的问题.最近公司的开发任务比较多,稍后我整理几个工程发上来,共同研究一下.



AVR & avr-g++ & RTOS & C++所有的这些是给解决问题带来复杂性,但世界本来就是复杂的,同样也是精彩的.


-----此内容被qjhu0433于2005-11-24,10:49:02编辑过

出0入0汤圆

发表于 2005-12-21 14:41:31 | 显示全部楼层
美中不足啊,要是楼主能在OS里面设置中断优先级就好了,使用定时器0以后比定时器0优先级高的中断就不能在OS里面应用了。

出0入0汤圆

发表于 2005-12-21 18:23:56 | 显示全部楼层
我上面的发言是错误的:在使用了OS以后,外部中断0能使用(已经验证),但是定时器1不能用了(正在实验使用),目前发现不能用定时器1,输入捕获中断也不能用.我推测在该OS里面和定时器1有关的中断都不能用

出0入0汤圆

发表于 2006-5-30 21:22:08 | 显示全部楼层
各位兄弟,谁有移植到AVR单片机的RTOS,能否传给小弟一份,小弟迫切需要,谢谢

!!!

   我的邮箱:lgzxq@hzvtc.net

出0入0汤圆

发表于 2007-3-25 17:52:29 | 显示全部楼层
#define  OS_ENTER_CRITICAL()  cli();Os_Enter_Sum++              /* 禁止中断*/





是不是该改成:

#define  OS_ENTER_CRITICAL()  cli(),Os_Enter_Sum++   

或者

#define  OS_ENTER_CRITICAL()  {cli();Os_Enter_Sum++;}

出0入0汤圆

发表于 2007-3-27 17:49:59 | 显示全部楼层
确实是好东西呀,顶

出0入0汤圆

发表于 2007-4-7 11:01:36 | 显示全部楼层
很棒

谢谢!

出0入0汤圆

发表于 2007-4-7 11:51:16 | 显示全部楼层
还是楼主厉害啊,很早我就想做这件事情了,可惜一直没搞懂RTOS的内核

出0入0汤圆

发表于 2007-4-7 17:24:57 | 显示全部楼层
郁闷~。中断很不好用~~~

出0入0汤圆

发表于 2007-4-7 17:28:16 | 显示全部楼层
用了中断后,有些任务不正常。搞不懂。

出0入0汤圆

发表于 2007-8-22 22:57:13 | 显示全部楼层
不顶真的不行啊

出0入0汤圆

发表于 2007-9-14 09:51:33 | 显示全部楼层
问题都没人回答??

出0入0汤圆

发表于 2007-10-22 09:43:54 | 显示全部楼层
其它中断不可用的原因,可能是你没开!!!
void OSTickInit(void)
{
         TCCR0 = 0;
         TCCR0 |= (1<<CS02);              /*  256预分频          */
         TIMSK |= (1<<TOIE0);              /*  T0溢出中断允许  */
         TCNT0 = (256-CPU_OSC/256/OS_TICKS_PER_SEC);                /* 置计数起始值 */  
}
若要用TIME1,需要修改“TIMSK |= (1<<TOIE0);”为“TIMSK |= (1<<TOIE1);”。

楼主,建议增加各不同芯片的初始化函数,需要根据芯片及使用自己修改。虽麻烦,但是必要的啊~~~~~~

出0入0汤圆

发表于 2007-10-26 17:27:00 | 显示全部楼层
高手,多多交流

出0入0汤圆

发表于 2007-12-1 22:01:10 | 显示全部楼层
请给一些测试例程呀!帮帮我这个菜鸟啊!谢了

出0入0汤圆

发表于 2007-12-1 22:01:51 | 显示全部楼层
请给一些简单测试例程呀!帮帮我这个菜鸟啊!谢了

出0入0汤圆

发表于 2007-12-2 13:33:31 | 显示全部楼层
中断的问题应该是移植的问题
好几个RTOS都采用一样的移植:定义一下寄存器变量,防止被编译器占用。
这样的移植降低了单片机的运行效率。

出0入0汤圆

发表于 2009-2-21 20:04:19 | 显示全部楼层
陈明计吗???????

出0入0汤圆

发表于 2009-2-22 19:55:27 | 显示全部楼层
谢谢,留个记号

出0入0汤圆

发表于 2009-2-22 21:44:56 | 显示全部楼层
下了研究研究,假期刚刚学会small RTOS for 51,现在转学avr正愁它没往avr上移植呢。

出0入0汤圆

发表于 2009-3-23 10:41:09 | 显示全部楼层
有没有人试过用avr-gcc V4.3.2编译,没改一个字我编译没有问题,但仿真运行都是堆栈溢出

出0入0汤圆

发表于 2009-3-23 13:40:51 | 显示全部楼层
研究,研究

出0入0汤圆

发表于 2009-9-16 15:03:28 | 显示全部楼层
好东西啊

出0入0汤圆

发表于 2009-9-19 09:06:56 | 显示全部楼层
目前没细看代码,看到32楼的回复我也说一下,OS_ENTER_CRITICAL()
我觉得应该改为下面的方式,大家说呢?

#define OS_ENTER_CRITICAL() asm volatile ( "in         __tmp_reg__, __SREG__" :: ); \
                            asm volatile ( "cli" :: );\
                            asm volatile ( "push __tmp_reg__" :: )

#define OS_EXIT_CRITICAL()  asm volatile ( "pop __tmp_reg__" :: );\
                            asm volatile ( "out __SREG__, __tmp_reg__" :: )
这样才不会改变原来的状态(是否已经开中断)

出10入95汤圆

发表于 2009-10-21 19:51:51 | 显示全部楼层
很好!

出0入0汤圆

发表于 2009-12-4 11:43:15 | 显示全部楼层
很好的东西,我已经在用,测试OK!!

出0入0汤圆

发表于 2010-7-12 22:07:01 | 显示全部楼层
看到了测试OK的版本,关注!

出675入8汤圆

发表于 2010-7-13 08:41:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-22 16:18:23 | 显示全部楼层
ddddddddddddddddddddddddddd

出0入0汤圆

发表于 2010-8-22 17:59:08 | 显示全部楼层
C代码移植的实时操作系统small RTOS for AVR with GCC

出0入0汤圆

发表于 2010-9-2 16:23:20 | 显示全部楼层
很精辟,dddddddddddddddd!!!!!!

出0入0汤圆

发表于 2011-11-26 10:48:54 | 显示全部楼层
kk

出0入0汤圆

发表于 2013-4-10 01:58:19 | 显示全部楼层
我使用这个程序进行仿真时,在keil中插入make命令,方式如图所示1,2所示!我编译没有发现问题 但是进入avrstudio仿真时,只是出现反汇编窗口,不知道我在keil中插入make命令方式是否不对,希望大家指点

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-28 21:16

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

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