搜索
bottom↓
楼主: armok

教程: 建立一个属于自己的AVR的RTOS (作者:hjc800323)

  [复制链接]

出0入0汤圆

发表于 2011-9-28 07:31:41 | 显示全部楼层
看看

出0入0汤圆

发表于 2011-9-28 22:11:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-8 18:48:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-8 21:41:45 | 显示全部楼层
确实不错!

出0入0汤圆

发表于 2011-10-16 15:24:40 | 显示全部楼层
嵌入式入门..不好入啊..还是不能看得太懂,难道需要一些汇编基础知识么..

出0入0汤圆

发表于 2011-10-18 01:53:46 | 显示全部楼层
收藏

出0入0汤圆

发表于 2011-11-24 14:42:51 | 显示全部楼层
此贴只应天上有

出0入0汤圆

发表于 2011-11-24 16:52:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-25 15:26:43 | 显示全部楼层
跑第四个的时候,有些问题,原程序跑的时候,会运行一次后,跑到ROM没有使用的空间去,按以下的方法更改一下就行了:半天工夫找出来的;
void OSSched(void)
{
        //  根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况
        __asm__ __volatile__("PUSH __zero_reg__");  //R1
        __asm__ __volatile__("PUSH __tmp_reg__");  //R0
        __asm__ __volatile__("IN   __tmp_reg__,__SREG__");  //保存状态寄存器SREG
        __asm__ __volatile__("PUSH __tmp_reg__");
        __asm__ __volatile__("CLR  __zero_reg__ ");  //R0重新清零

        __asm__ __volatile__("PUSH R18");
        __asm__ __volatile__("PUSH R19");
        __asm__ __volatile__("PUSH R20");
        __asm__ __volatile__("PUSH R21");
        __asm__ __volatile__("PUSH R22");
        __asm__ __volatile__("PUSH R23");
        __asm__ __volatile__("PUSH R24");
        __asm__ __volatile__("PUSH R25");
        __asm__ __volatile__("PUSH R26");
        __asm__ __volatile__("PUSH R27");
        __asm__ __volatile__("PUSH R30");
        __asm__ __volatile__("PUSH R31");
        __asm__ __volatile__("PUSH R28");
        __asm__ __volatile__("PUSH R29");

        TCB[OSTaskRuningPri].OSTaskStackTop=SP;           //将正在运行的任务的堆栈底保存

   unsigned char flag=0;
        unsigned char OSNextTaskID;                             //在现有堆栈上开设新的空间
        // for (OSNextTaskID = 0;                                  //进行任务调度
                // (OSNextTaskID < OSTASK )&& (!(OSRdTab & (0x01<<OSNextTaskID)));
                // OSNextTaskID++);
       
        for(OSNextTaskID=0;OSNextTaskID<OSTASK;OSNextTaskID++)
        {
                if(OSRdTab & (0x01<<OSNextTaskID))
                {
                        flag=1;
                        OSTaskRuningPri = OSNextTaskID ;
                        break;
                }
        }
       
        //三个任务都执行过,重新开始
        if(flag==0)   
        {
                OSTaskRuningPri=OSTASK;
                //OSRdTab=0x07;
        }

        cli();  //保护堆栈转换
        SP=TCB[OSTaskRuningPri].OSTaskStackTop;
        sei();

        __asm__ __volatile__("POP R29");
        __asm__ __volatile__("POP R28");
        __asm__ __volatile__("POP R31");
        __asm__ __volatile__("POP R30");
        __asm__ __volatile__("POP R27");
        __asm__ __volatile__("POP R26");
        __asm__ __volatile__("POP R25");
        __asm__ __volatile__("POP R24");
        __asm__ __volatile__("POP R23");
        __asm__ __volatile__("POP R22");
        __asm__ __volatile__("POP R21");
        __asm__ __volatile__("POP R20");
        __asm__ __volatile__("POP R19");
        __asm__ __volatile__("POP R18");

        __asm__ __volatile__("POP  __tmp_reg__");
        __asm__ __volatile__("OUT  __SREG__,__tmp_reg__");
        __asm__ __volatile__("POP  __tmp_reg__");
        __asm__ __volatile__("POP  __zero_reg__");

}

