搜索
bottom↓
回复: 43

发一个RTOS,M16上跑的,望各位多多指导。

[复制链接]

出0入42汤圆

发表于 2007-3-11 13:39:17 | 显示全部楼层 |阅读模式
编译器:AVRStudio4.12SP3+WinAVR-20060421.优化等级-S。

测试程序跑3个任务和一个空闲任务,Task0和Task1等待互斥型信号量,Task3给前面两个发信号量

点击此处下载armok01146257.rar

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

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

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

出0入42汤圆

 楼主| 发表于 2007-3-11 13:45:20 | 显示全部楼层
这个系统是参考21IC上的前辈写的,不知道算不算RT(Real Time)

http://www.21ic.com/news/n11677c80.aspx

出0入0汤圆

发表于 2007-3-11 14:04:17 | 显示全部楼层
先顶再看

出0入42汤圆

 楼主| 发表于 2007-3-11 21:54:19 | 显示全部楼层
怎么没人顶啊,自顶一下

出0入0汤圆

发表于 2007-9-3 17:55:20 | 显示全部楼层
很喜欢!!!



我下了,正在试用,neeme@21cn.com



交个朋友吧!

出0入0汤圆

发表于 2007-9-3 18:11:11 | 显示全部楼层
武汉也有强人

出0入0汤圆

发表于 2007-9-3 20:26:24 | 显示全部楼层
我在M162,好象有点题!



MCU:M162  8M



TCN0是否要改一下呢?

出0入0汤圆

发表于 2007-9-4 10:30:37 | 显示全部楼层
// 进入临界代码区



#define                OS_ENTER_CRITICAL()                \

asm volatile(                                  \

"IN   __tmp_reg__,__SREG__"    "
\t"         \

"PUSH __tmp_reg__"             "
\t"          \

"CLR  __zero_reg__"            "
\t"          \

"CLI"                          "
\t"          \

)                                                                                  \





__tmp_reg__  : 不明白,在那定义的?

出0入0汤圆

发表于 2007-9-4 10:34:50 | 显示全部楼层
__tmp_reg__ 就是R0,GCC自己定义的。

出0入0汤圆

发表于 2007-9-4 10:42:19 | 显示全部楼层
那 __SREG__  __zero_reg__呢? 在那个文件定义?

出0入42汤圆

 楼主| 发表于 2007-9-4 11:05:44 | 显示全部楼层
这么老的贴子都翻出来了?呵呵,我自己都忘了。

回neeme  

__SREG__  __zero_reg__都是GCC定义的寄存器

出0入0汤圆

发表于 2007-9-4 11:52:48 | 显示全部楼层
要好好学习一下!!!

出0入0汤圆

发表于 2007-9-4 13:14:36 | 显示全部楼层
请问那里有关于这些寄存器定义的说明!

我想全面学习一下你的myrost!所以必须弄懂每一行语句!

谢谢!

出0入42汤圆

 楼主| 发表于 2007-9-4 14:22:43 | 显示全部楼层
寄存器的说明在avr-libc Manual里,许多问题都可以在里面找到答案。

另外你也可以参考:

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=663028&bbs_page_no=1&bbs_id=1000

有很多问题都是得到zhb2000指点才明白的,还有就是21ic上的前辈写的文章。ucos-II的研究也对我理解RTOS有很大帮助,你如果有兴趣的话也可以参考一下。

21ic上面的文章:http://www.21ic.com/news/n11677c80.aspx

出0入0汤圆

发表于 2007-9-4 16:39:52 | 显示全部楼层
先顶了,努力学习中

出0入0汤圆

发表于 2007-9-4 22:26:57 | 显示全部楼层
呵呵,看来很多人开始上操作系统了。

出0入0汤圆

发表于 2007-9-5 08:30:06 | 显示全部楼层
文件下了,研究中.....

出0入0汤圆

发表于 2007-9-5 13:46:34 | 显示全部楼层
首先谢谢"my_avr",再请教一个问题:
*Stack--=0x00;                     //R1 __zero_reg__            
  *Stack--=0x00;                     //R0 __tmp_reg__
  *Stack--=0x80;                                        //SREG 在任务中,开启全局中断
编译器是怎么知道,这些值赋值给了R1,R0和SREG呢?我看了很长时间也没有弄明白!!

出0入0汤圆

发表于 2007-9-7 21:46:31 | 显示全部楼层
void OS_TASK_SW(void)
{   
        .......

        __asm__ __volatile__("CLR  __zero_reg__         \n\t");        /*R0重新清零

谢问为什么要 清零 __zero_reg__?

不明白AVR-LIBC的解释!请指教!

出0入42汤圆

 楼主| 发表于 2007-9-7 22:43:59 | 显示全部楼层
__zero_reg__ 寄存器就是一个零寄存器,你使用了之后一定要把它清零的

出0入0汤圆

发表于 2007-9-8 10:04:23 | 显示全部楼层
如果不清零,会有什么后果?
GCC是否用该寄存器作什么标记之类的?
谢谢!

出0入42汤圆

 楼主| 发表于 2007-9-8 10:44:21 | 显示全部楼层
该寄存器主要是给某些变量清零的时候用的,举个例子,我让PORTB为零,则:

PORTB = 0x00;

编译生成的汇编程序如下(你自己也可以试试):

OUT     0x18,R1          Out to I/O location

明显看到,编译系统直接就把R1的值给了PORTB了,因为系统一直都是认为__zero_reg__里面的值为零的,如果你使用了该寄存器后不把它还原为零的话,后果应该很清楚了。

出0入42汤圆

 楼主| 发表于 2007-9-8 11:31:12 | 显示全部楼层
armok 终于让我的贴子贴了一个COOL了,呵呵

出0入0汤圆

发表于 2007-9-8 11:31:59 | 显示全部楼层
那么我们不用它就是了,办什么你在MYROTS用上了!这不是自找麻烦吗?

出0入42汤圆

 楼主| 发表于 2007-9-8 11:51:04 | 显示全部楼层
先看下面T0比较匹配中断的代码,这是一个标准的中断代码的汇编,请注意保护现场和恢复现场部分的代码,它同样是用到了R1!!


0000013F: __vector_19
38:       {
+0000013F:   921F        PUSH    R1               Push register on stack
+00000140:   920F        PUSH    R0               Push register on stack
+00000141:   B60F        IN      R0,0x3F          In from I/O location
+00000142:   920F        PUSH    R0               Push register on stack
+00000143:   2411        CLR     R1               Clear Register
+00000144:   938F        PUSH    R24              Push register on stack
+00000145:   939F        PUSH    R25              Push register on stack
41:               if (WaitTime > 0)
+00000146:   9180007A    LDS     R24,0x007A       Load direct from data space
+00000148:   9190007B    LDS     R25,0x007B       Load direct from data space
+0000014A:   2B89        OR      R24,R25          Logical OR
+0000014B:   F049        BREQ    PC+0x0A          Branch if equal
43:                       WaitTime --;
+0000014C:   9180007A    LDS     R24,0x007A       Load direct from data space
+0000014E:   9190007B    LDS     R25,0x007B       Load direct from data space
+00000150:   9701        SBIW    R24,0x01         Subtract immediate from word
+00000151:   9390007B    STS     0x007B,R25       Store direct to data space
+00000153:   9380007A    STS     0x007A,R24       Store direct to data space
46:               if (Time > 0)
+00000155:   9180007C    LDS     R24,0x007C       Load direct from data space
+00000157:   9190007D    LDS     R25,0x007D       Load direct from data space
+00000159:   2B89        OR      R24,R25          Logical OR
+0000015A:   F049        BREQ    PC+0x0A          Branch if equal
48:                       Time--;
+0000015B:   9180007C    LDS     R24,0x007C       Load direct from data space
+0000015D:   9190007D    LDS     R25,0x007D       Load direct from data space
+0000015F:   9701        SBIW    R24,0x01         Subtract immediate from word
+00000160:   9390007D    STS     0x007D,R25       Store direct to data space
+00000162:   9380007C    STS     0x007C,R24       Store direct to data space
+00000164:   919F        POP     R25              Pop register from stack
+00000165:   918F        POP     R24              Pop register from stack
+00000166:   900F        POP     R0               Pop register from stack
+00000167:   BE0F        OUT     0x3F,R0          Out to I/O location
+00000168:   900F        POP     R0               Pop register from stack
+00000169:   901F        POP     R1               Pop register from stack
+0000016A:   9518        RETI                     Interrupt return

既然我们的任务调度是模拟一次中断入栈,则我们的RTOS的任务调度代码就要和中断代码一样的入栈过程。

出0入0汤圆

发表于 2007-9-8 14:37:30 | 显示全部楼层
我在想,最安全且最保守是否这样:

{
   push r0;
   push r1;
   ...
   push r31;

   
   in __tmp_reg__ , __SREG__;

   push __tmp_reg__;

   .....
   .....
   .....



   pop  __tmp_reg__;
   out  __SREG__ , __tmp_reg__
   pop  r31;
   pop  r30;
   ...
   pop  r0;

出0入42汤圆

 楼主| 发表于 2007-9-8 15:45:19 | 显示全部楼层
回neeme :
有关你的这个问题可以看Manual里面的FAQ,在191页 What registers are used by the C compiler?
确实,把所有的寄存器都保存是最保守的方法,但是这是没有必要的,并且还会占用大量的堆栈空间。

出0入0汤圆

发表于 2007-9-8 16:10:11 | 显示全部楼层
但你能保证使用者不会在它的func0中 加句 asm 吗?

出0入0汤圆

发表于 2008-3-29 11:36:44 | 显示全部楼层
谢谢了

出0入0汤圆

发表于 2008-3-29 11:38:55 | 显示全部楼层
能问一下楼主的联系方式吗?

出0入0汤圆

发表于 2008-6-4 10:01:39 | 显示全部楼层
cool

出0入0汤圆

发表于 2009-7-3 14:41:05 | 显示全部楼层
不知道怎么回事,我用的时候有问题

出0入0汤圆

发表于 2009-7-10 11:54:06 | 显示全部楼层
学习阶段看看

出0入0汤圆

发表于 2010-4-7 16:13:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-9 18:05:29 | 显示全部楼层
记号!

出0入0汤圆

发表于 2010-7-16 16:56:51 | 显示全部楼层
向楼主认真学习!

出0入0汤圆

发表于 2011-5-15 19:21:49 | 显示全部楼层
Protues 模拟运行时会溢出。

出0入0汤圆

发表于 2011-5-15 20:50:54 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-8-13 21:57:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-21 17:20:41 | 显示全部楼层
IAR 和 ATmega8 用哪个 RTOS?

出0入0汤圆

发表于 2011-8-21 17:48:47 | 显示全部楼层
回复【41楼】funv
-----------------------------------------------------------------------
8位机用RTOS没太大必要

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-28 23:56

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

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