C代码移植的实时操作系统small RTOS for AVR with GCC ,欢迎测试
1、动态堆栈,静态堆栈可选2、不用在考虑函数的可重入的问题
3、内核具有的小的数据结构,和少的代码量,适合用在mega8~mega32里面,只占用5~15%的rom资源
4、全部是由C语言写成,具有重要的学习价值。
以下是连接:
第一个:静态堆栈
第二个:动态堆栈
点击此处下载armok0157106.rar
点击此处下载armok0157107.rar 谢谢共享! 谢谢。 好东西! 谢谢先!! 这么好的资料没有人顶,而一些普通内容却很热,喜欢钻研的人少啊 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");
} 谢谢。 ExtraPush()是一个宏在OS_CPU.H里面有定义,您一看就会明白。
-----此内容被qjhu0433于2005-07-17,18:00:38编辑过 smalll RTOS的自由堆栈最大是256字节,我还未详细看过qjhu0433仁兄的代码,敢文移植过来的small RTOS for avr 对自由堆栈的大小有没有重新调整,否则AVR片内SRAM比51的丰富的优势就失去了,最终使得移植过来的RTOS在使用上很受限制。
晚辈对仁兄表示至深的敬意! 搂主,改变了 SmallRTOS 的一些原貌。 对内存的要求更大了。 是啊,我改变了堆栈的处理方式,已经和原来的small RTOS51处理堆栈的方式大不一样了,与uC/OS-ii处理堆栈的方式是一致的,这样更合理的使用了avr里面的大RAM。加快了任务切换的速度,4MHz时钟频率时,任务切换可以低至76us,使内核本身占用CPU资源更少。 要是能移植到ICC就好了~~~~ 十分感谢,这样的东西拿出来给大家分享,是不是阿莫有什么奖励活动的时候,一定要想到这位楼主呢?
另外:有个问题,静态和动态是什么区别?哪个更好一些呢? 十分感谢,真的不错,不过我发现了一个问题,不用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编辑过 这的确是一个好东西 顶一下
中断内的变量一般用消息来发送给任务
或者你申请一个全局数组来存储 lcqqcl
请容我说一句
不管怎么样
请你不要破坏这里的气氛好么? violit
我不是破坏气氛,你不觉的你很滑稽吗?这里是技术交流的地方,可以说只要在这里提出了问题,都是实践中遇到的不能解决的问题,如果在不懂的情况下,乱提建议,这样给调试的人带来多大的苦恼,多走多少弯路.
另外,请问violit:
你调试过程序吗?你知道在遇到困难的时候要调试多长时间吗?
发言是要付责任的,这是做人的基本道理.
如果大家都看到着个贴子不知道谁有道理,你自己想想吧!
为了弄清楚着个问题,我晚上要调试到2点,现在终于弄明白了!
我看了一下论坛,发现violit你可能是一个高手,我不知道,但是你正在用RTOS,你为什么不
帮忙解决问题,搞这没用的做什么呢?
-----此内容被lcqqcl于2005-09-03,22:32:50编辑过 请lcqqcl注意用词。
“乱发言”、“不屑一顾”、“滑稽”等词,都是技术交流中尽量避免使用的。 既然ARM你这样说我无话可说了,事实自有公断.我要澄清一下:
1:我说的"滑稽"
不是评论人家的技术问题"滑稽",而是他这种不帮忙解决问题,来评论人家的发言是滑稽的,(ARMOK,我不知道你的中文怎么样)
2:针对"乱发言"
我说过了,只要是碰到问题的,都是暂时解决不了的.我说了中断里的变量不能被任务调用,难道还不明白这是全局变量吗?那个仁兄,居然建议我设"全局数组",请问:既然全局变量都不能用了,全局数组就能用?!!!!!!
3:关于"不屑一顾"
请大家看一下这个帖子,有很多高手,对这个贴子技术方面的问题都进行了评论,相反,我一点都不懂,我只是学习着用.对于RTOS具体是怎样工作的我一点都不懂,既然那么多精通的人,我的问题居然没有一个人解决,我看来有两种可能:
1;就是对我的问题不屑一顾
2;
ARMOK:
1 我没有用"滑稽""不屑一顾"来形容别人的技术,我是说的这种做法
2 "乱发言" 我认为我用的没错,请ARMOK看一下我的问题,然后再看一下别人的回 复
-----此内容被lcqqcl于2005-09-04,11:56:47编辑过 #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" \ 0x3F 原来是 SREG 现搞懂呢,保存此变量
define ExtraPush()#define PUSHALL() 还不是懂呢 楼主是否能写一些应用实例给我们这些菜鸟?或者干脆出本书。 好久没上来了,这段时间有用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编辑过 美中不足啊,要是楼主能在OS里面设置中断优先级就好了,使用定时器0以后比定时器0优先级高的中断就不能在OS里面应用了。 我上面的发言是错误的:在使用了OS以后,外部中断0能使用(已经验证),但是定时器1不能用了(正在实验使用),目前发现不能用定时器1,输入捕获中断也不能用.我推测在该OS里面和定时器1有关的中断都不能用 各位兄弟,谁有移植到AVR单片机的RTOS,能否传给小弟一份,小弟迫切需要,谢谢
!!!
我的邮箱:lgzxq@hzvtc.net #defineOS_ENTER_CRITICAL()cli();Os_Enter_Sum++ /* 禁止中断*/
是不是该改成:
#defineOS_ENTER_CRITICAL()cli(),Os_Enter_Sum++
或者
#defineOS_ENTER_CRITICAL(){cli();Os_Enter_Sum++;} 确实是好东西呀,顶 很棒
谢谢! 还是楼主厉害啊,很早我就想做这件事情了,可惜一直没搞懂RTOS的内核 郁闷~。中断很不好用~~~ 用了中断后,有些任务不正常。搞不懂。 不顶真的不行啊 问题都没人回答?? 其它中断不可用的原因,可能是你没开!!!
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);”。
楼主,建议增加各不同芯片的初始化函数,需要根据芯片及使用自己修改。虽麻烦,但是必要的啊~~~~~~ 高手,多多交流 请给一些测试例程呀!帮帮我这个菜鸟啊!谢了 请给一些简单测试例程呀!帮帮我这个菜鸟啊!谢了 中断的问题应该是移植的问题
好几个RTOS都采用一样的移植:定义一下寄存器变量,防止被编译器占用。
这样的移植降低了单片机的运行效率。 陈明计吗??????? 谢谢,留个记号 下了研究研究,假期刚刚学会small RTOS for 51,现在转学avr正愁它没往avr上移植呢。 有没有人试过用avr-gcc V4.3.2编译,没改一个字我编译没有问题,但仿真运行都是堆栈溢出 研究,研究 好东西啊 目前没细看代码,看到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__" :: )
这样才不会改变原来的状态(是否已经开中断) 很好! 很好的东西,我已经在用,测试OK!! 看到了测试OK的版本,关注! mark ddddddddddddddddddddddddddd C代码移植的实时操作系统small RTOS for AVR with GCC 很精辟,dddddddddddddddd!!!!!! kk 我使用这个程序进行仿真时,在keil中插入make命令,方式如图所示1,2所示!我编译没有发现问题 但是进入avrstudio仿真时,只是出现反汇编窗口,不知道我在keil中插入make命令方式是否不对,希望大家指点 正要学习rtos,感谢lz
页:
[1]