问题出在,当前面三个任务都执行一次,原程序不能执行到任务调度的那个程序去,改成以上的就好了。

出0入0汤圆

发表于 2011-11-25 19:04:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 09:41:49 | 显示全部楼层
哪位大侠能解释一下第五篇实现的功能?看了好久都没有看懂

出0入0汤圆

发表于 2011-11-28 16:20:35 | 显示全部楼层
这资料好,mark一下

出0入0汤圆

发表于 2011-12-1 09:41:42 | 显示全部楼层
很好,记录下

出0入0汤圆

发表于 2011-12-12 13:06:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-12 16:24:03 | 显示全部楼层
学习下

出0入0汤圆

发表于 2011-12-15 23:40:07 | 显示全部楼层
很好的记录过程!

出0入0汤圆

发表于 2011-12-19 17:17:21 | 显示全部楼层
挖古董了。

出0入0汤圆

发表于 2011-12-19 19:44:21 | 显示全部楼层
这个必须留着 仔细研读

出0入0汤圆

发表于 2011-12-20 12:32:12 | 显示全部楼层
好贴! 顶。

出0入0汤圆

发表于 2011-12-21 01:13:56 | 显示全部楼层
这个必须MARK

出0入0汤圆

发表于 2011-12-21 14:54:42 | 显示全部楼层
古董贴,牛x~~

出0入0汤圆

发表于 2011-12-22 15:55:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-22 23:42:31 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-29 19:13:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-27 00:05:32 | 显示全部楼层
等时机成熟再来看
mark下

出0入0汤圆

发表于 2012-2-9 09:48:48 | 显示全部楼层
mark!!!!!!

出0入0汤圆

发表于 2012-2-13 11:11:08 | 显示全部楼层
mark^

出0入0汤圆

发表于 2012-2-16 10:48:58 | 显示全部楼层
收藏了

出0入0汤圆

发表于 2012-2-16 11:12:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-16 13:49:50 | 显示全部楼层
好帖!!!!!!

出0入0汤圆

发表于 2012-2-16 15:59:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-16 16:32:43 | 显示全部楼层
《建立一个属于自己的AVR的RTOS》

出0入0汤圆

发表于 2012-2-24 22:26:45 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-2-27 15:01:23 | 显示全部楼层
该补习一下汇编了。。

出0入0汤圆

发表于 2012-3-27 00:06:07 | 显示全部楼层
mark  学习学习

出0入0汤圆

发表于 2012-3-27 00:07:39 | 显示全部楼层
听说不错,看看

出0入0汤圆

发表于 2012-3-30 12:04:23 | 显示全部楼层
挖这么老的坟,这帖子确实不错,给了我很多启发

出0入0汤圆

发表于 2012-3-30 21:08:38 | 显示全部楼层
现在开始学

出0入0汤圆

发表于 2012-3-31 09:43:53 | 显示全部楼层
有时间在慢慢的研究研究

出0入0汤圆

发表于 2012-4-20 09:43:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-5-26 15:29:32 | 显示全部楼层
记下来慢慢看....

出0入0汤圆

发表于 2012-6-13 13:44:59 | 显示全部楼层
没天理啊 怎么有这么好的文章,真正受用

出0入0汤圆

发表于 2012-6-13 15:05:44 | 显示全部楼层
很不错的。。。先mark一下,再细读

出0入0汤圆

发表于 2012-6-20 14:59:18 | 显示全部楼层
cool                                                                                                                                                                                                      

出0入0汤圆

发表于 2012-6-21 01:16:32 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2012-6-28 22:49:00 | 显示全部楼层
看了很多次,

出0入0汤圆

发表于 2012-7-3 12:10:51 | 显示全部楼层
我编译第四篇的时候出现excessive stack overflow,stop sim
avrstudio 仿真,优化等级是s
为什么会这样呢

