📄 说明.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 + -