协作式多任务操作系统

2024-05-26 20:32

本文主要是介绍协作式多任务操作系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

协作式多任务操作系统


复制代码
//任务句柄的的定义( tiny_os_51.h )
typedef char  TN_OS_HANDLE;
//任务状态字的定义
#define __TN_TASK_FLG_DEL         0x00        //任务被删除
#define __TN_TASK_FLG_RDY        0x01        //任务就绪//任务控制块
struct tn_os_tcb
{jmp_buf        jbTaskContext;        //用于存储上下文信息unsigned char        ucTaskStat;        //任务状态子
};
typedef struct tn_os_tcb         TN_OS_TCB;        //TN_OS_TCB等效于struct tn_os_tcbstatic data TN_OS_TCB        __GtcbTasks[ TN_OS_MAS_TASKS ];        //任务控制块的结构体数组//注意了
__Gtcb_Tasks[ tnTask ].ucTaskStat = __TN_TASK_FLG_DEL        //使任务处于删除状态//OS初始化( tiny_os_51_core.c )
static data TN_OS_TASK_HANDLE  __GthTaskCur;        //当前任务句柄void tnOsInit ( void )
{TN_OS_TASK_HANDLE  tnTask;        //操作的任务for ( tnTask = 0; tnTask < TN_OS_MAX_TASKS; tnTask ++ ){__GtcbTasks[ tnTask ].ucTaskStat = __TN_TASK_FLG_DEL;        //使任务处于删除状态
    }__GthTaskCur = 0;        //初始化任务号为0
}//创建任务( tiny_os_51_core.c )            注意了,这里的一个任务可以在操作系统启动( 即调用tnOsStart() )前创建
//                                        也可以在其他任务执行过程中创建,但任务不可以在中断服务程序来创建
TN_OS_TASK_HANDLE    tnOSTaskGreat ( void ( *pfuncTask )( void ),        //指向任务函数的函数指针idata unsigned char *pucStk            //指向任务堆栈的指针
                                                                )
{TN_OS_TASK_HANDLE  thRt;        //返回值//搜索是否有空闲的任务控制块for ( thRt = 0; thRt < TN_OS_MAX_TASKS; thRt ++ ){if ( __GtcbTasks[ thRt ].ucTaskStat == __TN_TASK_FLG_DEL ){//如果搜索到有空闲的TCB,则创建任务
            setTaskJmp ( pfuncTask, pucStk, __GtcbTask[ thRt ].jbTaskContext );__GtcbTasks[ thRt ].ucTaskStat = __TN_TASK_FLG_RDY;        //任务就绪return thRt;}    }return -1;            //如果没有空闲的TCB,则创建任务失败,即任务句柄的返回值为-1
}//启动OS( tiny_os_51_core.c )
void tnOsStart ( void )
{longjmp ( __GtcbTasks[ 0 ].jbTaskContext );            //执行0号任务
}//任务切换   任务切换的设计的思想:当发生任务切换时,首先搜索下一个将要执行的任务是否处于
//             就绪状态,如果是的话,则将当前正在运行的任务的上下文保存到该任务的TCB中,然后
//             再从相应的TCB中恢复下一个将要运行的上下文.如果所有的任务都未处于就绪状态,则
//             等待本任务知道就绪为止
void tnOsSched ( void )
{TN_OS_TASK_HANDLE tnTask;            //任务句柄即操作的任务char              cTmp1;TN_OS_TASK_HANDLE thTmp2;volatile data char *pucTmp3 = ( void * )0;thTmp2 = __GthTaskCur;                //首次运行时,__GthTaskCur为0//搜索下一个任务for ( thTask = 0; thTask < TN_OS_MAX_TASKS; tnTask ++ ){thTmp2 ++;                //首次运行时thTmp2 = 1if ( thTmp2 > TN_OS_MAX_TASKS ){thTmp2 = 0;}if ( ( __GtcbTask[ thTmp2 ].ucTaskStat & __TN_TASK_FLG_RDY ) != 0 ){cTmp1 = setjmp ( __GtcbTasks[ __GthTaskCur ].jbTaskContext );    //保存当前任务的上下文,cTtmp1 = 0if ( cTmp1 == 0 )        //如果cTmp1 = 0,往下执行
            {__GthTaskCur = thTmp2;        //更新当前任务句柄
                longjmp ( __GtcbTasks[ thTmp2 ].jbTaskContext );}                                                return;        //如果cTmp1 = 1,则返回函数
        }}//如果所有的任务都未就绪,则等待本任务就绪,相当于一般操纵系统的空闲任务pucTmp3 = ( volatile data char * )( &( __GtcbTasks[ thTmp2 ].ucTaskStat ) );while ( ( *pucTmp3 & __TN_TASK_FLG_RDY ) == 0 )        //任务未就绪,直到就绪为止
    {}}//删除任务( 句柄为-1时删除自身,并且要转换为真实的句柄在合法范围内,才能进行任务调度 )