出0入0汤圆

发表于 2012-7-21 16:57:27 | 显示全部楼层
mark一下,以后查看

出0入0汤圆

发表于 2012-7-23 15:39:48 | 显示全部楼层

这几天没啥事做,把Cortex-M3权威指南_cn 初略看了一遍,然后看了一点关于UCOSII的东西,突然发现理解了单片机的工作原理,以前也看过类似的资料,但是是一种很朦胧的理解,可能理解一个东西,是需要时间的。。  

写UCOS的Jean J.Labrosse在他的书上有这样一句话,“渐渐地,我自然会想到,写个实时内核直有那么难吗?不就是不断地保存,恢复CPU的那些寄存器嘛。”

单片机工作也不就是这样嘛,不断的进栈,出栈;   操作系统的任务调度,也是不断的控制  进栈,出栈;

出0入0汤圆

发表于 2012-7-23 22:39:49 | 显示全部楼层
我也写了一个简单的这个东西。。可是怎么没一个人顶。。。郁闷
源码:
  1. #include<avr/io.h>
  2. #include"Task.h"
  3. #include<avr/interrupt.h>

  4. #define Task_Max  5                                //任务数
  5. #define Stack_Top 12                        //任务堆栈空间


  6. typedef struct Task_Value
  7. {
  8.         uint8         p;                                        //任务堆栈指针
  9.         uint16        delay;                                //任务延时
  10.         uint8        State;                                //任务状态
  11. }Task;

  12. static Task Task_Buf[Task_Max];                                //任务空间

  13. static uint8 Task_SP[Task_Max][Stack_Top];        //任务堆栈空间

  14. static uint8 Task_Run_ID;                                        //正在运行任务ID

  15. void AddTask(uint16 TaskName, uint16 TaskDelay, uint8 TaskID)
  16. {
  17.         Task_Buf[TaskID].p = (uint16)Task_SP[TaskID] + 9;
  18.         //AVR单片机SP堆栈方向是由上往下生长的,执行RET的时候SP将加1,所以要比实际地址小1
  19.         Task_SP[TaskID][10] = (uint8)(TaskName >> 8);                //地址高8位
  20.         Task_SP[TaskID][11] = (uint8)(TaskName & 0xff);                //地址低8位
  21.         Task_Buf[TaskID].delay = TaskDelay;
  22.         Task_Buf[TaskID].State = 0;
  23. }

  24. void Task_Delay(uint16 Del)
  25. {
  26.         uint8 Temp = 0;
  27.         Task_Buf[Task_Run_ID].p        = SP;                                        //保存当前堆栈
  28.         Task_Buf[Task_Run_ID].delay = Del;                                //设置延时
  29.         Task_Buf[Task_Run_ID].State -= 1;                                //将状态置0

  30.         for(Temp = 0;Temp < Task_Max - 1;Temp++)
  31.         {
  32.                 if(Task_Buf[Temp].State == 1)                                //如果有任务处于就绪状态,执行.
  33.                 {
  34.                         break;
  35.                 }
  36.         }

  37.         SP = Task_Buf[Temp].p;                                                        //将任务堆栈地址赋给SP堆栈地址
  38.         Task_Run_ID = Temp;                                                                //运行改变ID
  39. }

  40. ISR(TIM0_OVF_vect)
  41. {
  42.         uint8 Index = 0;
  43.         uint8 IDBuf = Task_Run_ID;                                                //保存当前运行任务的ID
  44.         uint8 Task_Run_SP = Task_Buf[Task_Run_ID].p - SP;       
  45.         //任务堆栈指针减去当前堆栈指针得到中断所使用掉的堆栈

  46.         TCNT0 = 0x00;
  47.         Task_Buf[Task_Run_ID].p = SP + Task_Run_SP;
  48.         //当前堆栈指针加上中断所使用掉的堆栈数得到中断前堆栈指针,保存

  49.         for(Index = 0;Index < Task_Max;Index++)
  50.         {
  51.                 if(Task_Buf[Index].p != 0)
  52.                 {
  53.                         if((Task_Buf[Index].delay == 0) && (Task_Buf[Index].State == 0))
  54.                         {
  55.                                 //如果任务延时时间到,将就绪置位
  56.                                 Task_Buf[Index].State = 1;

  57.                                 if(Index < IDBuf)
  58.                                 {
  59.                                         IDBuf = Index;                //如果当前运行任务优先级低于就绪任务则切换
  60.                                 }

  61.                         }
  62.                         else if((Task_Buf[Index].delay != 0) && (Task_Buf[Index].State == 0))
  63.                         {

  64.                                 Task_Buf[Index].delay -= 1;        //时间未到,时间标志减1

  65.                         }
  66.                 }
  67.         }
  68.         //将运行任务指针减去中断所用堆栈数得到中断返回前的堆栈指针,中断返回将加上
  69.         //中断所用掉的堆栈数量,就得到将运行任务的实际堆栈指针
  70.         SP = Task_Buf[IDBuf].p - Task_Run_SP;       
  71.         Task_Run_ID = IDBuf;                //改变当前运行任务ID

  72. }

  73. void Task_Kong(void)
  74. {
  75.         while(1);                                //当没有任务执行的时候就停留在此处,可以加入CPU空闲计算
  76. }

  77. void Time0_Task_Start(void)
  78. {
  79.         AddTask((uint16)Task_Kong, 0, Task_Max - 1);        //添加空任务
  80.         TCCR0A = 0x00;
  81.         TCCR0B = 0x03;
  82.         TCNT0 = 0x00;
  83.         TIMSK0 |= 0x01;
  84.         sei();
  85.         Task_Run_ID = Task_Max - 1;                                                //开始运行运行空任务,可用形参指定运行那个任务
  86.         SP = Task_Buf[Task_Run_ID].p;                                        //任务开始运行
  87. }
