简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述:

1、按最大任务数轮番调度;

2、任务调用延时接口将让出CPU使用权,进入下一个任务调度;

3、用户任务都处于延时或是不使用CPU运行Idle任务;

4、最大任务数255;

5、任务用独立栈,栈大小由用户自定义;

6、调度器无需初始化,代码为单个C文件,结构简单,代码尺寸小;

7、调度器加3个任务代码尺寸:Code=1428 RO-data=268 RW-data=32 ZI-data=520 

软件环境:Keil Mdk 4.7a 硬件:stm32f103vb

 

-------------------------------------------------------------------------------------------------

//调度器C文件 Switch.c

#include "stm32f10x.h"
#include "switch.h"
#include "string.h"
#include "stdbool.h"

TCB      TaskTCB[MAX_TASK + 1] = {0};
TCB      *TaskNew, *TaskRuning;
uint32_t IdleStack[20];
uint8_t  TaskCnt = 0;

void TaskIdle() {
    while(1){
    }
}

__asm void TaskSwitch(void)
{
    LDR     R0, =0xE000ED22
    LDR     R1, =0xFF
    STRB    R1, [R0]
    LDR     R0, =0xE000ED04              
    LDR     R1, =0x10000000
    STR     R1, [R0]
    BX      LR
      ALIGN
}

__asm void PendSV_Handler(void)
{
        IMPORT  TaskRuning
        IMPORT  TaskNew
    CPSID   I                                                  
    MRS     R0, PSP                                            
    CBZ     R0, NoSave                          

    SUBS    R0, R0, #0x20                                      
    STM     R0, {R4-R11}

    LDR     R1, =TaskRuning                                    
    LDR     R1, [R1]
    STR     R0, [R1]                                           
NoSave

    LDR     R0, =TaskRuning                                    
    LDR     R1, =TaskNew
    LDR     R2, [R1]
    STR     R2, [R0]

    LDR     R0, [R2]                                           
    LDM     R0, {R4-R11}                                       
    ADDS    R0, R0, #0x20
    MSR     PSP, R0                                            
    ORR     LR, LR, #0x04                                      
    CPSIE   I
    BX      LR                                                
    ALIGN
}

void  SysTick_Handler (void)
{  
      uint8_t i;
      bool bOneSwitch;
      bOneSwitch = false;
      for(i = 0; i < MAX_TASK; i++){
            if(TaskTCB[i].Delay != 0){
                TaskTCB[i].Delay--;           
      }
            if(bOneSwitch == false){
              TaskCnt %= MAX_TASK;
                if(0 == TaskTCB[TaskCnt].Delay){
                    bOneSwitch = true;
                    TaskNew = &TaskTCB[TaskCnt++];
                }else{
                     TaskCnt++;
                }
          }
    }
        if(bOneSwitch == false)
            TaskNew = &TaskTCB[IDLE_TASK];
        TaskSwitch();
}

void SwitchDelay(uint16_t nTick)
{
      uint8_t i;
      if(0 == nTick)
            return;
      TaskRuning->Delay = nTick;            
      for(i = 0; i < MAX_TASK; i++){
            TaskCnt %= MAX_TASK;   
            if(0 == TaskTCB[TaskCnt].Delay){
                TaskNew = &TaskTCB[TaskCnt++];
                break;
            }else TaskCnt++;
    }
        if(TaskRuning == TaskNew)
            TaskNew = &TaskTCB[IDLE_TASK];
      TaskSwitch();
}

void SwitchTaskInt(void (*task)(void), OS_STK *ptos)
{
      if(MAX_TASK + 1 <= TaskCnt){
            TaskCnt = 0;
            return;
    }
      if(NULL == task)
            return;
        if(NULL == ptos)
            return;
    *(ptos)    = (INT32U)0x01000000L;            
    *(--ptos)  = (INT32U)task;                    
        TaskTCB[TaskCnt]. pTaskStack =  ptos -14;
        TaskTCB[TaskCnt++]. Delay =  0;   
}

void SwitchStart(void)
{
    SystemInit();                                                                 
    __set_PSP(0);                                                            
    SwitchTaskInt(TaskIdle, IdleStack+19);    
    SysTick_Config((SystemCoreClock / N_TICK_IN_SECOND) - 1); 
}

 

-------------------------------------------------------------------------------------------------

//调度器头文件 SWitch.h

#ifndef __SWITCH_H__
#define __SWITCH_H__

#include "stdint.h"
#define MAX_TASK          2
#define N_TICK_IN_SECOND  1000

#define IDLE_TASK         MAX_TASK
typedef uint32_t OS_STK;
typedef uint32_t INT32U;

typedef struct TCB
{
  uint32_t *pTaskStack;
    uint16_t Delay;
}TCB;

extern  TCB *TaskRuning;
extern  TCB *TaskNew;
extern  TCB  TCBTask[MAX_TASK];

