去年玩过一阵单片机,也用过μc/osⅡ的系统,但是就理解内核而言,整个即时操作系统还是过于冗杂,很多的东西很不适合初学者来动手操作,多方查找我发现他的任务机制可以进行功能的进一步简化,

可以类似于任务栈的方式,使用纯C写成而不用汇编代码,闲话少说上代码吧。

  我的github上有我的渣代码=_=:https://github.com/lfkdsk

  灵魂画作任务图:

随手就是灵魂画作=-=

  1.主函数:

 #include "OS_task.h"
#include "89c51.h"
#include "main.h"
#include "task_switch.h"
#include <reg52.h>
sbit K1=P0^;
void del10ms()
{
unsigned char a,b,c;
for (c=;c>;c--)
for(b=;b<;b++)
for(a=;a<;a++);
}
void task_1()
{
while()
{
if(K1==)
del10ms();
if(K1==)
{
task_switch();
}
}
} void task_2()
{
while()
{
if(K1==)
del10ms();
if(K1==)
{
task_switch();
}
}
} void task_3()
{ while()
{
if(K1==)                              //这里是五个放在任务栈里的空函数,只用里一个循环来循环监听按键,可以再循环中加入自己的东西,比如亮起小灯啊,什么的易于观察的现象
del10ms();
if(K1==)
{
task_switch();
}
}
} void task_4()
{
while()
{
if(K1==)
del10ms();
if(K1==)
{
task_switch();
}
}
} void task_5()
{
while()
{
if(K1==)
del10ms();
if(K1==)
{
task_switch();
}
}
}
void main(void)
{
// 载入函数 优先级 任务名 任务ID
task_load(,task_1, );
task_load(,task_2, );
task_load(,task_3, );
task_load(,task_4, );
task_load(,task_4, );
OS_Start();
}

2.任务装载(核心):

 #ifndef __OS_TASK_H__