复制代码

出0入0汤圆

发表于 2012-7-23 22:40:05 | 显示全部楼层
我也写了一个简单的这个东西。。可是怎么没一个人顶。。。郁闷
源码:
  1. #include<avr/io.h>
  2. #include"Task.h"
  3. #include<avr/interrupt.h>

  4. #define Task_Max  5                                //任务数
  5. #define Stack_Top 12                        //任务堆栈空间


  6. typedef struct Task_Value
  7. {
  8.         uint8         p;                                        //任务堆栈指针
  9.         uint16        delay;                                //任务延时
  10.         uint8        State;                                //任务状态
  11. }Task;

  12. static Task Task_Buf[Task_Max];                                //任务空间

  13. static uint8 Task_SP[Task_Max][Stack_Top];        //任务堆栈空间

  14. static uint8 Task_Run_ID;                                        //正在运行任务ID

  15. void AddTask(uint16 TaskName, uint16 TaskDelay, uint8 TaskID)
  16. {
  17.         Task_Buf[TaskID].p = (uint16)Task_SP[TaskID] + 9;
  18.         //AVR单片机SP堆栈方向是由上往下生长的,执行RET的时候SP将加1,所以要比实际地址小1
  19.         Task_SP[TaskID][10] = (uint8)(TaskName >> 8);                //地址高8位
  20.         Task_SP[TaskID][11] = (uint8)(TaskName & 0xff);                //地址低8位
  21.         Task_Buf[TaskID].delay = TaskDelay;
  22.         Task_Buf[TaskID].State = 0;
  23. }

  24. void Task_Delay(uint16 Del)
  25. {
  26.         uint8 Temp = 0;
  27.         Task_Buf[Task_Run_ID].p        = SP;                                        //保存当前堆栈
  28.         Task_Buf[Task_Run_ID].delay = Del;                                //设置延时
  29.         Task_Buf[Task_Run_ID].State -= 1;                                //将状态置0

  30.         for(Temp = 0;Temp < Task_Max - 1;Temp++)
  31.         {
  32.                 if(Task_Buf[Temp].State == 1)                                //如果有任务处于就绪状态,执行.
  33.                 {
  34.                         break;
  35.                 }
  36.         }

  37.         SP = Task_Buf[Temp].p;                                                        //将任务堆栈地址赋给SP堆栈地址
  38.         Task_Run_ID = Temp;                                                                //运行改变ID
  39. }

  40. ISR(TIM0_OVF_vect)
  41. {
  42.         uint8 Index = 0;
  43.         uint8 IDBuf = Task_Run_ID;                                                //保存当前运行任务的ID
  44.         uint8 Task_Run_SP = Task_Buf[Task_Run_ID].p - SP;       
  45.         //任务堆栈指针减去当前堆栈指针得到中断所使用掉的堆栈

  46.         TCNT0 = 0x00;
  47.         Task_Buf[Task_Run_ID].p = SP + Task_Run_SP;
  48.         //当前堆栈指针加上中断所使用掉的堆栈数得到中断前堆栈指针,保存

  49.         for(Index = 0;Index < Task_Max;Index++)
  50.         {
  51.                 if(Task_Buf[Index].p != 0)
  52.                 {
  53.                         if((Task_Buf[Index].delay == 0) && (Task_Buf[Index].State == 0))
  54.                         {
  55.                                 //如果任务延时时间到,将就绪置位
  56.                                 Task_Buf[Index].State = 1;

  57.                                 if(Index < IDBuf)
  58.                                 {
  59.                                         IDBuf = Index;                //如果当前运行任务优先级低于就绪任务则切换
  60.                                 }

  61.                         }
  62.                         else if((Task_Buf[Index].delay != 0) && (Task_Buf[Index].State == 0))
  63.                         {

  64.                                 Task_Buf[Index].delay -= 1;        //时间未到,时间标志减1

  65.                         }
  66.                 }
  67.         }
  68.         //将运行任务指针减去中断所用堆栈数得到中断返回前的堆栈指针,中断返回将加上
  69.         //中断所用掉的堆栈数量,就得到将运行任务的实际堆栈指针
  70.         SP = Task_Buf[IDBuf].p - Task_Run_SP;       
  71.         Task_Run_ID = IDBuf;                //改变当前运行任务ID

  72. }

  73. void Task_Kong(void)
  74. {
  75.         while(1);                                //当没有任务执行的时候就停留在此处,可以加入CPU空闲计算
  76. }

  77. void Time0_Task_Start(void)
  78. {
  79.         AddTask((uint16)Task_Kong, 0, Task_Max - 1);        //添加空任务
  80.         TCCR0A = 0x00;
  81.         TCCR0B = 0x03;
  82.         TCNT0 = 0x00;
  83.         TIMSK0 |= 0x01;
  84.         sei();
  85.         Task_Run_ID = Task_Max - 1;                                                //开始运行运行空任务,可用形参指定运行那个任务
  86.         SP = Task_Buf[Task_Run_ID].p;                                        //任务开始运行
  87. }
