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?);
}
ucosii操作系统内核源码学习第一篇的更多相关文章
- linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
- JDK源码学习--String篇(二) 关于String采用final修饰的思考
JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ...
- (转)RocketMQ源码学习--消息存储篇
http://www.tuicool.com/articles/umQfMzA 1.序言 今天来和大家探讨一下RocketMQ在消息存储方面所作出的努力,在介绍RocketMQ的存储模型之前,可以先探 ...
- RocketMQ源码学习--消息存储篇
转载. https://blog.csdn.net/mr253727942/article/details/55805876 1.序言 今天来和大家探讨一下RocketMQ在消息存储方面所作出的努力, ...
- JDK源码学习--String篇(三) 存储篇
在进一步解读String类时,先了解下内存分配和数据存储的. 数据存储 1.寄存器:最快的存储区,位于处理器的内部.由于寄存器的数量有限,所以寄存器是按需分配. 2.堆栈:位于RAM中,但是通过堆栈指 ...
- SDWebImage源码阅读-第一篇
一 题外话 之前写过一篇最新版SDWebImage的使用,也简单的介绍了一下原理.这两天正梳理自己的知识网络,觉得有必要再阅读一下源码,一是看具体实现,二是学习一下优秀开源代码的代码风格,比如接口设计 ...
- Spring源码解析 | 第一篇 :IntelliJ IDEA2019.3编译Spring5.3.x源码
前言 工欲善其事必先利其器.学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境.这样方便我们在本地环境添加注释.断点追踪.查看类或接口的继承关系等等,更加高效的学习Spring源码.个 ...
- JDK源码学习--String篇(四) 终结篇
StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和Stri ...
- JDK源码学习--String篇(-)
工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...
随机推荐
- Ubuntu 19.10安装Wine软件
======================================== 我使用的操作系统版本为Ubuntu 19.10 64位,如果是32位Ubuntu19.10则可以跳过步骤一 1.添加 ...
- 手把手教你玩转HarmonyOS版地图应用开发
一.导读 7月31日,华为HarmonyOS开发者日将在杭州举行.为了方便更多开发者,高德开放平台地图SDK已在业内率先实现鸿蒙化迁移和重构,全面适配HarmonyOS并面向开发者免费发布.开发者可 ...
- Java文件I/O简单介绍
目录 一.File类 1.1 构造方法 1.2 常用方法 1.3 例子 二.基础I/O:字节流.字符流 2.1 字节流 2.1.1 字节输出流 OutputStream 2.1.2 FileOutpu ...
- Java 中节省 90% 时间的常用的工具类
前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...
- Elsevier(爱思唯尔)期刊模板的使用
1.爱思唯尔(Elsevier)期刊模板的使用 2.sci论文(以Elsevier为例) latex文件从小白到投稿 3.初次使用爱斯维尔(Elsevier)论文模板遇到的坑 4.latex学习 da ...
- NODEJS对象
1.全局对象 Node.js: global 交互模式下var声明的变量都属于全局下的变量,可以使用global访问,例如global.a 脚本模式下var声明的变量不属于全局下的变量.不能使用glo ...
- Hyper-V下Internal vSwitch的配置和Linux虚拟机的SSH连接
最近工作中要在Windows Server 2016/Hyper-V 10中运行Ubuntu16实例,需要制作出"即插即用"的镜像文件,也就是安装好后即可从外部SSH进去.之前我使 ...
- Android 自定义属性(attrs)、样式(Style)、主题(Theme)
Android 自定义属性(attrs).样式(Style).主题(Theme) https://www.cnblogs.com/dandre/p/4507024.html https://blog. ...
- Github连接远程仓库详细操作
首先 咱们需要配置ssh密钥 如何生成密钥呢 我们先来看下命令 在桌面新建一个文件夹,命名规范尽量不要使用中文,然后在文件夹内 新建测试文本: 如图 在文件夹内空白处右击进入GIt b ...
- .Netcore HttpClient源码探究
源码搜索与概述 搜索HttpClient源码 https://source.dot.net/#System.Net.Http/System/Net/Http/HttpClient.cs 1.HttpC ...