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

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?);

}

ucosii操作系统内核源码学习第一篇的更多相关文章

  1. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  2. JDK源码学习--String篇(二) 关于String采用final修饰的思考

    JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ...

  3. (转)RocketMQ源码学习--消息存储篇

    http://www.tuicool.com/articles/umQfMzA 1.序言 今天来和大家探讨一下RocketMQ在消息存储方面所作出的努力,在介绍RocketMQ的存储模型之前,可以先探 ...

  4. RocketMQ源码学习--消息存储篇

    转载. https://blog.csdn.net/mr253727942/article/details/55805876 1.序言 今天来和大家探讨一下RocketMQ在消息存储方面所作出的努力, ...

  5. JDK源码学习--String篇(三) 存储篇

    在进一步解读String类时,先了解下内存分配和数据存储的. 数据存储 1.寄存器:最快的存储区,位于处理器的内部.由于寄存器的数量有限,所以寄存器是按需分配. 2.堆栈:位于RAM中,但是通过堆栈指 ...

  6. SDWebImage源码阅读-第一篇

    一 题外话 之前写过一篇最新版SDWebImage的使用,也简单的介绍了一下原理.这两天正梳理自己的知识网络,觉得有必要再阅读一下源码,一是看具体实现,二是学习一下优秀开源代码的代码风格,比如接口设计 ...

  7. Spring源码解析 | 第一篇 :IntelliJ IDEA2019.3编译Spring5.3.x源码

    前言 工欲善其事必先利其器.学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境.这样方便我们在本地环境添加注释.断点追踪.查看类或接口的继承关系等等,更加高效的学习Spring源码.个 ...

  8. JDK源码学习--String篇(四) 终结篇

    StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和Stri ...

  9. JDK源码学习--String篇(-)

    工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...

随机推荐

  1. 构建后端第4篇之---spring 源码阅读构建环境

    解决 IDEA 创建 Gradle 项目没有src目录问题 in new model named zyt-study   root dir there are  a build.gradle plug ...

  2. Java 中节省 90% 时间的常用的工具类

    前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...

  3. Python中print()函数的用法

    print()函数用于打印输出 1.函数语法: print(values,sep=' ',end='\n') sep和end是print()函数常用参数 参数sep是一次打印多个元素时的间隔符号,默认 ...

  4. 【Lua篇】静态代码扫描分析(四)规则检查

    一.前言 通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查.下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图 ...

  5. MySQL-07-information_schema/show

    information_schema.tables视图 DESC information_schema.TABLES /** TABLE_SCHEMA ---->库名 TABLE_NAME -- ...

  6. MATLAB批量存储图像和显示算法处理的图像不留空白

    一 前言 最近收到审稿人的修改意见,其中一条为<RC: There were only five images evaluated in the experiment, and I recomm ...

  7. Linux、Windows 下手动生成 sha256 等类型的校验文件

    目录 1 - 校验文件的作用 2 - Linux 下生成校验文件 3 - Windows 下生成校验文件 参考资料 版权声明 1 - 校验文件的作用 从网服务器下载文件,尤其是比较大的文件时,很容易由 ...

  8. 【翻译稿】Behavior Driven Development (BDD)行为驱动开发

    这是一篇翻译稿,方便给不知道BDD的同学扫盲.原文链接:What is BDD (Behavior Driven Development)? | Agile Alliance Definition定义 ...

  9. 为什么网络损伤仪WANsim中没有流量通过

    在使用网络损伤仪 WANsim 的过程中,有时候发现网损仪中没有流量通过.有些小伙伴可能会想:自己所有配置都是正确的 ,为什么会没有流量通过呢? 有可能,是你忽略了一些东西. 下面,我总结了一些导致网 ...

  10. tcp为什么要三次握手,tcp为什么可靠

    转自 : https://www.cnblogs.com/LUO77/p/5771237.html大体看过,没有深入研究,有需要时继续看. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端, ...