ucosii操作系统内核源码学习第一篇

ucosii操作系统内核源码学习第一篇待会就开始学习

大家好,又见面了,我是你们的朋友全栈君。

根据书本理论介绍以及实际看内核源代码得出:

1. 操作系统默认定义了64个TCB块(为全局变量,编译时候以及分配了,创建一个任务就使用一个,删除一个任务就归还一个)(为什么最大只支持64个任务呢,我们可能想到去更改OS_MAX_TASKS宏的值,但是任务就绪表OSRdyTbl[8]既然已经这样定义了,说明此系统初衷只能最大管理64个任务,而且为了加快查找最高优先级任务定义的OSUnMapTbl[ ]数组(这个数组比较难理解)也是专门为64个任务二设定的,所以要想修改系统支持的最大任务数,就得修改多处,自己慢慢琢磨吧!),每个TCB里面包括了所有的属性,所以会占用大量的单片机ram空间,包括OS_STK *ptos这个指针变量,只是这个任务自己的堆栈指针没有指向任何分配的空间(这个空间由我们创建任务时候才自己定义一个大数组,这个更浪费ram空间)。

2. 此时的64个TCB块还是孤立的,只是在一个OSTCBTbl[64]数组里面而已。在main函数里面第一行代码就是OSInit( )函数,这个函数进行了所有系统变量(都是全局变量,比如当前运行控制块指针等)初始化,其中调用了OS_InitTCBList( )函数,在这函数里面,首先把这64个TCB块(由于此时还没有任何任务运行,所以这时都称为)进行了双向链表连接起来,使得OSTBFreeList空控制块链表头指针指向&OSTCBTbl[0],此时OSTCBList已经分配任务的TCB双向链表头指针这里只是置为(OS_TCB *)0;而已,以为此时还没有任何任务create,所以这个指针确实应该为0

比较重要的函数:    

 INT8U OSTaskCreat( void (*task)(void *pd) , void *pdata, OS_STK *ptos, INT8U prio )

{

        // 这个函数对当前创建任务的堆栈内容(ptos所指向的数组空间)赋值(cpu内部寄存器所有内容暂存起来),包括cpu内部的psw状态寄存器,通用寄存器R0-R15(个人觉得这些都没必要,因为这里只是创建任务,下次切换回来这个任务的时候,也不需要这时候保存的内部寄存器内容呀),还有任务的传递参数pdata,任务函数的首地址等等内容,然后返回这个堆栈的顶部指针(注:不同cpu可能堆栈增长方向不同,我看51单片机是向着低地址方向增长的)(注:由于我们在定义一个任务时候,定义的堆栈默认为 OS_STK MyTaskStk[MyTaskStkN]; 看了一下源码,这个OS_STK是typedef为unsigned char 类型,MyTaskStkN宏定义默认为64(由于堆栈增长时候不会检测是否大于64字节空间(可能后面检测了吧,现在先认为没有检测吧),所以有可能会产生数组越界现象,造成系统崩掉,那么特别注意这里定义堆栈空间时候一定要考虑好需要多大,宁愿大一点),也就是说每定义一个任务,就多需要64字节ram内存,51单片机为啥很难跑起来这个操作系统,应该就是因为这样耗费ram太大,51单片机ram一般就几百字节)

        OS_STK *OSTaskStkInit( void (*task)( void *pd) , void *pdato , OS_STK *ptos , INT16U opt );

        // 这个函数里面填充好当前任务TCB的各个属性值,例如优先级,堆栈大小等,其中最重要的是,还使用头插法把当前任务快插入了双向任务链表(如果这是第一个任务,那就创建这个双向任务链边),即新的TCB控制块是往左边插入的,此时OSTCBList指向链表左边的第一个节点

        INT8U OSTCBInit(INT8U prio , OS_STK *ptos , OS_STK *pbos , INT16U id, INT16U stk_size , void *pext , INT16U opt );

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138826.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【转载】一些VS2013的使用技巧

    【转载】一些VS2013的使用技巧

    2021年11月18日
    41
  • Java中的5大队列,你知道几个?

    Java中的5大队列,你知道几个?本文已收录至https://github.com/vipstone/algorithm《算法图解》系列。通过前面文章的学习《一文详解「队列」,手撸队列的3种方法!》我们知道了队列(Queue)是

    2022年7月2日
    22
  • jsonify

    jsonifyflask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象,那么在flask的视图函数中return它们会有什么不同之处呢?想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而…

    2022年5月10日
    53
  • Scrapy项目 – 数据简析 – 实现腾讯网站社会招聘信息爬取的爬虫设计

    Scrapy项目 – 数据简析 – 实现腾讯网站社会招聘信息爬取的爬虫设计一、数据分析截图本例实验,使用Weka3.7对腾讯招聘官网中网页上所罗列的招聘信息,如:其中的职位名称、链接、职位类别、人数、地点和发布时间等信息进行数据分析,详见如下图:图1-1Weka3.7分析界面图1-2职位数据ZeroR分析界面图1-3数据聚类分析界面图1-4数据Visualize分析界面二、数据分析结论由图2-1可知,随着应聘人数的…

    2022年5月2日
    55
  • 一小时搞定 简单VBA编程 Excel宏编程快速扫盲

    一小时搞定 简单VBA编程 Excel宏编程快速扫盲Excel宏编程可以快速完成批量表格操作:复制粘贴、数据过滤等,宏代码基于VB语言实现,有基础的编程经验就能快速阅读。下面是我的学习笔记。1.ExcelVBA编辑界面(进入路径:sheet名称–>鼠标右键菜单–>查看代码)2.输入代码方法:在VBE编辑器的代码模块中输入VBA代码,通常有以下几种方法:■手工键盘输入;■使用…

    2022年4月27日
    53
  • App的三种类型与区别(原生、混合应用程序、web版App)

    App的三种类型与区别(原生、混合应用程序、web版App)

    2021年5月23日
    161

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号