带信号量和抢占式的中断调度的mini操作系统(基于8051)

发布者:Qingfang最新更新时间:2012-08-10 来源: 51hei关键字:信号量  中断调度  操作系统 手机看文章 扫描二维码
随时随地手机看文章

做了7个文件,分别是
os_core.h       //核心文件的参数定义   
os_core.c       //核心文件,包含进程的6种操作,系统级别的操作
task_switch.h //任务切换函数的定义
task_switch.c //任务切换函数的实现,采用抢占式中断调用(T2自动重载)
sem.h            //信号量的定义,其实也就是3个函数,创建信号量,发送一个信号量,接收信号量,在教材里面讲得那么复杂,差点把人搞晕了,实现起来不要太简单
sem.c            //信号量实现
main.c           //任务以及它的操作和主函数包括在这里
 

//---------------------------------------------------os_core.h---------------------------------------------------------------//

#ifndef __OS_CORE_H__
#define __OS_CORE_H__

#include 

typedef signed char int8s;
typedef unsigned char int8u;
typedef signed int int16s;
typedef unsigned int int16u;
typedef signed long int32s;
typedef unsigned long int32u;


//任务的5种状态
#define TASK_STATUS_CREATE 0x00
#define TASK_STATUS_RDY 0x01
#define TASK_STATUS_SUSPEND 0x02
#define TASK_STATUS_ENDED0x04
#define TASK_STATUS_SEM0x08


//任务控制块
typedef struct {
int8u task_status;//任务状态
int8u task_priority;//任务的优先级
int8u task_stack_top;//任务栈顶地址(保存任务栈顶的地址)
int8u task_wait_tick;//任务延时等待次数
}OS_TCB;

#define MAX_TASKS 4//最大的任务数量
//任务的优先级从小到大一次排列,数值越小,优先级越高
#define TASK_STACK_DEPTH 17//最大任务堆栈深度(2字节程序地址+13字节寄存器数据+2字节中断过程保存字节)
#define NUM_RESISTER_PUSHED 13//人工堆栈中需要被保存的寄存器数量(这里因为是8051,所以有13字节)

extern idata volatile OS_TCB os_tcb[MAX_TASKS];//任务控制块列表
extern volatile int8u task_running_id;//正在运行任务的标号
extern volatile int8u os_res_list;//系统资源表,表示哪些资源是否被占用(最大为8个)
extern volatile int8u idata task_stack[MAX_TASKS][TASK_STACK_DEPTH];//每个任务的任务栈

extern volatile int8u task_int_list;//任务中断标记(最大为8个)
extern volatile int8u int_count;//进入中断次数
extern volatile int8u os_en_cr_count;//进入临界区次数
#define os_enter_critical() {EA=0;os_en_cr_count++;} //进入临界区
#define os_exit_critical() {if(os_en_cr_count>0){os_en_cr_count--;if(os_en_cr_count==0){EA=1;}}}//退出临界区




//任务的六种操作
void task_create(void (*task)(void),int8u task_priority);
void task_delete(int8u task_id);
void task_sleep();
void task_wake();
void task_suspend(int8u task_id);
void task_resume(int8u task_id);

//系统操作
void os_init();//初始化系统
void os_start();//开始系统
void os_delay(int8u tick);//任务延时
void os_task_idle();//空任务,具有最低优先级

#endif



//---------------------------------------------------os_core.c---------------------------------------------------------------//

#include "os_core.h"
#include "task_switch.h"


idata volatile OS_TCB os_tcb[MAX_TASKS];//任务控制块列表
volatile int8u task_running_id;//正在运行任务的标号
volatile int8u os_res_list;//系统资源表,表示哪些资源是否被占用(最大为8个)
volatile int8u idata task_stack[MAX_TASKS][TASK_STACK_DEPTH];//每个任务的任务栈

volatile int8u task_int_list;//任务中断标记(最大为8个)
volatile int8u int_count;//进入中断次数
volatile int8u os_en_cr_count;//进入临界区次数

/*
********************************************************************************************************
任务操作
********************************************************************************************************
*/