void    SwitchTaskInt(void (*task)(void), OS_STK *ptos);
void    SwitchDelay(uint16_t Time);
void    SwitchStart(void);

#endif

 

-------------------------------------------------------------------------------------------------

//应用Demo App.c

#include    "stm32f10x.h"
#include    "stm32f10x_rcc.h"
#include    "stm32f10x_gpio.h"

#include "switch.h"
#include <stdio.h>

u32 TaskStack[2][40];

void Task0(void);
void Task1(void);

int main(void)
{
    SwitchTaskInt(Task0, &TaskStack[0][39]);
    SwitchTaskInt(Task1, &TaskStack[1][39]);
  SwitchStart();
    while(1);
}

void Task0(void)
{
   u8 i;
   for(;;)
   {
     i = i;
     //SwitchDelay(200);

   }
}
void Task1(void)
{
   u8 i;
   for(;;)
   {
     //SwitchDelay(300);
     i = i;
   }
}

 

调度器代码: 点击下载

简单OS(ucos超级精简版)——裸调度器【worldsing笔记】的更多相关文章

  1. 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】

      老外写的C书,看了你会有一种哇塞的感觉,这里提供PDF扫描版的下在,包含数内的例程,请大家支持原版!! C Primer Plus(第五版)中文版.pdf  下载地址:http://pan.bai ...

  2. k8s调度器介绍(调度框架版本)

    从一个pod的创建开始 由kubectl解析创建pod的yaml,发送创建pod请求到APIServer. APIServer首先做权限认证,然后检查信息并把数据存储到ETCD里,创建deployme ...

  3. Linux 调度器发展简述

    引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的 ...

  4. Yarn 调度器Scheduler详解

    理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...

  5. 第1节 yarn:14、yarn集群当中的三种调度器

    yarn当中的调度器介绍: 第一种调度器:FIFO Scheduler  (队列调度器) 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源 ...

  6. Hadoop调度器

    一.FIFO调度器(先进先出调度) 上图为FIFO调度器的执行过程示意图.FIFO Scheduler是最简单也是最容易理解的调度器,它缺点是不适用于共享集群.大的应用可能会占用所有集群资源,这就导致 ...

  7. YARN调度器(Scheduler)详解

    理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...

  8. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)

    利用周末时间将整个电脑格式化,换成了ubuntu系统- 所谓:扫清屋子再请客! 但是有些软件只在win上有,于是还是考虑装个虚拟机来个——逐步过度策略,一点点地从win上转移到linux上 我的系统是 ...

  9. [原创]spring及springmvc精简版--AOP

    接上一篇:[原创]spring及springmvc精简版--IOC 理解AOP.java是一种面向对象的语言.而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配. 经典例子 ...

随机推荐

  1. 【疯狂Java讲义学习笔记】【流程控制与数组】

    [学习笔记]1.switch语句后的expression表达式的数据类型只能是byte.short.char.int四个整数类型.String(Java 7后才支持)和枚举类型. 2.数组的长度不可变 ...

  2. 转:数据包经由路由转发时源、目的IP地址及MAC地址变化情况

    数据包经由路由转发时源.目的IP地址及MAC地址变化情况.  IP数据包经由路由转发的时候源ip,目的ip,源MAC,目的mac是否发生改变,如何改变?   A—–(B1-B2)—–(C1-C2)—— ...

  3. Java比较器对数组,集合排序一

    数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...

  4. P73、面试题9:斐波那契数列

    题目一:写一个函数,输入n,求斐波那契数列(Fibonacci)数列的第n项,斐波那契数列的定义如下: f(n) = {0  n = 0;  1   n = 1;  f(n-1)+f(n-2)  n& ...

  5. 重载操作符 operator overloading 学习笔记

    重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...

  6. JavaScript DOM高级程序设计 5动态修改样式和层叠样式表2--我要坚持到底!

    把样式置于DOM脚本之外 style属性 我们可以这样设置前景色之类的属性: element.style.color='red'; 也可以使用下面的代码设置背景颜色: element.style.ba ...

  7. Java之数组array和集合list、set、map

    之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 ...

  8. sdut 1570 c旅行

    用搜索(bfs,dfs)做了半天,都超时,原来是dp; 参考博客:http://www.cnblogs.com/liuzezhuang/archive/2012/07/29/2613820.html ...

  9. 【 D3.js 高级系列 — 3.0 】 堆栈图

    堆栈图布局(Stack Layout)能够计算二维数组每一数据层的基线,以方便将各数据层叠加起来.本文讲解堆栈图的制作方法. 先说说什么是堆栈图. 例如,有如下情况: 某公司,销售三种产品:个人电脑. ...

  10. (转) mysql数据库引擎:MyISAM和InnoDB(性能优化)

    转自 http://yuwensan126.iteye.com/blog/1138022 Mysql 数据库中,最常用的两种引擎是innordb和myisam.Innordb的功能要比myiasm强大 ...