简单OS(ucos超级精简版)——裸调度器【worldsing笔记】
简单原则少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笔记】的更多相关文章
- 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】
老外写的C书,看了你会有一种哇塞的感觉,这里提供PDF扫描版的下在,包含数内的例程,请大家支持原版!! C Primer Plus(第五版)中文版.pdf 下载地址:http://pan.bai ...
- k8s调度器介绍(调度框架版本)
从一个pod的创建开始 由kubectl解析创建pod的yaml,发送创建pod请求到APIServer. APIServer首先做权限认证,然后检查信息并把数据存储到ETCD里,创建deployme ...
- Linux 调度器发展简述
引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的 ...
- Yarn 调度器Scheduler详解
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...
- 第1节 yarn:14、yarn集群当中的三种调度器
yarn当中的调度器介绍: 第一种调度器:FIFO Scheduler (队列调度器) 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源 ...
- Hadoop调度器
一.FIFO调度器(先进先出调度) 上图为FIFO调度器的执行过程示意图.FIFO Scheduler是最简单也是最容易理解的调度器,它缺点是不适用于共享集群.大的应用可能会占用所有集群资源,这就导致 ...
- YARN调度器(Scheduler)详解
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...
- [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
利用周末时间将整个电脑格式化,换成了ubuntu系统- 所谓:扫清屋子再请客! 但是有些软件只在win上有,于是还是考虑装个虚拟机来个——逐步过度策略,一点点地从win上转移到linux上 我的系统是 ...
- [原创]spring及springmvc精简版--AOP
接上一篇:[原创]spring及springmvc精简版--IOC 理解AOP.java是一种面向对象的语言.而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配. 经典例子 ...
随机推荐
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
启动 Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误的解决方法 http://blog.csdn.net/z ...
- PHP 的面向方面编程
面向方面编程(AOP)对于PHP来说是一个新的概念.现在PHP对于 AOP 并没有官方支持,但有很多扩展和库实现了这个特性.本课中,我们将使用 Go! PHP library 来学习 PHP 如何进行 ...
- CentOS7.1 安装关键步骤 记录下来
SecureCRT下载地址 https://yunpan.cn/cS9W94kuvhXPb 访问密码 08cd[这里GNOME桌面 下的 要全选,截屏有误]
- ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引 因为表KOL_XX_FIN050_TEMP 为临时表,而且有其他session正在使用. 处理步骤: 1.先从 dba ...
- Ubuntu设置中文
Ubuntu设置中文:需要联网下载中文包,不然无法设置中文系统. 进去系统后再右上角有个齿轮图标点击,找到系统设置(System Settings)点击弹出一个界面,找到Language Suppor ...
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)
转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...
- js模仿jquery里的几个方法next, pre, nextAll, preAll
/*siblings函数, 选取node的所有兄弟节点*/ function siblings(node){ if(node.nodeType === 1){ node.flag = true; // ...
- JS 打印报表
<script type="text/javascript"> window.print(); </script> 前台页面: <%@ Page La ...
- c语言之extern关键字
1.定义 extern,外面的.外来的意思.那它有什么作用呢?举个例子:假设你在大街上看到一个黑皮肤绿眼睛红头发的美女(外星人?)或者帅哥.你的第一反应就是这人不是国产的. extern就相当于他们的 ...
- Logminer实战
相信许多DBA同学都曾遇到过这种情况,由于各种各样的原因,必须对数据库做不完全恢复:但又不确定应该恢复到哪个时间点或SCN才合适,因而反复的执行不完全恢复,悲剧掉了一地,中枪的有木有?温馨提示下,在生 ...