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

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. python程序开机自启动

    windows下设置 因为服务器是windows环境 担心黑窗口不小心被关闭  因此想要让python程序在后台运行 只需要一下几步 1. 在启动python启动文件加入以下代码 import win ...

  2. 2019版pycharm永久激活

    链接:https://pan.baidu.com/s/1vY1KBvi2NHIgoN8C2qaFbg 提取码:p4gx 1.下对应版本的jar包,放到pycharm目录的bin目录下2.去C:\Use ...

  3. python验证码图片生成

    环境:win10(64位)+pycharm2018+pillow5.4+python3.7 对Django的跨站请求保护的有所了解的同学会知道{%csrf_token%}在实际上作用并不是那么大,只要 ...

  4. 基于arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

    最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术. 下面就是本人通过查阅大佬资料做的一个整合版本的通过手机 ...

  5. 新一代垃圾回收器ZGC的探索与实践

    ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括: 停顿时间不超过10ms: 停顿时间不会随着堆的大小,或者活跃对象的大小而增加: ...

  6. 微信开发者工具获取位置错误(定位到北京)---调用wx.getLocation不出现获取定位提示

    微信开发者工具获取不到自己当前的位置可能是以下几个原因: 1.调用wx.getLocation方法之后需要在app.json中声明permission字段 { "pages": [ ...

  7. ETL数仓测试

    前言 datalake架构 离线数据 ODS -> DW -> DM https://www.jianshu.com/p/72e395d8cb33 https://www.cnblogs. ...

  8. linux中的dhcp

    目录 一.DHCP服务 二.DHCP的租约过程 三.使用DHCP动态配置主机地址 四.安装DHCP服务器 一.DHCP服务 ① DHCP (Dynamic HostConfiguration Prot ...

  9. 【原创】冰蝎v3.0操作使用手册

    写在前面 近期冰蝎更新了内网穿透模块中的一些功能,有不少朋友不知道参数怎么填,希望能出一个使用指导手册,就借这个机会写一个"说明书"(文中有大量演示动图,请耐心等待加载). 基本信 ...

  10. Linux从头学08:Linux 是如何保护内核代码的?【从实模式到保护模式】

    作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...