嵌入式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
- 嵌入式os的实现一之任务切换的实现
- 一步一步实现一个简单的OS(试验任务切换)
- 一步一步实现一个简单的OS(任务切换)
- CosOS任务切换的实现
- JongXie OS 任务调度的实现
- 进入OS前的两步之PendSV(任务切换)
- 嵌入式操作系统之时钟节拍下的任务切换
- uC/OS-II学习心得与改进(一) uC/OS-II的任务切换总结
- 嵌入式uC/OS-2的任务管理
- uC/OS-II的任务切换总结
- UC/OS-II的任务切换
- uC/OS-II的任务切换总结
- uc/os之任务切换
- 基于嵌入式OS的任务设计-----任务划分
- 嵌入式系统应用中实现RS485的方向切换
- secureCRT+screen实现多任务窗口的快速切换
- DOM特效之tab切换的实现
- 异步任务的实现之文件管理器
- 自我否定
- UVa 211 - The Domino Effect(枚举+回溯)
- Bigtable:一个分布式的结构化数据存储系统
- 指针的指针的实际使用例子
- 关于二叉树的一道面试题
- 嵌入式os的实现一之任务切换的实现
- Jenkins入门总结
- PHP页面静态化技术
- POJ 2104 K-th Number
- iOS访问通讯录开发-读取联系人信息
- <机器学习系统设计>第十章(上)----代码与错误分析
- oracle rownum
- iOS UITextView调整行间距
- 对于php内存释放问题