复制代码

出0入0汤圆

发表于 2012-7-23 22:44:54 | 显示全部楼层
在我这个程序里面Task_Delay里面的Task_Buf[Task_Run_ID].State -= 1不知道为什么加了几个任务后不能用Task_Buf[Task_Run_ID].State = 0来清0,只有减1了,AVR的汇编看不懂。所以来请教一下

出0入0汤圆

发表于 2012-7-24 10:12:06 | 显示全部楼层
楼上的朋友,看了你前面2个函数,有两个地方不懂。。。。

1:
static uint8 Task_SP[Task_Max][Stack_Top];        //任务堆栈空间

Task_Buf[TaskID].p = (uint16)Task_SP[TaskID] + 9;

这里定义的是二维数组,为什么下面用的时候是一维数组了;

2:
        for(Temp = 0;Temp < Task_Max - 1;Temp++)
        {
                if(Task_Buf[Temp].State == 1)                                //如果有任务处于就绪状态,执行.
                {
                        break;
                }
        }

        SP = Task_Buf[Temp].p;                                                        //将任务堆栈地址赋给SP堆栈地址
        Task_Run_ID = Temp;                                                                //运行改变ID

这里,如果没有任务处于就绪状态呢? 执行第Task_Max - 2 个任务?貌似不太严谨;

