qjhu0433 发表于 2005-7-14 20:18:07

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

1、动态堆栈,静态堆栈可选

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

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

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



以下是连接:

    第一个:静态堆栈

    第二个:动态堆栈



点击此处下载armok0157106.rar

点击此处下载armok0157107.rar

armok 发表于 2005-7-14 22:08:36

谢谢共享!

zhonghua_li 发表于 2005-7-14 23:05:06

谢谢。

Tomcat 发表于 2005-7-15 00:36:02

好东西!

coole 发表于 2005-7-15 08:23:33

谢谢先!!

pei99888 发表于 2005-7-15 21:49:56

这么好的资料没有人顶,而一些普通内容却很热,喜欢钻研的人少啊

zhonghua_li 发表于 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");       

}

jackiezeng 发表于 2005-7-16 10:02:32

谢谢。

qjhu0433 发表于 2005-7-17 17:55:36

ExtraPush()是一个宏在OS_CPU.H里面有定义,您一看就会明白。





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

sailingdata 发表于 2005-7-18 21:18:37

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

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

zhonghua_li 发表于 2005-7-18 22:12:02

搂主,改变了 SmallRTOS 的一些原貌。 对内存的要求更大了。

qjhu0433 发表于 2005-7-19 08:22:08

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

violit 发表于 2005-8-29 13:24:51

要是能移植到ICC就好了~~~~

lcqqcl 发表于 2005-8-30 11:16:32

十分感谢,这样的东西拿出来给大家分享,是不是阿莫有什么奖励活动的时候,一定要想到这位楼主呢?

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

lcqqcl 发表于 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编辑过

hygbeyond 发表于 2005-8-31 09:39:05

这的确是一个好东西 顶一下

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

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

violit 发表于 2005-9-3 20:00:51

lcqqcl

请容我说一句

不管怎么样

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

lcqqcl 发表于 2005-9-3 21:46:57

violit

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

另外,请问violit:

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

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

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



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



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

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

armok 发表于 2005-9-4 07:39:23

请lcqqcl注意用词。



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

lcqqcl 发表于 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编辑过

jack 发表于 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"        \

jack 发表于 2005-9-8 01:12:50

0x3F 原来是 SREG 现搞懂呢,保存此变量

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

lmega 发表于 2005-9-15 11:01:32

楼主是否能写一些应用实例给我们这些菜鸟?或者干脆出本书。

qjhu0433 发表于 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编辑过

lcqqcl 发表于 2005-12-21 14:41:31

美中不足啊,要是楼主能在OS里面设置中断优先级就好了,使用定时器0以后比定时器0优先级高的中断就不能在OS里面应用了。

lcqqcl 发表于 2005-12-21 18:23:56

我上面的发言是错误的:在使用了OS以后,外部中断0能使用(已经验证),但是定时器1不能用了(正在实验使用),目前发现不能用定时器1,输入捕获中断也不能用.我推测在该OS里面和定时器1有关的中断都不能用

zuoxiqing 发表于 2006-5-30 21:22:08

各位兄弟,谁有移植到AVR单片机的RTOS,能否传给小弟一份,小弟迫切需要,谢谢

!!!

   我的邮箱:lgzxq@hzvtc.net

ATmega8515 发表于 2007-3-25 17:52:29

#defineOS_ENTER_CRITICAL()cli();Os_Enter_Sum++            /* 禁止中断*/





是不是该改成:

#defineOS_ENTER_CRITICAL()cli(),Os_Enter_Sum++   

或者

#defineOS_ENTER_CRITICAL(){cli();Os_Enter_Sum++;}

xczhaony 发表于 2007-3-27 17:49:59

确实是好东西呀,顶

oxalis 发表于 2007-4-7 11:01:36

很棒

谢谢!

alexant 发表于 2007-4-7 11:51:16

还是楼主厉害啊,很早我就想做这件事情了,可惜一直没搞懂RTOS的内核

yanhanyu 发表于 2007-4-7 17:24:57

郁闷~。中断很不好用~~~

yanhanyu 发表于 2007-4-7 17:28:16

用了中断后,有些任务不正常。搞不懂。

caine 发表于 2007-8-22 22:57:13

不顶真的不行啊

1234567891 发表于 2007-9-14 09:51:33

问题都没人回答??

zhoud 发表于 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);”。

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

wyoujtg 发表于 2007-10-26 17:27:00

高手,多多交流

mxpopstar 发表于 2007-12-1 22:01:10

请给一些测试例程呀!帮帮我这个菜鸟啊!谢了

mxpopstar 发表于 2007-12-1 22:01:51

请给一些简单测试例程呀!帮帮我这个菜鸟啊!谢了

nicholasldf 发表于 2007-12-2 13:33:31

中断的问题应该是移植的问题
好几个RTOS都采用一样的移植:定义一下寄存器变量,防止被编译器占用。
这样的移植降低了单片机的运行效率。

cyr_hongfeng 发表于 2009-2-21 20:04:19

陈明计吗???????

zhy980 发表于 2009-2-22 19:55:27

谢谢,留个记号

lukeunderwood 发表于 2009-2-22 21:44:56

下了研究研究,假期刚刚学会small RTOS for 51,现在转学avr正愁它没往avr上移植呢。

jimtien 发表于 2009-3-23 10:41:09

有没有人试过用avr-gcc V4.3.2编译,没改一个字我编译没有问题,但仿真运行都是堆栈溢出

cgbabc 发表于 2009-3-23 13:40:51

研究,研究

yangxingbo0311 发表于 2009-9-16 15:03:28

好东西啊

liangyaozhan 发表于 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__" :: )
这样才不会改变原来的状态(是否已经开中断)

ddcour 发表于 2009-10-21 19:51:51

很好!

algebra 发表于 2009-12-4 11:43:15

很好的东西,我已经在用,测试OK!!

AVR_shaofeng 发表于 2010-7-12 22:07:01

看到了测试OK的版本,关注!

xml2028 发表于 2010-7-13 08:41:20

mark

houzengmin2004 发表于 2010-8-22 16:18:23

ddddddddddddddddddddddddddd

markloveyou 发表于 2010-8-22 17:59:08

C代码移植的实时操作系统small RTOS for AVR with GCC

hpdell 发表于 2010-9-2 16:23:20

很精辟,dddddddddddddddd!!!!!!

keepmoving29 发表于 2011-11-26 10:48:54

kk

nhsheng 发表于 2013-4-10 01:58:19

我使用这个程序进行仿真时,在keil中插入make命令,方式如图所示1,2所示!我编译没有发现问题 但是进入avrstudio仿真时,只是出现反汇编窗口,不知道我在keil中插入make命令方式是否不对,希望大家指点

时代还怪 发表于 2013-8-28 16:54:58

正要学习rtos,感谢lz
页: [1]
查看完整版本: C代码移植的实时操作系统small RTOS for AVR with GCC ,欢迎测试