嵌入式os的实现一之任务切换的实现

来源:互联网 发布:手机点数软件 编辑:程序博客网 时间:2024/04/29 07:06

了解了很多os,uc/os、vsWorks,Linux等等,在使用它们的同时我更好奇os是如何实现的,看了很多书,也没找到os实现的细节,或许是基本功不到位。慢慢的查找资料终于实现了一个简单得不能在简单的os。

我很在刷牙的时候能够把洗脸盆拿去接热水,等我们刷完牙过后就去取水就行了,这样我们节约了等待的时间。我想os也是起这个作用吧。

os的实现最神奇莫过于在于任务切换,只有掌握了基本的任务切换才能继续后续的任务开发。下面来一个简单的4任务圆形切换的os。程序实在51单片机上实现的。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <reg52.h>typedef unsigned char UINT8_T;typedef unsigned short int UINT16_T;typedef unsigned long int UINT32_T;typedef signed char INT8_T;typedef signed short int INT16_T;typedef signed long int INT32_T;void task_one( void );void task_two( void );void task_three( void );void task_four( void );void task_delay( UINT16_T ms );void task_switch( UINT8_T task_num );UINT8_T task1_stack[10];UINT8_T task2_stack[10];UINT8_T task3_stack[10];UINT8_T task4_stack[10];UINT8_T task_sp[4];void main( void ){task1_stack[1]=( UINT8_T )task_one;task1_stack[2]=(( UINT16_T )task_one)>>8;task2_stack[1]=( UINT8_T )task_two;task2_stack[2]=(( UINT16_T )task_two)>>8;task3_stack[1]=( UINT8_T )task_three;task3_stack[2]=(( UINT16_T )task_three)>>8;task4_stack[1]=( UINT8_T )task_four;task4_stack[2]=(( UINT16_T )task_four)>>8;task_sp[0]=&task1_stack[2];task_sp[1]=&task2_stack[2];task_sp[2]=&task3_stack[2];task_sp[3]=&task4_stack[2];SP = task_sp[0];}void task_one( void ){while(1){P0 = 0;task_delay(500);task_switch(1);}}void task_two( void ){while(1){P0 = 0xff;task_delay(500);task_switch(2);}}void task_three( void ){while(1){P0 = 0;task_delay(500);task_switch(3);}}void task_four( void ){while(1){P0 = 0xff;task_delay(500);task_switch(0);}}void task_delay( UINT16_T ms ){UINT16_T i,j;for( i = ms ; i > 0 ; i-- )for( j= 110 ; j > 0 ; j-- );}void task_switch( UINT8_T task_num ){SP = task_sp[task_num];}
任务的切换是通过修改堆栈指针sp实现的,当程序执行RET或是RETI指令时,cpu会自动的将sp指向的pc的值弹入pc中,这样就实现了任务切换。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 房子买了新生儿户口怎么办 吃海鲜拉稀拉水怎么办 吃海鲜腹泻拉水怎么办 两个月宝宝不爱睡觉怎么办 2个月宝宝干呕怎么办 9个月宝宝拉稀的怎么办 宝宝拉肚子快一个月了怎么办 满月宝宝发烧38度怎么办 大人腹泻10天了怎么办 十个月宝贝拉水怎么办 十个月宝宝脱水哭闹怎么办 宝宝肠胃不好老是拉肚子怎么办 七个月的宝宝老是拉肚子怎么办 6个月宝宝拉肚子怎么办 没满月宝宝吐奶怎么办 八个月宝宝有点拉肚子怎么办 4个月宝宝拉水怎么办 2岁宝宝消化不好拉肚子怎么办 两岁宝宝老拉肚子怎么办 2岁宝宝拉肚子老不好怎么办 2岁宝宝一直拉肚子不好怎么办 5天新生儿拉稀水怎么办 4天新生儿拉稀水怎么办 新生儿40天拉稀水怎么办 一周多的宝宝拉肚子怎么办 出生半个月的宝宝拉肚子怎么办 刚出生几天的宝宝拉肚子怎么办 刚出生的宝宝拉肚子怎么办 出生八天的宝宝拉肚子怎么办 刚出生婴儿拉水怎么办 三岁宝宝一直吐怎么办 3岁宝宝一直吐怎么办 5个月宝宝一直吐怎么办 新生儿睡反了觉怎么办 吃母乳奶流量大怎么办 两个月宝宝有痰怎么办 婴儿瞌睡睡倒了怎么办 侧切伤口崩开了怎么办 脐带30天未脱落怎么办 洗眉结痂不掉怎么办 新生宝宝生殖器下面破皮怎么办