void tnOSTaskDel ( TN_OS_TASK_HANDLE tnTask )
{//检查参数if ( thTask == -1 ){thTask = __Gth_TaskCur;                //转换为真实的句柄if ( thTask >= TN_OS_MAX_TASKS || thTask < 0 )            //检查参数是否合法
        {return;                           //不合法不执行
        }}__GtcbTasks[ thTask ].ucTaskStat = __TN_TASK_FLG_DEL;            //删除任务if ( thTask == GthTaskCur )                       //删除自身,则执行下一个任务
    {thOsSched();}
}
复制代码

 

 

举例:

复制代码
//协作式多任务操作系统范例static idata unsigned char         __GucTaskStks[2][32];        //分配任务堆栈static unsigned char     __GucTask0;        //任务0测试变量
static unsigned char     __GucTask1;        //任务1测试变量void task0 ( void )
{while ( 1 ){__GucTask0 ++;tnOsSched ();}
}void task1 ( void )
{while ( 1 ){__GucTask1 ++;tnOsSched ();}
}void main ( void )
{tnOsInit ();tnOsTaskGreate ( task0, __GucTaskStks[0] );tnOsTaskGreate ( task1, __GucTaskStks[1] );tnOsStart ();
}

这篇关于协作式多任务操作系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005512

相关文章

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux

HarmonyOS NEXT:华为开启全新操作系统时代

在全球科技浪潮的汹涌澎湃中,华为再次以创新者的姿态,引领了一场关于操作系统的革命。HarmonyOS NEXT,这一由华为倾力打造的分布式操作系统,不仅是对现有技术的一次大胆突破,更是对未来智能生活的一次深邃展望。 HarmonyOS NEXT并非简单的迭代升级,而是在华为多年技术积淀的基础上,对操作系统的一次彻底重构。它采用微内核架构,摒弃了传统的宏内核模式,实现了模块化和组件化的设计理念

Linux操作系统段式存储管理、 段页式存储管理

1、段式存储管理 1.1分段 进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址。内存分配规则:以段为单位进行分配,每个段在内存中占连续空间,但各段之间可以不相邻。 分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。 1.2段表 每一个程序设置一个段表,放在内存,属于进程的现场信息

【Linux详解】冯诺依曼架构 | 操作系统设计 | 斯坦福经典项目Pintos

目录 一. 冯诺依曼体系结构 (Von Neumann Architecture) 注意事项 存储器的意义:缓冲 数据流动示例 二. 操作系统 (Operating System) 操作系统的概念 操作系统的定位与目的 操作系统的管理 系统调用和库函数 操作系统的管理: sum 三. 系统调用实现示例:Pintos 项目 Step 1:进入 examples 目录 St

【操作系统】第五章 文件系统

文件系统 5.1 概述5.2 文件5.2.1 文件及文件系统的概念5.2.2 文件的属性5.2.3 文件的操作5.2.4 文件的类型文件分类 5.3 文件的访问文件的逻辑结构顺序文件顺序文件的优缺点 索引文件索引顺序文件直接文件和哈希文件 5.4 文件保护5.5 文件目录文件控制块(FCB)文件控制块的内容 文件目录索引结点磁盘索引结点内存索引结点 单级目录结构二级目录结构多级目录结构

Linux|操作系统运维|磁盘性能检测之fio和iostat的初步使用

前言: 有的时候,我们接手一个新的服务器的时候,需要了解该服务器的磁盘性能是否可靠,比如,磁盘是否有坏道,磁盘的读写性能是否能够符合我们将要部署的服务,例如数据库服务,如果该数据库是一个读写比较频繁也就是IO比较高的数据库,那么,该磁盘是否能够支持高IO呢? 针对以上需求,建议使用工具fio和iostat这两个工具 一、 iostat在centos7下的安装 配置update源即可 i

软件设计师笔记-操作系统知识

操作系统的作用 操作系统(Operating System, OS)在计算机系统中扮演着至关重要的角色。通过资源管理提高计算机系统的效率;改善人机界面,向用户提供友好的工作环境。 通过资源管理提高计算机系统的效率: 处理器管理:操作系统负责管理和调度计算机的中央处理器(CPU)资源。它使用各种调度算法(如先来先服务、最短作业优先、优先级调度等)来确定哪个进程或线程应该在何时获得CPU的使用权

操作系统真象还原:用户进程

第11章-用户进程 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 11.1 为什么要有任务状态TSS Linux 任务切换未采用 Intel 的做法,而是用了一套自己的方法,只是用了 TSS 的一小部分功能。 操作系统最直接控制的就是 CPU,要想让 CPU 这颗奔腾的心永远地跳下去,首先必须把内存分成段,把内存按“内存块”访问,其次必须让代码段寄存器 cs 和指令寄存器