复习到操作系统这本书,在看到进程管理的时候,想起以前费了相当大的时间去做一个属于自己的操作系统,结果什么都没弄出来。
趁着看到这个章节,又一次地萌生了这个想法,于是网上各种寻找资料。发现现在的大多数操作系统都已经比较完善,换而言之,就是太庞大。无法去理解,无法自己照搬原文去弄一个属于自己的操作系统出来。
机缘偶得之下,发现了一篇关于在单片机下面实现一个实时操作系统的文章, 即《建立一个属于自己的AVR的RTOS》,这篇文章比起讲什么操作系统原理、unix内核分析、linux内核分析、xx内核分析等等来说,简单明了了很多(有兴趣的同学们可以去研究一下这篇文章)。在参考这篇文章以及在51单片机下面使用汇编语言编程,以及众多网上资料之后。总结地写出了一个"在51单片机下具有延时功能占先式内核的操作系统“,并仿真成功,加深了我对操作系统这个东西的小小理解。下面附上程序代码以及实现。
如果网页复制代码有错误,操作系统的完整代码请从这里下载:http://www.51hei.com/f/12545.rar
[page]
以下是部分代码:
#include#define MAX_TASKS 5 typedef struct os_task_control_table { unsigned char os_task_wait_tick; unsigned char os_task_stack_top; }TCB; volatile unsigned char int_count; volatile unsigned char os_en_cr_count; #define enter_int() EA=0;int_count++; #define os_enter_critical() EA=0;os_en_cr_count++; #define os_exit_critical() if(os_en_cr_count>=1)
{os_en_cr_count--;if(os_en_cr_count==0)EA=1;} unsigned char code os_map_tbl[] = {0x01, 0x02, 0x04,
0x08, 0x10, 0x20, 0x40, 0x80}; volatile unsigned char os_task_int_tbl; idata volatile TCB os_tcb[MAX_TASKS]; volatile unsigned char os_task_running_id; volatile unsigned char os_task_rdy_tbl; unsigned char idata os_task_stack[MAX_TASKS][20]; void os_init(void); void os_task_create(unsigned char task_id ,
unsigned int task_point,unsigned char stack_point); void os_delay(unsigned char ticks); void os_start(void); void os_task_switch(void); void exit_int(void); void os_init(void) { EA = 0; ET2 = 1; T2CON = 0X00; T2MOD = 0X00; RCAP2H = 0x0D8; RCAP2L = 0x0F0; os_task_rdy_tbl = 0; os_task_int_tbl = 0xff; int_count = 0; os_en_cr_count = 0; } void os_task_create(unsigned char task_id ,
unsigned int task_point,unsigned char stack_point) { os_enter_critical(); ((unsigned char idata *)stack_point)[0] = task_point; ((unsigned char idata *)stack_point)[1] = task_point>>8; os_tcb[task_id].os_task_stack_top = stack_point+14; os_task_rdy_tbl |= os_map_tbl[task_id]; os_tcb[task_id].os_task_wait_tick = 0; os_exit_critical(); } void os_delay(unsigned char ticks) { os_enter_critical(); os_tcb[os_task_running_id].os_task_wait_tick = ticks; os_task_rdy_tbl &= ~os_map_tbl[os_task_running_id]; os_exit_critical(); os_task_switch(); } void os_start(void) { os_task_running_id = 0; os_tcb[os_task_running_id].os_task_stack_top -= 13; EA = 1; SP = os_tcb[os_task_running_id].os_task_stack_top; TR2 = 1; } void os_task_switch(void) { unsigned char i; EA = 0; os_tcb[os_task_running_id].os_task_stack_top = SP; os_task_int_tbl &= ~os_map_tbl[os_task_running_id]; for(i=0; i0; x--) for(y=248; y>0; y--); } unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0}; void task_1(void) { unsigned char gw,sw,bw; while(1) { bw = os_tcb[2].os_task_wait_tick/100; sw = os_tcb[2].os_task_wait_tick%100/10; gw = os_tcb[2].os_task_wait_tick%10; P0 = table[bw]; seg2=0; delay_ms(3); seg2=1; P0 = table[sw]; seg3=0; delay_ms(3); seg3=1; P0 = table[gw]; seg4=0; delay_ms(3); seg4=1; } } void task_2(void) { unsigned char i; while(1) { i++; P3 = 0x01<<(i%8); os_delay(200); } } void task_3(void) { unsigned char i; while(1) { i++; //P2 = 0x01<<(i%8); os_delay(7); } } void task_4(void) { unsigned char i; while(1) { i++; P1 = 0x01<<(i%8); os_delay(10); } } void main(void) { os_init(); os_task_create(4,(unsigned int)&task_0,(unsigned char)os_task_stack[4]); os_task_create(3,(unsigned int)&task_1,(unsigned char)os_task_stack[3]); os_task_create(2,(unsigned int)&task_2,(unsigned char)os_task_stack[2]); os_task_create(1,(unsigned int)&task_3,(unsigned char)os_task_stack[1]); os_task_create(0,(unsigned int)&task_4,(unsigned char)os_task_stack[0]); os_start(); }
实现的图片:
[page]
讲解一下实现的内容:
task_0是个空循环
task_1的作用是提取task_2的等待时间,显示在数码管上
task_2是在P3口上的跑马灯(2秒跑一个灯)
task_3是单纯地调用任务延时
task_4在P1口上的跑马灯(100ms跑一个灯)
程序使用定时器2计数器产生的中断作为时钟源,时钟的节拍是10ms一次。
当然这个渺小的操作系统只实现了一些相当基本的功能:多任务和系统延时以及抢占优先级。还有信号量、内存管理、事件、邮箱等等机制尚未实现,但是懂了这个基础内容之后,其它的东西,都是在上面做扩充的。
记得在一篇资料里面听到过这个:会写状态机的程序员,肯定会写操作系统。这句话到现在觉得相当正确。操作系统就是一个另类的状态机,人为地干预了子程序调用和返回的过程。庆幸当年的汇编没白学,操作系统需要懂得一些基本的硬件结构,汇编,C语言,当懂得这些之后,再去网上多搜索点相关的资料,并且自己去用代码一行行实现,加以时日,操作系统便能轻松地玩转与手.
在此,感谢黄健昌在网上的发表的《 建立一个属于自己的AVR的RTOS》,这篇文章让我对RTOS有了一个浅显的了解
风城少主发表的《建立一个属于自己的51实时操作系统》,指导我在熟悉的51单片机上实现这个操作系统。
芯源老师的《芯源的单片机教程》为我提供了51单片机汇编及其硬件架构的深入了解。
感谢http://www.51hei.com/mcu/1111.html 这个作者的激励与鼓励
真诚地感谢上面提及的人,让我能够入门操作系统,进而了解到什么是嵌入式操作系统,怎么去具体实现。
上一篇:基于stc89c52rc单片机的数字钟设计(数码管显示)
下一篇:基于单片机控制12864显示矩阵键盘输入的计算器
推荐阅读最新更新时间:2024-03-16 13:05