出0入0汤圆

发表于 2012-7-24 14:47:23 | 显示全部楼层
shuxmpx123 发表于 2012-7-24 10:12
楼上的朋友,看了你前面2个函数,有两个地方不懂。。。。

1:

1.一个是Task_SP一个是Task_Buf不是一个
  如果是说Task_Buf[TaskID].p = (uint16)Task_SP[TaskID] + 9;这一句的话。这个是把Task_SP[TaskID]的地址给Task_Buf[TaskID].p。
2.这个我创建了一个优先级为最低的任务,为Task_Max - 1这里如果直接用Temp < Task_Max的话,那么在循环完后Temp就和Task_Max一样大了。程序创建了Task_Max个任务空间,是由0~Task_Max-1而不是0~Task_Max所以没有就绪任务就执行优先级最低的任务。也就是Task_Kong这个任务什么也不做。

出0入0汤圆

发表于 2012-7-24 14:49:41 | 显示全部楼层
http://www.amobbs.com/thread-5487993-1-1.html
我发的那个贴,我已经把测试的程序打包放在5楼。你可以下去看看

出0入0汤圆

发表于 2012-7-24 14:51:48 | 显示全部楼层
Tliang 发表于 2012-7-24 14:47
1.一个是Task_SP一个是Task_Buf不是一个
  如果是说Task_Buf[TaskID].p = (uint16)Task_SP[TaskID] + 9; ...

哦  明白了,谢谢

出0入0汤圆

发表于 2012-7-24 15:03:33 | 显示全部楼层
我贴那个程序是ATTINY24上面测试可以的。。。后面打包的是ATmega8的。前面是在ATmega8上测试后来移到ATtiny24上面了,有两个我没细看就把程序贴出来了,汗。。。难怪没人理。大概别人一看就以为不行吧。毕竟ATtiny24没多少人用过吧。。。

出0入16汤圆

发表于 2012-7-26 09:51:00 | 显示全部楼层
对此贴标准一下,系统工作原理上还有有所欠缺!

出0入0汤圆

发表于 2012-7-27 09:20:46 | 显示全部楼层
强帖留名。

出0入0汤圆

发表于 2012-8-14 16:50:44 | 显示全部楼层
avr rtos学习

出0入0汤圆

发表于 2012-8-14 20:41:19 | 显示全部楼层
mark很好的东西

出0入0汤圆

发表于 2012-9-10 13:00:42 | 显示全部楼层
mark,标记一下。

出0入0汤圆

发表于 2012-9-12 11:06:55 | 显示全部楼层
mark,AVR rtos

出0入0汤圆

发表于 2012-11-26 10:38:10 | 显示全部楼层
最近也认识了一位大虾,研究RTOS ,我也想找个入门的资料学习一下,结果看到这帖子了,感谢分享!!!

出0入0汤圆

发表于 2012-12-3 21:16:30 | 显示全部楼层
先记下,再慢慢看!

出0入0汤圆

发表于 2012-12-3 21:21:28 | 显示全部楼层
果断收藏!

出0入0汤圆

发表于 2012-12-6 22:38:31 | 显示全部楼层
我已经复印了

出0入0汤圆

发表于 2012-12-23 17:24:59 | 显示全部楼层
好东西啊,谢谢啦

出0入0汤圆

发表于 2013-1-3 14:51:00 | 显示全部楼层
求教:
//防止被编译器占用

register unsigned char tempR4  asm("r4");

register unsigned char tempR5  asm("r5");

register unsigned char tempR6  asm("r6");

register unsigned char tempR7  asm("r7");

register unsigned char tempR8  asm("r8");

register unsigned char tempR9  asm("r9");