void task_create(void (*task)(void),int8u task_priority) {
static int8u i;
static int8u task_id;
static int8u *stack_point;

for(i=0; i>8; //任务高8位给task_stack[task_id][1]
stack_point += NUM_RESISTER_PUSHED; //将13个寄存器位置保存起来

//为任务添加属性
os_tcb[task_id].task_stack_top = (int8u)stack_point;
os_tcb[task_id].task_priority = task_priority;
os_tcb[task_id].task_wait_tick = 0;
os_tcb[task_id].task_status = TASK_STATUS_RDY;//将任务置于就绪态
}


void task_suspend(int8u task_id) { //挂起一个任务
os_enter_critical();
os_tcb[task_id].task_status = TASK_STATUS_SEM;//将该任务的状态置于被挂起的状态(由于信号量)
os_exit_critical();
if(task_id == task_running_id) {
os_task_switch(); //调用一下任务切换,切换到其它任务
}
}

void task_resume(int8u task_id) {
os_enter_critical();
if(os_res_list&(0x01<

总结:
在51单片机上实现操作系统是我们不常讨论的话题,其实操作系统还是有蛮大的用处的, 上次我写了一篇文章:一个简单的51单片机操作系统的实现,连接是:http://www.51hei.com/mcu/1325.html ,这篇其实是对上篇文章的补充.实现更多的一些功能,希望大家多多指点啊.

  实现了任务的互斥,使得两个任务之间能够互斥运行,但是不能是两个以上,因为系统采用的是抢占式的中断调度,所以两个以上任务公用一个信号量,会出现优先级较低的那个任务出现饥饿的情况。
任务的实时性是很有保障的,因为内部函数比较简单,所以不存在嵌套中断的说法。
计算一下程序使用的RAM,一共使用大概101字节,剩余107字节可用,感觉还不错.
现在已经成功地实现信号量的功能。
剩下的还有邮箱、事件、内存等等了,不过由于8051RAM空间还是小了些,如果能扩充到4KB以上,发展潜力倒是会有很大的提高,不过外置RAM肯定速度上比不了内置的。
自己动手做51操作系统现在暂时告一段落,操作系统还是在片上资源丰富的系统上用比较好,不过STC的那个最NB的STC90C516AD拥有4KB的RAM和62KB的ROM用起来也可以的。价格也不贵,有空再去尝试...
当任务多了的时候,任务的配置模块也很多,RAM里面84%以上的空间都是用于任务的各种属性的配置,包括任务堆栈和任务的互斥。
希望接下来的复习能够更加认真!!!现在算是了却了我内心中的一桩心愿吧,真正实现了自己的操作系统!!!(功能匮乏,只有进程调度和互斥实现)

现在我才知道链表的操作是多么地耗费内存.创建一个指针就要3个字节,如果搞个链表出来,包括结构体,在资源不那么丰富的8051上(操作系统中),简直是宰牛用杀鸡刀,完全吃不消.但是如果是AVR或者ARM等片上资源丰富的单片机,那就不存在了.

为什么手机的操作系统里面一个安装文件动不动就几MB的大小,为什么Android中的程序动不动就占用几MB的内存?

这就和操作系统有很大关系了,创建一个任务,给它定义进程控制块,堆栈,还要包括它的GUI,别看图形界面特别简单,实际上采用图形界面还是相当吃内存的.在进程切换中,保存堆栈和一些进程信息,这又得占用一部分内存.Android因为采用虚拟机的缘故,这虚拟机它也得吃内存啊,开个程序就有个虚拟机跟着,速度当然不如symbian了.可惜symbian内存和cpu的频率比较低...

所以内存占用和系统任务的个数是线性关系的.当某个程序比较大,它占用内存越多,而且可能会频繁地读取内存,这样就会造成其它程序速度变慢.这就是为什么在听歌的时候,上网有时会有点卡的原因之一.

系统启动的时候,会把程序加载进入内存中,当需要加载的程序数量过多时,自然就会比较卡.所以开机的时候会有一段延迟.

关键字:信号量  中断调度  操作系统 引用地址:带信号量和抢占式的中断调度的mini操作系统(基于8051)

上一篇:基于DS1302的简易数码管电子钟
下一篇:基于单片机的12864液晶显示动画效果设计

推荐阅读最新更新时间:2024-03-16 13:05

μC/OS-II实时操作系统内存管理的改进
    摘要: 分析了μC/OS-II实时操作系统在内存管理上存在的不足,提出了改进方法,通过一个具体实例描述了该方法的实现。     关键词: 实时操作系统 内存管理 微处理器 链接器 μC/OS-II 是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。虽然该内核功能较多,但还是有不甚完善的地方。笔者在分析使用中发现,内核在任务管理(包括任务调度、任务间的通信与同步)和中断管理上是比较完善的,具有可以接受的稳定性和可靠性;但在内存管理上显得过于简单,内存分区的建立方式有不合理之处。 1 内存管理不足之处的分析 在分析许多 μC/OS-II 的应用实例中发现
[应用]
ucos-ii示例2:信号量测试
环境: 主机:WIN8 开发环境:MDK4.72 ucgui版本:3.90 ucos版本:ucos-ii mcu: stm32f103VE 说明: 本示例新建一个信号量,task1接收信号量,task2发送信号量。task1时间片为1s/次,task2时间片3s/次。可以看到,因为信号量的关系,task1输出也是3s/次。 注意: 1.信号量的创建不能在内核初始化之前 源码: #define TASK_STK_SIZE 512 /********************************************************************* * 静态函数 *
[单片机]
AUTOSAR OS操作系统功能特性
AUTOSAR OS AUTOSAR OS(AUTomotive Open System ARchitecture Operating System)是AUTOSAR架构中的一个组件,用于管理和协调汽车电子系统中的软件任务和中断。它提供了以下功能特性: 任务和中断管理:AUTOSAR OS可以创建、启动、停止和删除任务,并处理中断请求。它可以根据任务的优先级和调度策略来调度任务的执行,确保任务按照预定的时间要求执行。 2. 时钟和定时器管理:AUTOSAR OS可以管理系统时钟和定时器,提供精确的时间基准和定时功能,以支持任务和中断的时间触发。 3. 通信和同步机制:AUTOSAR OS提供了多种通信和同步机制,如事件、信号量
[嵌入式]
BAT都在做汽车操作系统 能改变汽车产业吗?
10月30日报道,据《金融时报》报道,在过去5年里,中国领先的互联网公司百度、阿里巴巴以及腾讯竞相将利润丰厚的应用放在智能手机屏幕上。然而,它们现在正将注意力转向制造智能联网汽车,即所谓“轮子上的智能手机”,因为操作软件将成为汽车市场的下一个战场。 到目前为止,阿里巴巴与上海汽车制造商上汽(SAIC)合资的斑马公司已经率先开发出了汽车“操作系统”,其中包括触摸屏、GPS地图以及其他在智能手机上常见的功能。斑马公司这款软件原名YunOS Auto,上个月被改为AliOS,已经安装在荣威RX5 SUV上。该公司在2016年7月发布的这款车被称为“世界上首款大规模生产的联网汽车”。 荣威RX5的销量增长迅猛。中国汽车工业协会公布数据显
[汽车电子]
实时操作系统在星载计算机中的应用
摘要:介绍在星载计算机中应用实时操作系统的两种方式:使用一种源码开放的RTOS——RTEMS和自主开发RTOS,并对两种方法进行比较。 关键词:实时操作系统 星载计算机 RTOS 随着我国航天技术的不断发展,越来越多的卫星应用在通讯、资源探测、遥感、气象、对地观察等领域。卫星的功能越来越强,对星务管理和有效载荷控制的星载计算机提出了更高的要求。星载计算机软硬件系统日趋复杂,传统的星载计算机软硬件设计方法,特别是软件的设计方法和开发手段已逐渐不适应这种要求。引入实时操作系统(RTOS)能够有效地解决这些问题。RTOS把任务管理调度、任务间通信、内存管理等系统功能以函数调用的方式提供给用户,使用户能够将精力放在应用程序的开发上,
[嵌入式]
Meta拆分开发混合VR / AR操作系统的300人团队
据the information报道,Meta已经将300人左右的AR和VR操作系统团队进行了拆分,将一些工程师转移到AR眼镜和Oculus 团队中。此前有报道称,Meta已经停止了该团队为其VR和AR创建统一定制操作系统的项目,但Meta当时对此予以否认。 今年1月,有报道称Meta取消了该团队正在进行的“XROS”项目。在报道发布后,Reality Labs副总裁Gabriel Aul在推特上表示,公司正在“扩大这个团队,而不是缩小它”,并附上了Meta职业页面的链接。Aul还表示,该公司“仍在为我们的设备开发高度专业化的操作系统。”
[手机便携]
基于鸿蒙操作系统的智能安全驾驶监测系统
近几年来我国的交通事业发展迅速,与此同时也带来了安全隐患,每年发生交通事故几十万起,并且有着明显的上升趋势,这对人民的生命财产构成了巨大威胁。在这些交通事故中,由于酒后驾车引发的交通事故数量占50%,酒驾成为交通事故的第一大“杀手”。此外,驾驶员的疲劳驾驶也是威胁到交通安全的一个重要因素,对于驾驶员来说迫切需要一个 智能安全驾驶 系统来检测并提醒驾驶员、发出预警警告,有效减少此类原因引起的交通事故。 同时我们迎来了一个万物互联的时代,物联网也越来越受到大家的青睐。万物互联将人、流程、数据和事物结合在一起,使得网络连接变得更加相关、更有价值,把信息转化为行动,给企业、个人和国家创造新的发展机遇,并带来更加丰富的体验。本项目希望借
[汽车电子]
基于鸿蒙<font color='red'>操作系统</font>的智能安全驾驶监测系统
VxWorks操作系统下实现ComPactPCI总线驱动
1 引言   VxWorks是美国Wind River公司专门为嵌入式处理器设计的一种模块化、高性能的实时多任务操作系统。这里提出一种VxWorks操作系统下CompactPCI总线驱动程序的设计及实现。该设计使用德国Kontron DT-64,采用Dual PentiLim 3 CPU,工作频率高达866 MHz,具有128 KB一级高速缓存和128 KB二级高速缓存。     2 BSP与VxWorks的关系   板级支持包BSP(board support packet)通常是针对具体的硬件平台,是用户所编写的启动代码和部分设备驱动程序的集合。在VxWorks操作系统中,BSP是介于底层硬件环境和VxWorks之
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved