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

📄 说明.txt

📁 51上写的一个简单的操作系统
💻 TXT
字号:
*************基于51内核的圈圈操作系统****************

说明:这是本人学习嵌入式操作系统后在51上写的一个简单的操作系统,
      提供创建任务,删除任务,任务调度,系统延时,任务挂起,发送消息,
      等待消息,CPU使用率统计,系统时间,串口发送、接收数据及串口资源管理等
      功能。由于时间匆忙,部分注释可能在调试时忘记更改,如有发现不能理解的注释,
      请给圈圈留言: http://blog.21ic.com/blog.asp?name=computer00

      可使用keil自带的软件仿真,也可以使用硬件来运行,使用硬件时,上位机推荐使用
      windows自带的超级终端,关于超级终端的使用,可参看:
      http://blog.21ic.com/more.asp?name=iC921&id=8878

      输入k键后,再输入任务ID号即可删除该任务;输入c键后,再输入要建立的任务号,
      即可创建任务。由于启动时,已经创建了5个任务,所以已经没有资源可用,所以在
      创建任务时先删除任务。注意,因为任务3是负责处理串口接收数据的,所以在删除
      任务3后(实际上删除任务3是自己被自己删除),由于没有接收数据的处理,所以
      输入数据将没有响应,只有通过复位后,才能重新输入数据。不过如果事先先删除
      另一个任务,再建立一个任务3,那么,就可以删除原有任务3了,这时还剩一个任务3
      来负责数据输入的处理。

      任务0:任务0为优先级最低的任务,必须第一个被创建。任务0可用来统计CPU的使用率。
      任务1:任务1提供系统时间。可使用s,m,h键分别减小秒、分、时的值,而大写的字母功能刚好相反。
      任务2:任务2不断的输出字符"|/-\",形成一个旋转的动作。使用'+'来增加速度,'-'来减慢速度。
      任务3:任务3负责接收并处理串口数据。
      任务4:任务4负责接收任务0的消息,并显示CPU使用率信息。


      关于堆栈:堆栈是unsinged char型的一个二维数组,堆栈被分成固定大小的块使用,每个任务占用一个堆栈块。

      关于任务ID:任务ID是在任务被创建时,由OS分配的,不能指定。如果要知道任务ID是多少,可在
      任务创建时,保存返回的任务ID号(由于ID号0被分配给空闲任务,所以返回0是创建任务不成功)。
      另一个办法是,通过OS_Current_ID。在任务中,OS_Current_ID的值始终是当前运行任务的ID号。

      任务列表:任务列表是一个8位的位图。最低位表示0号ID,以此类推。当某位被置1时,表示该ID号的
      任务已被创建(即任务存在),当某位置0时,该ID号的任务不存在,资源可用,可被分配给其它任务使用。
      创建任务时,扫描该列表,找出可用资源,分配给新的任务,并返回被分配到的ID号。由于内存资源有限,
      目前最多可有5个任务。

      任务创建:任务可以在OS启动之前创建,也可以在运行过程中创建,只要资源够用,就可以创建。

      任务删除:将要被删除的任务从任务列表中清除掉,并释放所占有的资源。任务可以删除本身,参数使用
                OS_Current_ID即可,即OS_Task_Kill(OS_Current_ID);。

      关于pcb:pcb是程序控制块的简写。里面保存了一个任务的堆栈入口、优先级、是否挂起、延迟时间、消息指针等信息。

      任务切换:任务切换时,将当前工作寄存器压栈保存,然后切换堆栈指针,函数返回时,就返回到了另一个任务。

      时钟节拍:使用定时器2定时10mS作为始终节拍。每隔10mS将需要延迟的任务延时节拍数减1,并查找优先级最高的任务。

      任务延迟:将任务延迟节拍数设置成非0的值,并挂起任务。任务延迟节拍数每隔10mS减1,直到0后,任务被唤醒,重新运行。
      
      任务挂起:将任务的suspend标志设置为非0值,该任务就被挂起。

相关细节问题,可以看源代码中的注释,有什么不清楚的地方,请给我留言,我们共同讨论。

⌨️ 快捷键说明

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