搜索
bottom↓
12
返回列表 发新帖
楼主: avr-arm

感谢Lisuwei<简易多任务OS设计>一文,我也写出了我的RaysRTOS(光芒实

[复制链接]

出0入0汤圆

发表于 2011-12-1 09:40:24 | 显示全部楼层
非常好,记录下

出0入0汤圆

发表于 2011-12-2 11:13:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-3 01:19:05 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-3 08:51:56 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-12-3 12:26:48 | 显示全部楼层
这么好的资料。不顶不行啊。

出0入0汤圆

发表于 2011-12-3 14:12:34 | 显示全部楼层
顶楼主,51,AVR,STM8和2440都精通。。

出0入0汤圆

发表于 2011-12-8 10:34:25 | 显示全部楼层
确实,麻雀虽小,五脏俱全……

出0入0汤圆

发表于 2011-12-8 10:50:56 | 显示全部楼层
关注中~~~~~~!!!

出0入8汤圆

发表于 2011-12-14 16:46:55 | 显示全部楼层
关注中....

出0入0汤圆

发表于 2011-12-15 23:05:28 | 显示全部楼层
我还在MCU上跑过RTOS呢,太牛了,学习下

出0入0汤圆

发表于 2011-12-16 12:29:27 | 显示全部楼层
MARK RTOS

出0入0汤圆

发表于 2012-2-1 08:51:08 | 显示全部楼层
mark

出0入8汤圆

发表于 2012-2-15 10:24:08 | 显示全部楼层
此贴好久没有更新了。

出0入0汤圆

发表于 2012-2-16 16:21:19 | 显示全部楼层
mark
RTOS(Real-time operating system):实时系统

出0入0汤圆

 楼主| 发表于 2012-2-16 18:54:30 | 显示全部楼层
回复【116楼】skype
-----------------------------------------------------------------------

最近挺忙的,很不好意思。这几天工作有点忙,等过些天更新

出0入0汤圆

发表于 2012-5-30 16:45:27 | 显示全部楼层
转转....

出0入0汤圆

发表于 2014-3-20 10:11:41 | 显示全部楼层
mark.......

出0入0汤圆

发表于 2014-7-9 07:17:00 | 显示全部楼层
skype 发表于 2011-8-4 10:37
呵呵,在LZ的基础上加了一点东西,并在CPU_ASM.ASM文件中做了注释。
LZ可以把系统做完善些,也让我们这些菜 ...

good
不过就是有些看不懂

出0入0汤圆

发表于 2014-7-15 17:55:39 | 显示全部楼层
学习了。。。。。。。

出0入0汤圆

 楼主| 发表于 2014-7-15 18:50:36 | 显示全部楼层
旧帖又被翻出来了。
大学就花在单片机上了,也没学到太多东西。现在想想,还不如多往社会跑跑。

出0入0汤圆

发表于 2014-8-6 19:36:50 | 显示全部楼层
谢谢楼主的分享啊!

出0入0汤圆

发表于 2014-8-10 13:05:08 | 显示全部楼层
mark                    

出0入0汤圆

发表于 2014-8-25 08:55:39 | 显示全部楼层
支持一个先

出0入0汤圆

发表于 2014-8-25 09:33:08 | 显示全部楼层
很精彩。mark

出0入8汤圆

发表于 2014-8-25 09:37:24 | 显示全部楼层
感受一下楼主的温暖~

出0入0汤圆

发表于 2019-11-24 14:53:13 | 显示全部楼层
兄弟avr的可以改成在iar上的吗

出0入0汤圆

 楼主| 发表于 2019-11-24 14:56:08 | 显示全部楼层
cnxh 发表于 2019-11-24 14:53
兄弟avr的可以改成在iar上的吗

此等陈年旧帖,放过我吧。

出0入0汤圆

发表于 2019-11-24 15:27:38 | 显示全部楼层
本帖最后由 cnxh 于 2019-11-24 15:31 编辑

我改了一下,avr汇编不会,
原在raysrtos.c 中SP=TCB[OSPrioCur].OSTCBStkPtr+33;                 //将栈顶移到pc位置,准备弹出,
第一个任务进入函数功能:        任务级切换函数 void OSSched(void),后返回会直接复位,因为第2个函数的栈顶被设置到了TCB[OSPrioCur].OSTCBStkPtr+33,此处不是第二个任务的入口,
把SP=TCB[OSPrioCur].OSTCBStkPtr+33,改成SP=TCB[OSPrioCur].OSTCBStkPtr,切换任务函数返回,可以跳转到第2个任务函数开始,不加别的东西我测试了一下可以运行,加入自己的任务后会复位
这是我改的iar的堆栈保护,不知道对不对
******************全局变量定义***************/
extern struct TaskCtrBlock  TCB[OS_TASKS + 1];                // 定义任务控制块                               
extern INT8U   OSPrioCur;                                            // 正在运行的任务                               
extern INT8U   OSPrioHighRdy;                           // 更高优先级的任务                               
extern INT16U *TEMP_SP;

/*
+---------------------------------------------------------------------------------------+
|函数名称:        OSSched                                                                                                                                                |
|---------------------------------------------------------------------------------------|
|函数原型:        void OSSched(prio)                                                                                                                        |
|                                                                                                                                                                                |
|函数功能:        任务级切换函数                                                                                                                                    |                                                                                                                                                                                |
+---------------------------------------------------------------------------------------+
*/
void OSSched(void)
{
        OS_ENTER_CRITICAL();                        //关中断
                               
        if(OSPrioHighRdy != OSPrioCur)                        // 如果不是当前运行的任务,进行任务调度 */
        {
        //push all
//  __asm__ __volatile__("PUSH __zero_reg__          \n\t");  //R1
//  __asm__ __volatile__("PUSH __tmp_reg__           \n\t");  //R0  
//  __asm__ __volatile__("IN   __tmp_reg__,__0x3F__  \n\t");  //保存状态寄存器0x3F
//  __asm__ __volatile__("PUSH __tmp_reg__           \n\t");
//  __asm__ __volatile__("CLR  __zero_reg__          \n\t");  //R1重新清零
//    __asm__ __volatile__("PUSH R18                   \n\t");
//  __asm__ __volatile__("PUSH R19                   \n\t");
//  __asm__ __volatile__("PUSH R20                   \n\t");
//  __asm__ __volatile__("PUSH R21                   \n\t");
//  __asm__ __volatile__("PUSH R22                   \n\t");
//  __asm__ __volatile__("PUSH R23                   \n\t");
//  __asm__ __volatile__("PUSH R24                   \n\t");
//  __asm__ __volatile__("PUSH R25                   \n\t");
//  __asm__ __volatile__("PUSH R26                   \n\t");
//  __asm__ __volatile__("PUSH R27                   \n\t");
//  __asm__ __volatile__("PUSH R30                   \n\t");     
//  __asm__ __volatile__("PUSH R31                   \n\t");
//  __asm__ __volatile__("PUSH R2                    \n\t");   
//  __asm__ __volatile__("PUSH R3                    \n\t");   
//  __asm__ __volatile__("PUSH R4                    \n\t");   
//  __asm__ __volatile__("PUSH R5                    \n\t");
//  __asm__ __volatile__("PUSH R6                    \n\t");
//  __asm__ __volatile__("PUSH R7                    \n\t");  
//  __asm__ __volatile__("PUSH R8                    \n\t");  
//  __asm__ __volatile__("PUSH R9                    \n\t");   
//  __asm__ __volatile__("PUSH R10                   \n\t");
//  __asm__ __volatile__("PUSH R11                   \n\t");
//  __asm__ __volatile__("PUSH R12                   \n\t");
//  __asm__ __volatile__("PUSH R13                   \n\t");
//  __asm__ __volatile__("PUSH R14                   \n\t");
//  __asm__ __volatile__("PUSH R15                   \n\t");   
//  __asm__ __volatile__("PUSH R16                   \n\t");  
//  __asm__ __volatile__("PUSH R17                   \n\t");  
//  __asm__ __volatile__("PUSH R28                   \n\t");  //R28与R29用于建立在堆栈上的指针
//  __asm__ __volatile__("PUSH R29                   \n\t");  //入栈完成
  //PUSH_ALL                            ; Save current task's context
        //iar中断保存
      asm("ST      -Y,R27");
  asm("ST      -Y,R26");
  asm("ST      -Y,R25");
  asm("ST      -Y,R24");
      asm("ST      -Y,R31");
  asm("ST      -Y,R30");
  asm("ST      -Y,R3");
  asm("ST      -Y,R2");
    asm("ST      -Y,R1");
  asm("ST      -Y,R0");
  
        asm("ST      -Y,R23");
  asm("ST      -Y,R22");
  asm("ST      -Y,R21");
  asm("ST      -Y,R20");
      asm("ST      -Y,R19");
  asm("ST      -Y,R18");
  asm("ST      -Y,R17");
  asm("ST      -Y,R16");
    asm("IN        R24,0x3F");
  asm("IN        R25,0x3B");
   //iar中断一样无保存的     
    asm("ST      -Y,R4");
  asm("ST      -Y,R5");
  asm("ST      -Y,R6");
  asm("ST      -Y,R7");
  asm("ST      -Y,R8");
  asm("ST      -Y,R9");
  asm("ST      -Y,R10");
  asm("ST      -Y,R11");
  asm("ST      -Y,R12");
  asm("ST      -Y,R13");
  asm("ST      -Y,R14");
  asm("ST      -Y,R15");

    asm("ST      -Y,R28");
  asm("ST      -Y,R29");
  //
        SPPoint();   
        *TEMP_SP=SP;                                                //保存当前堆栈指针

        OSPrioCur = OSPrioHighRdy;                        // 更新OSPrioCur
        SPPoint();
        SP=*TEMP_SP;                                    //任务堆栈指针切换

        //pop all
//  __asm__ __volatile__("POP  R29                   \n\t");     
//  __asm__ __volatile__("POP  R28                   \n\t");
//  __asm__ __volatile__("POP  R17                   \n\t");
//  __asm__ __volatile__("POP  R16                   \n\t");
//  __asm__ __volatile__("POP  R15                   \n\t");     
//  __asm__ __volatile__("POP  R14                   \n\t");     
//  __asm__ __volatile__("POP  R13                   \n\t");     
//  __asm__ __volatile__("POP  R12                   \n\t");     
//  __asm__ __volatile__("POP  R11                   \n\t");     
//  __asm__ __volatile__("POP  R10                   \n\t");
//  __asm__ __volatile__("POP  R9                    \n\t");
//  __asm__ __volatile__("POP  R8                    \n\t");
//  __asm__ __volatile__("POP  R7                    \n\t");   
//  __asm__ __volatile__("POP  R6                    \n\t");
//  __asm__ __volatile__("POP  R5                    \n\t");
//  __asm__ __volatile__("POP  R4                    \n\t");  
//  __asm__ __volatile__("POP  R3                    \n\t");
//  __asm__ __volatile__("POP  R2                    \n\t");        
//  __asm__ __volatile__("POP  R31                   \n\t");     
//  __asm__ __volatile__("POP  R30                   \n\t");     
//  __asm__ __volatile__("POP  R27                   \n\t");     
//  __asm__ __volatile__("POP  R26                   \n\t");     
//  __asm__ __volatile__("POP  R25                   \n\t");     
//  __asm__ __volatile__("POP  R24                   \n\t");     
//  __asm__ __volatile__("POP  R23                   \n\t");     
//  __asm__ __volatile__("POP  R22                   \n\t");     
//  __asm__ __volatile__("POP  R21                   \n\t");     
//  __asm__ __volatile__("POP  R20                   \n\t");     
//  __asm__ __volatile__("POP  R19                   \n\t");
//  __asm__ __volatile__("POP  R18                   \n\t");   
//  __asm__ __volatile__("POP  __tmp_reg__           \n\t");      //SERG 出栈并恢复
//  __asm__ __volatile__("OUT  __0x3F__,__tmp_reg__  \n\t");     
//  __asm__ __volatile__("POP  __tmp_reg__           \n\t");      //R0 出栈
//  __asm__ __volatile__("POP  __zero_reg__          \n\t");      //R1 出栈
   

    //iar中断一样无保存的
    asm("LD      R29,Y+");
asm("LD      R28,Y+");   


asm("LD      R15,Y+");
asm("LD      R14,Y+");
asm("LD      R13,Y+");
asm("LD      R12,Y+");
asm("LD      R11,Y+");
asm("LD      R10,Y+");
asm("LD      R9,Y+");
asm("LD      R8,Y+");
asm("LD      R7,Y+");
asm("LD      R6,Y+");
asm("LD      R5,Y+");
asm("LD      R4,Y+");
     
//iar中断一样
   asm("IN        R25,0x3B");
     asm("IN        R24,0x3F");
  asm("LD      R16,Y+");
asm("LD      R17,Y+");   
asm("LD      R18,Y+");
asm("LD      R19,Y+");
asm("LD      R20,Y+");
asm("LD      R21,Y+");
asm("LD      R22,Y+");
asm("LD      R23,Y+");
asm("LD      R0,Y+");
asm("LD      R1,Y+");
asm("LD      R2,Y+");
asm("LD      R3,Y+");
asm("LD      R30,Y+");
asm("LD      R31,Y+");
asm("LD      R24,Y+");
asm("LD      R25,Y+");
asm("LD      R26,Y+");
asm("LD      R27,Y+");
        }
        OS_EXIT_CRITICAL();     //开中断
}

/*
+---------------------------------------------------------------------------------------+
|函数名称:        void OSTimeTick(void)                                                                                                                                                |
|---------------------------------------------------------------------------------------|
|函数原型:         void OSTimeTick(void)                                                                                                |
|                                                                                                                                                                                |
|函数功能:        中断级切换函数                                                                                                                                    |                                                                                                                                                                                |
+---------------------------------------------------------------------------------------+
*/
void OSTimeTick(void)
{
        OS_ENTER_CRITICAL();;           //关中断
        //push all 除了中断自动保存的寄存器
//  __asm__ __volatile__("PUSH R2                    \n\t");   
//  __asm__ __volatile__("PUSH R3                    \n\t");   
//  __asm__ __volatile__("PUSH R4                    \n\t");   
//  __asm__ __volatile__("PUSH R5                    \n\t");
//  __asm__ __volatile__("PUSH R6                    \n\t");
//  __asm__ __volatile__("PUSH R7                    \n\t");  
//  __asm__ __volatile__("PUSH R8                    \n\t");  
//  __asm__ __volatile__("PUSH R9                    \n\t");   
//  __asm__ __volatile__("PUSH R10                   \n\t");
//  __asm__ __volatile__("PUSH R11                   \n\t");
//  __asm__ __volatile__("PUSH R12                   \n\t");
//  __asm__ __volatile__("PUSH R13                   \n\t");
//  __asm__ __volatile__("PUSH R14                   \n\t");
//  __asm__ __volatile__("PUSH R15                   \n\t");   
//  __asm__ __volatile__("PUSH R16                   \n\t");  
//  __asm__ __volatile__("PUSH R17                   \n\t");  
//  __asm__ __volatile__("PUSH R28                   \n\t");  //R28与R29用于建立在堆栈上的指针
//  __asm__ __volatile__("PUSH R29                   \n\t");  //入栈完成
//asm("ST      -Y,R2");
// asm("ST      -Y,R3");
  asm("ST      -Y,R4");
  asm("ST      -Y,R5");
  asm("ST      -Y,R6");
  asm("ST      -Y,R7");
  asm("ST      -Y,R8");
  asm("ST      -Y,R9");
  asm("ST      -Y,R10");
  asm("ST      -Y,R11");
  asm("ST      -Y,R12");
  asm("ST      -Y,R13");
  asm("ST      -Y,R14");
  asm("ST      -Y,R15");
  
    asm("ST      -Y,R28");
  asm("ST      -Y,R29");
          TickIntHook();
        SPPoint();   
        *TEMP_SP=SP;                                                //保存当前堆栈指针
//    asm("IN      R16,0x3E");
//   asm("ST      -Y,R16");
//   asm("IN      R16,0x3D");
//   asm("ST      -Y,R16");
        OSPrioCur = OSPrioHighRdy;                        // 更新OSPrioCur
        SPPoint();
        SP=*TEMP_SP;                                    //任务堆栈指针切换
//   asm("LD      R16,Y+");//sp
//   asm("OUT     0x3D,R16");
//   asm("LD      R16,Y+");
//   asm("OUT     0x3E,R16");
        //pop all 除了中断自动保存的寄存器
//  __asm__ __volatile__("POP  R29                   \n\t");     
//  __asm__ __volatile__("POP  R28                   \n\t");
//  __asm__ __volatile__("POP  R17                   \n\t");
//  __asm__ __volatile__("POP  R16                   \n\t");
//  __asm__ __volatile__("POP  R15                   \n\t");     
//  __asm__ __volatile__("POP  R14                   \n\t");     
//  __asm__ __volatile__("POP  R13                   \n\t");     
//  __asm__ __volatile__("POP  R12                   \n\t");     
//  __asm__ __volatile__("POP  R11                   \n\t");     
//  __asm__ __volatile__("POP  R10                   \n\t");
//  __asm__ __volatile__("POP  R9                    \n\t");
//  __asm__ __volatile__("POP  R8                    \n\t");
//  __asm__ __volatile__("POP  R7                    \n\t");   
//  __asm__ __volatile__("POP  R6                    \n\t");
//  __asm__ __volatile__("POP  R5                    \n\t");
//  __asm__ __volatile__("POP  R4                    \n\t");  
//  __asm__ __volatile__("POP  R3                    \n\t");
//  __asm__ __volatile__("POP  R2                    \n\t");
    //iar中断一样无保存的
    asm("LD      R29,Y+");
asm("LD      R28,Y+");   


asm("LD      R15,Y+");
asm("LD      R14,Y+");
asm("LD      R13,Y+");
asm("LD      R12,Y+");
asm("LD      R11,Y+");
asm("LD      R10,Y+");
asm("LD      R9,Y+");
asm("LD      R8,Y+");
asm("LD      R7,Y+");
asm("LD      R6,Y+");
asm("LD      R5,Y+");
asm("LD      R4,Y+");

  OS_EXIT_CRITICAL();              //开中断
}

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

本版积分规则

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

GMT+8, 2024-3-29 01:12

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

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