⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avrrtos技术文档.txt

📁 一个小的操作系统包括应用程序很有参考价值
💻 TXT
字号:
各位好!
多谢你阅读、学习或使用本操作系统。

本次公开的操作系统暂时命名为 Mini Rtos AVR v1.00 Bate 测试版本

本操作系统比上次的Mini X C51有质的飞跃!
因为是重写并不是移植!并且公开全部源代码!

本系统并未进行过硬件测试,只通过AvrStdio 4的模拟运行,
因此如果你发现本系统出现错误或缺陷请你及时通知我,
我会尽快修改。

还有我收回本系统的所有权!请大家尊重知识产权!

1、操作系统介绍
  本操作系统为实时嵌入式操作系统(占先式),目前支持AVR CPU
编译器为GNU GCC 3.3 for Avr 就是大家熟悉的WinAvr加上ElftoCoffbate
补丁文件,makefile文件是从补丁中获得的。IDE界面为PN,WinAvr自带那个,
不过是最新版本是免费下载的。设计支持芯片为Atmage8,如果你需要支持
其他芯片,或者使用其他TICK信号默认为T0,请你修改内核文件以获得支持。

2、操作系统的特点
   本操作系统可以提供256条线程,256个优先级(每条线程的优先级必须唯一
)必须建立一条最低优先级的空闲线程,该线程可以作为统计或者低功耗处理,
但必须存在。并且不能带有OS_TASK_DLY()函数使其进入等待状态。
  每条线程都必须为无限循环函数,如果你需要停止该线程,可以改变他的动作
标志位。空闲线程不能停止。

2、操作系统文件说明
  本操作系统带有两个文件一个为C文件(MXAVR.C),另一个为汇编文件
(OS_CPU.S).具体两个文件的修改方法在该文件上都有说明.
    用户使用时有一个地方必须修改就是
      #define TASK_NUMBER 4 
    是用来记录用户所建立的线程数目其中包括空闲线程

    如果用户需要修改时钟节拍,就需要修改两个C函数

    inline void OS_START_TICK(void);//启动RTOS
    void OS_RELOAD_TICK(void);//重新初始化系统时钟

    如果用户需要更改节拍源,就需要修改汇编文件中的
         ;中断入口
         .global	SIG_OVERFLOW0              ;中断入口点 用户根据情况修改
         SIG_OVERFLOW0:                     ;中断入口点 用户根据情况修改
    以确定中断入口

3、操作系统的函数说明
    操作系统提供用户使用的函数只有4个分别为:
    OS_CREATE_TASK()     建立线程函数
    OS_START_TICK()      启动操作系统
    OS_GET_TASK_ID()     获取线程ID
    OS_TASK_DLY()        线程等待

    其它函数都是操作系统内部使用

    操作系统是以线程TCB为基础,每条线程都拥有自己的TCB.而TCB是建立在
OS_TASK_ARRY[]数组里面.所以只要你获得线程ID就可以对该线程进行修改.

4、使用操作系统的要点
   在使用操作系统时必须明确使用的必要性。使用时尽量减少建立无谓线程,以
节省RAM资源。小心安排每条线程的堆栈区域,慎防出现线程堆栈重叠情况。这需
要长时间的现场调试!!!
   在OS_START_TICK()前完成所有线程的建立工作。本系统不支持重入函数操作,
如果的确需要使用,那么你就需要确保所有线程都在一个时钟TICK内完成,就是
在一个TICK内所有线程都已经调用了OS_TASK_DLY()函数并且所有被调用的可重入
函数都已经返回,空闲函数除外。不过空闲函数是不能调用重入函数和OS_TASK_DLY()的。
    如:
      void task_1(void)
        {
         for (;;)
         {
          fun1();            //调用重入函数1 (必须在一个时钟节拍内完成)
          fun2();            //调用重入函数2 (必须在一个时钟节拍内完成)
          fun3();            //调用重入函数3 (必须在一个时钟节拍内完成)
          OS_START_TICK(1);  //进入等待状态,等待一个时钟节拍,此时会调入下一条线程执行
         }                   //假设下一条线程为task_2
        }

      void task_2(void)
        {
         for (;;)
         {
          fun1();            //调用重入函数1 (必须在一个时钟节拍内完成)
          fun2();            //调用重入函数2 (必须在一个时钟节拍内完成)
          fun3();            //调用重入函数3 (必须在一个时钟节拍内完成)
          OS_START_TICK(1);  //进入等待状态,等待一个时钟节拍,此时会调入下一条线程执行
         }                   //假设下一条线程为空闲函数了
        }

    //空闲函数 在一个TICK未结束前必须进入到空闲函数。否则fun1,fun2,fun3里面的变量会被从新刷写
      void task_free(void)
        {
         for (;;)
         {
          fun1();           //错误 空闲函数是不能调用重入函数
          fun2();           //错误 同上
          fun3();           //错误 同上
          OS_START_TICK(1); //错误 空闲函数是不能调用OS_START_TICK()函数
          sleep();          //让它休息是个好主意
         }
        }
   同时fun1 fun2 fun3里面的变量不能为静态。
   判断可重入函数和不可重入函数是有方法的,可重入函数是不能操作一个固定的RAM地址或IO口。不可重入
函数操作的是一个固定的RAM地址或IO口,所以带有静态变量的函数就不是可重入函数。

   在线程内部变量声明问题。由于C编译器会重用或共用RAM空间,所以线程变量
必须声明为静态不可优化类型
   如:
     unsigned char i;
   应声明为
     volatile static unsigned char i;

   对于一些可重入函数但是又只有一条线程调用,而没有被重入.那么建议将它内部的变量都声明为不可优化
静态变量,这样可避免编译器分配出相同地址而出现的数据意外刷新.毕竟这个版本不支持重入函数,请各位谅
解!

5、关于MAKEFILE的一些说明
   我的MAKEFILE是修改他人编写的,所以我发现一个奇怪问题。添加OS_CPU.S汇编文件时,必须把扩展名改为
OS_CPU.O否这会出现无法连接现象。请大家注意!还要注意优化级别的选择,这个我还没有细心研究过。不过
同的优化级别出来的代码完全不同,大家要明确这一点。在MAKEFIEL中我把它设为0(关闭)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -