协作式多任务操作系统

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系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

2.3多任务编程示例1

1.CUBEMAX配置  2.CODE void StartTask1(void const * argument){/* USER CODE BEGIN StartTask1 */TickType_t pxPreviousWakeTime=xTaskGetTickCount();/* Infinite loop */for(;;){LED1_Turn();// vTaskDelay

1、简述linux操作系统启动流程

1、简述linux操作系统启动流程 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。开机时将ROM中的指令映射到RAM的低地址空间,CPU读取到这些指令,硬件的健康状况进行检查,按照BIOS中设置的启

操作系统是怎么为不同的程序分配所需的内存空间的

操作系统为不同的程序分配内存空间的过程涉及多个关键步骤,确保每个程序都有其所需的内存资源,同时避免程序之间的冲突。以下是操作系统如何为程序分配内存空间的详细过程: 1. 内存管理的基础概念 虚拟内存:现代操作系统使用虚拟内存机制来为程序提供隔离的内存空间。每个程序运行在其独立的虚拟地址空间中,这使得程序间的内存互不干扰。物理内存:实际的 RAM(随机存取存储器),由操作系统和硬件共同管理。虚拟

操作系统安全保护

操作系统安全概述 概念:满足安全策略要求,具有响应安全机制及安全功符合特定安全标准,在一定约束条件下 能抵御常见网络安全威胁,保障自身安全运行及资源安全 安全等级:根据安全功能和安全保障要求分为 用户自主保护级  系统审计保护级 安全标记保护级 结构化保护级 访问验证保护级 操作系统作用: 负责计算系统的资源管理、支撑和控制各种应用程序运行,为用户提供计算机系统管理接口 是构成网络信息

Linux操作系统命令集(一)

最近开了操作系统的课,弄着虚拟机的linux系统命令学学 文件和目录操作命令: ls:列出目录内容 示例:ls -l 以长格式列出目录内容cd:切换目录 示例:cd /home/user 切换到 /home/user 目录mkdir:创建目录 示例:mkdir new_directory 创建名为 new_directory 的目录rmdir:删除空目录touch:创建空文件或更新文件的时间戳

操作系统分页式存储管理

每次输入地址后,计算出页号,若页号越界,则给出错误提示。否则依次调用FIFO和LRU算法,这里值得注意的是,由于我们的FIFO算法先于LRU算法被调用,那么当在处理FIFO算法时,我们暂且不将位视图相应位置做变化,留到处理LRU算法再做处理。 对于FIFO、LRU算法的缺页,我们分两种情况考虑,第一种是模拟栈内还有空间,那么直接将其入栈。第二种是模拟栈内无空间,要发生置换。发生置换时把模拟栈最底