创业史读书笔记500 创业史读书笔记500字初中

在“学习笔记(一)”里 , 已经掌握了并行多任务的实现 , 和利用修改sp内容 , 子程序结束调用ret来实现程序跳转 。但程序没有涉及中断 , 任务中有中断 , 程序会失去控制 。  
这一单元 , 要学习带中断问题的多任务操作系统:"在51单片机下具有延时功能占先式内核的操作系统"  
在网上找的这个程序比较简短 , 也符合本单元的学习任务 。  
不过有一个麻烦 , 这个程序用到了52扩展的一些功能 , 需要先学习89c52单片机的一些寄存器和计数器使用 。  
全部源代码如下:程序详细讲解 , 和源自于http://www.51hei.com/mcu/1325.html  
//可以直接拷贝到keil中调试  
#include <regx52.h>  
#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++;//关中断 , 关中断次数增加1  
#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];//任务堆栈 , 每个任务有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; //计数器2的初始化  
os_task_rdy_tbl = 0; //  
os_task_int_tbl = 0xff; //中断  
int_count = 0; //中断的次数  
os_en_cr_count = 0; //关闭中断的次数  
}  
【创业史读书笔记500 创业史读书笔记500字初中】//任务加载  
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;//task_point是16位的,把任务的程序地址记录下来  
((unsigned char idata *)stack_point)[1] = task_point>>8;//右移8位,高位地址在上面  
os_tcb[task_id].os_task_stack_top = stack_point+14;//堆栈结构:有两字节程序地址 , 13字节的其他数据 , 所以栈顶部是加14(0-14)  
os_task_rdy_tbl |= os_map_tbl[task_id];//任务的状态就绪  
os_tcb[task_id].os_task_wait_tick = 0;//装载任务 , 任务的等待时间就是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; //由任务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; //把任务一的程序地址给sp


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。