register unsigned char tempR10 asm("r10");

register unsigned char tempR11 asm("r11");

register unsigned char tempR12 asm("r12");

register unsigned char tempR13 asm("r13");

register unsigned char tempR14 asm("r14");

register unsigned char tempR15 asm("r15");

register unsigned char tempR16 asm("r16");

register unsigned char tempR16 asm("r17");

为什么要重复定义?

register unsigned char tempR16 asm("r16");

register unsigned char tempR16 asm("r17");

tempR16代表的是r16还是r17???

出0入0汤圆

发表于 2013-4-17 16:58:29 | 显示全部楼层
有时间一定要研究研究!!!

出0入0汤圆

发表于 2013-4-18 11:16:39 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-4-21 21:18:17 | 显示全部楼层
谢谢莫老大的分享!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2014-2-28 15:53:11 | 显示全部楼层
好好收藏下  顶一个。。。

出0入0汤圆

发表于 2014-7-9 12:00:35 | 显示全部楼层
让这帖子继续啊,我现在用的ICC7,好像不支持*stack_p--= (unsigned int)Task;       //将任务的地址低位压入堆栈,
    *stack_p--= (unsigned int)Task >> 8;  //将任务的地址高位压入堆栈,这种取函数地址,取出来的地址是错误的

出0入0汤圆

发表于 2014-7-10 10:36:37 | 显示全部楼层
armok 发表于 2006-1-17 11:35
第八篇:占先式内核(完善的服务)



    如果将前面所提到的占先式内核和协作式内核组合在一起,很容易就可以 ...

学习了……谢谢!

出0入0汤圆

发表于 2014-7-10 15:55:25 | 显示全部楼层
學習中,我要加油

出0入0汤圆

发表于 2014-7-14 19:37:21 | 显示全部楼层
写的非常好~~

出0入0汤圆

发表于 2014-8-1 16:45:45 | 显示全部楼层
PaulDE 发表于 2008-1-31 21:07
第八篇,占先式内核(完善的服务) 谁试过了?不知道何故我只是在PC端无休止的收到 0x00,郁闷啊
自己对串口 ...

00是有事在串口初始话的时候,URD = 0;你屏蔽掉就没有了

出0入0汤圆

发表于 2014-8-1 16:58:29 | 显示全部楼层
armok 发表于 2009-11-24 00:39
楼上,留意标题 : 教程: 建立一个属于自己的AVR的RTOS (作者:hjc800323)

已经注明了作者不是我。 ...

这贴子,有没有运行成功的啊,在设置串口的地方好像有问题,不应该在初始化时,置寄存器空中断,还有运行一次就复位

出0入0汤圆

发表于 2014-8-1 16:59:47 | 显示全部楼层
dzyong 发表于 2010-1-28 23:33
试过代码任务可以被挂起,但是任务恢复不了,不知怎么回事?

你们有试过,难道没有问题么?? ...

嗯,试了3天了,也不太好使

出0入0汤圆

发表于 2014-8-1 17:00:44 | 显示全部楼层
savagex 发表于 2010-3-16 10:01
事实证明,不管哪一个,所有任务运行一次后,都会复位,从0000开始重新运行。想了很久没想明白哪的问题。所 ...

3天了,我也准备放弃了

出0入0汤圆

发表于 2014-8-13 22:47:53 | 显示全部楼层
现在在学习嵌入式系统,暂时还看不懂

出0入0汤圆

发表于 2014-8-14 09:19:53 | 显示全部楼层
avr的rtos                                         mark

出0入0汤圆

发表于 2014-9-3 12:29:36 | 显示全部楼层
好叼的帖子!!

出0入0汤圆

发表于 2014-9-4 19:25:53 | 显示全部楼层
必须顶啊...............

出0入0汤圆

发表于 2018-7-6 19:41:56 | 显示全部楼层
惭愧,03年的时候刚上大学,就知道瞎金钵玩。现在知道多学点用处大了,回头学了。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-25 15:23

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

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