#define __OS_TASK_H__
//任务功能
//最大任务数
#define MAX_TASK 5
//堆栈深度
#define SRACK_DEPTH 20
//保存切换任务时软件压栈字节数
#define Num_PUSH_bytes 13
//程序控制块结构
typedef struct
{
unsigned char Task_SP; //任务堆栈指针
unsigned char Priority; //优先级,值越小,优先级越高 }PCB; extern idata volatile PCB OS_PCB[MAX_TASK];//定义堆栈
extern volatile unsigned char OS_TASK_ID;//定义任务ID
void task_load(unsigned char PRI,unsigned int FN,unsigned char T_ID);
void OS_Start(T_ID);
#endif
 //系统任务程序
#include "OS_task.h"
#include "89c51.h"
#include "main.h"
#include "task_switch.h"
#include <reg52.h>
//程序控制块
idata volatile PCB OS_PBC[MAX_TASK];    //volatile是为了每次必须读值 这个是任务栈的最大任务数,任务栈名字叫PCB=-= //当前运行任务的ID号
volatile unsigned char OS_TASK_ID;       //声明堆栈,由最大任务数和栈深定义的二维数组
unsigned char idata OS_Stack[MAX_TASK][SRACK_DEPTH];     //任务装载函数
void task_load(unsigned char PRI,unsigned int FN,unsigned char T_ID)
{
OS_PCB[T_ID].Priority=PRI;            //因为是简化的,所以我手动设置了优先级
OS_PCB[T_ID].Task_SP=OS_Stack[T_ID]+;     //这里取出了当前正在运行的任务的函数地址的高八位存为指针
OS_Stack[T_ID][] = (unsigned int)FN & 0xff; //低八位存0
OS_Stack[T_ID][] = (unsigned int)FN << ;   //高八位存在1里
} //任务运行函数
void OS_Start(T_ID)
{
OS_TASK_ID=T_ID;
SP=OS_PCB[OS_TASK_ID].Task_SP;     //传入一个id,然后把sp指针指向它,sp指针是系统的任务指针,用于指向执行任务的
                 //之后就不管了,就会按照自己的方式运行了
}

3.任务切换:

 //任务交换程序
#include "OS_task.h"
#include "89c51.h"
#include "main.h"
#include "task_switch.h"
#include <reg52.h>
//任务调度函数
void task_switch(){
static int i;
unsigned char j,MAX;
OS_PCB[OS_TASK_ID].Task_SP = SP;       //先把运行的指针地址存到该任务id对应的指针空间中
for(i=;i<MAX_TASK;i++)
{
MAX=j;                    //然后在循环找到优先级最高的(Priority最小的)
if(OS_PCB[j].Priority<OS_PCB[i].Priority||j!=OS_TASK_ID) //如果优先级高,则切换之
{
    j=i;
    }
}
    OS_TASK_ID=j;
    SP = OS_PCB[OS_TASK_ID].Task_SP;
}

好了,到这我们的精简版任务机制就搞定了,大家可以去试试啦,利用类堆栈的存储函数运行地址的方式进行挂起操作,来循环运行任务

么么哒,求赞=_=

μc/osⅡ简化版任务机制浅析的更多相关文章

  1. Linux模块机制浅析

    Linux模块机制浅析   Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...

  2. InnoDB的锁机制浅析(二)—探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁)

    Record锁/Gap锁/Next-key锁/插入意向锁 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Recor ...

  3. InnoDB的锁机制浅析(All in One)

    目录 InnoDB的锁机制浅析 1. 前言 2. 锁基本概念 2.1 共享锁和排它锁 2.2 意向锁-Intention Locks 2.3 锁的兼容性 3. InnoDB中的锁 3.1 准备工作 3 ...

  4. Linux模块机制浅析_转

    Linux模块机制浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/3730131.htmlLinux允许用户通过插入模块,实现干预内核的目的.一直以来,对l ...

  5. 【ARM-Linux开发】Linux模块机制浅析

    Linux模块机制浅析   Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...

  6. typecho流程原理和插件机制浅析(第二弹)

    typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...

  7. typecho流程原理和插件机制浅析(第一弹)

    typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...

  8. oracle的resetlogs机制浅析

    oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?它的原理 ...

  9. webpack模块机制浅析【一】

    webpack模块机制浅析[一] 今天看了看webpack打包后的代码,所以就去分析了下代码的运行机制. 下面这段代码是webpack打包后的最基本的形式,可以说是[骨架] (function(roo ...

随机推荐

  1. 【jQuery基础学习】10 简单了解jQuery Mobile及jQuery各个级别版本的变化

    关于 jQuery Mobile jQuery Mobile是为了填补jQuery在移动设备应用上的一个新项目.它应用了HTML5和CSS3. 主要特性 基于jQuery构建. 采用与jQuery一致 ...

  2. flask环境开发搭建

    http://blog.csdn.net/chen_jint/article/details/50550636 ========== 因为笔者开发环境是win7pro,那么就以win7pro为例. p ...

  3. JPA学习(1)基础认知

    JPA 是什么 Java Persistence API:用于对象持久化的API. Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层: JPA和Hibernate的 ...

  4. n个人作m幅画

    题目网址: http://codeforces.com/problemset/problem/416/B A well-known art union called "Kalevich is ...

  5. ahjesus sql手动重新更新ID

    declare cus_cursor cursor scroll for SELECT Id from [dbo].[TLotterySpiderRule] open cus_cursor decla ...

  6. sublimeCodeIntel 的配置

    在项目的根目录目录下建立.codeintel/config 但是在windows 需要进入dos 环境下建立.以点开头的文件夹和文件.资源管理器不允许创建点开头的文件或文件夹,但在命令提示符下是可以的 ...

  7. GitHub 基本常用知识解答2

    1.如何拥有一个Git仓库的两种途径 (1)在已有的目录中,初始化一个新的. (2) 比如一个新的项目,或者一个已存在的项目,但该项目尚未有版本控制.如果你想要复制一份别人的项目, 或者与别人合作某个 ...

  8. 如何让 UITableViewCell 中的 imageView 大小固定

    UITableView可以算是使用频率最高的组件之一的,在开发过程中经常需要展示一些简单的信息列表常见列表布局 如图,很多页面其实就是这种展示结果,通常需要imageView,textLabel,de ...

  9. 使用CocoaPods管理第三方开源类库

    iOS开发中经常会用到许多第三方开源类库,比如AFNetworking.FMDB.JSONKit等等,使用CocoaPods这个工具就能很方便得对工程中用到的类库进行管理,包括自动下载配置以及更新. ...

  10. MySql下载安装(Mac平台) 终端启动 XMAPP启动

    1,下载 2,点击MySQL Community Server之后,然后看到需要注册登录的节目,我们就点击最下面just start my download直接下载.懒的注册或者登陆: 3.下载后,& ...