uCOS-II
/****************************************************/
**关于移植,ucos官网上给的有template,主要思想是实现任务切换的两个函数(任务级别切换函数和中断级别切换函数)、禁止中断、使能中断、创建任务时的堆栈初始化函数。
**在stm32上,systick用来作为系统时钟,所以systick的中断需要配置到timetick上,这步和上面的pendsv中断都可以放到stm32的启动文件的中断向量表中。
##关于操作系统的理解,操作系统就是一个裸机程序,掌控所有被赋予的硬件的控制权,利用硬件资源为软件提供运行效率、编程底层建筑(中断、DMA、任务锁、临界段)和使用方法(APIs)的优化。
/************************************************/
2018年7月24日 19:44
OS_EventTaskRdy这个函数位于 os_core.c 文件中,很重要,是连接任务控制块和事件控制块的重要函数,当任务从阻塞态到就绪态时,需要调用它,他将任务在任务就绪表中就绪,设置任务控制块的状态信息,最后从事件控制块中删除掉该任务。
所有基于事件控制块的通信机制都是基于此,比如 MBox、Mqueue、semaphore,他们最终都要调用到 Event Control (事件管理)模块。应该可以这样理解,时间管控模块被嵌入到了基于事件驱动的通信中,也有点类似基类(父类)和扩展类(子类)的关系。
对了 这里涉及到两个链表,任务控制块链表和事件控制块链表,类似Linux,都是这样组织系统的,这些东西都放在内存中。
好了,吃饭,已经做好了。miantiao,tomato,
-----------------------------------
2018年07月30日 13:15
拿semaphore举例,看看优先级、任务控制表、事件控制表之间的关系,
1. pevent->OSEventTbl[] 的初始化。每创建一个资源(semaphore、mbox、mutex、queue etc)就需要从链表上申请一个事件控制块。
注意,这里的 pevent->OSEventTbl[] 是个事件控制块结构体里的一个成员,也就是说,不同的semaphore、Mbox、queue、里的pevent->OSEventTbl[]都是相互独立的,没有任何关系。虽然这个表也是用来表示该资源的调度位图用的,但是它有很多个,不像任务就绪表只有一个,因为不同的资源的pevent->OSEventTbl[]肯定是相互独立的。
事件控制块结构体
2. 对于每个等待某个资源的任务,都在该资源的 pevent->OSEventTbl[] 里排队,调度算法完全和任务调度算法一样,数据结构也是一样的,都有就绪表和就绪组。
/***********************************************************************************************************************/
2018年07月24日 00:08 by Mapleay
uCOS-II是一个多任务、实时性、可抢占内核,它由唯一的任务优先级来标识。它只实现了任务的管理(任务管理的实现的数据结构、任务切换)、通信(任务间对硬件资源的合理分配)。
在单核计算机的世界里,一个任务运行时,他的运行时环境由一些特定的资源组成,如CPU的寄存器、RAM中的资源(比如局部变量)、其他硬件状态资源等。
uCOS-II必须保证任务间无缝地切换,即这个单核runtime environment的seamless地切换,也可以说是必须要要无缝地切换这些资源(CPU寄存器、RAM变量)。
uCOS-II是怎么样实现任务的管理的呢?
答:是通过“OSTCBPrioTbl”这个表(或者数组,一个存放指向OSTCB类型结构体的指针),他的原型是,OS_TCB* OSTCBPrioTbl[OS_LOWEST_PRIO + 1u]; 和它密切相关的自然是实际存放任务状态、资源记录等信息的任务块,“OSTCBTbl”(存放任务块结构体的数组),原型是,OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];
uCOS-II是怎么实现任务调度的呢?
为了更快地,固定时间地实现任务调度和切换,uCOS-II使用了位图算法(OSUnMapTbl)、一些全局变量(OSTCBCur、OSTCBHighRdy;OSRdyGrp、OSRdyTbl;OSPrioCur、OSPrioHighRdy等)。任务调度先通过位图算法处理OSRdyGrp、OSRdyTbl数据,找到最高的就绪优先级,通过OSTCBPrioTbl找到OSTCBTbl里的任务控制块,如果需要切换,那么就利用之前移植好的代码做切换(中断级别的上下文切换和任务级别的上下文切换)。
任务在运行时,需要协同也会涉及到资源的竞争分配等问题,如何协同?如何合理的使用CPU,涉及到事件控制块派生出的信号量、消息队列、邮箱等概念。
好晚了,去睡觉了。哈。
/***********************************************************************************************************************/
1.
RTOS的调度算法以及系统任务如何协同运行
OS_EXT OS_PRIO OSRdyGrp;
OS_EXT OS_PRIO OSRdyTbl[OS_RDY_TBL_SIZE];
OS_EXT OS_EVENT *OSEventFreeList;
OS_EXT OS_EVENT OSEventTbl[OS_MAX_EVENTS];
如果优先级个数小于64,定义 OS_PRIO INT8U,否则默认为256个优先级 定义为INT16U。
#if OS_LOWEST_PRIO <= 63u
typedef INT8U OS_PRIO;
#else
typedef INT16U OS_PRIO;
#endif
uCOS-II中设计了一个优先级表OSxxxTbl表中的每个bit定义对应一个优先级,该优先级就绪则该bit置1,否则置0,有多少个位就有多少个优先级,优先级按照位的顺序排列。
OS_PRIO OSxxxGrp和OS_PRIO OSxxxTbl[OS_xxx_TBL_SIZE]配合起来使用;系统有(OS_xxx_TBL_SIZE x (SizeofBits(OS_PRIO)))个优先级,也就是 SizeofBits(OSxxxTbl[OS_xxx_TBL_SIZE])。
设Grpx 为就绪组中优先级最高的那个组,MaxPrio为就绪组中最高优先级
Grpx = OSUnMapTbl [OSxxxGrp]
MaxPrio = OSUnMapTbl[OSxxxTbl[Grpx]]
OSUnMapTbl的含义是,在8个位(8个优先级任意状态),即 28 =256种情况中,确定优先级最高的就绪位。所以64个优先级,需要先确定8个组中优先级最高的那个组,再确定组中优先级最高的那个位。
#############非重要话题
/* 关于底层 keil stm32f407, 0x08000000 ,FLSAH, 0x20000000 RAM*/
1. 全局变量, 全局变量的初始化和不初始化,都存放在RAM中,怎么存放的RAM中的?(这不是UOCS的重点)
1.1 全局常量
extern INT8U const OSUnMapTbl[256]; /* Priority->Index lookup table */
const 指定存储属性,全局只读变量,全局常量。在map文件中的位置如下:
OSUnMapTbl 0x0800190a Data 256 os_core.o(.constdata)
1.2 全局变量如何初始化?
参考,AN241 - ARM Compiler C Library Startup and Initialization Application Note 241, URL, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0241b/index.html,
data和.bss是在__main里进行初始化的。对于gcc汇编文件startup_stm32f10x_hd.s里面Reset_Handler
已经对.data和.bss进行了初始化。
__scatterload
Application code and data can be in a root region or a non-root region. Root regions have the same load-time and execution-time addresses. Non-root regions have different load-time and execution-time addresses. The root region contains a region table output by the ARM linker.
The region table contains the addresses of the non-root code and data regions that require initialization. The region table also contains a function pointer that indicates what initialization is needed for the region, for example a copying, zeroing, or decompressing function.
__scatterload goes through the region table and initializes the various execution-time regions. The function: !!!这里类似 uboot 里的启动,这类代码叫boot代码。这个函数的作用就是把ZI等加载地址和执行地址不一致的变量重定位一下。
? Initializes the Zero Initialized (ZI) regions to zero
? Copies or decompresses the non-root code and data region from their load-time locations to the execute-time regions.
__main always calls this function during startup before calling __rt_entry.
__rt_entry
__main calls __rt_entry to initialize the stack, heap and other C library sub systems. __rt_entry calls various initialization functions and then calls the user-level main()
uCOS-II的更多相关文章
- DE1-SOC开发板上搭建NIOS II处理器运行UCOS II
DE1-SOC开发板上搭建NIOS II处理器运行UCOS II 今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...
- ucos ii 46个系统API函数解析
源: ucos ii 46个系统API函数解析
- FreeRTOS 和uCOS II的简单比较
转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...
- ucos ii 百度官方介绍
μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的.可裁剪的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处 ...
- 嵌入式无操作系统下管理内存和队列(类UCOS II思想)
例子:存储日志,最多存128条,每条最大1MB. 内存方面 因为嵌入式不适合用动态内存,会产生碎片.这里我们用 u8 data[LOG_SIZE];开辟固定128MB的内存区,再对其分为128个1MB ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- ucos串口通讯模块设计
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率.缩短开发周期.uCOS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位 ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析
前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...
- 入门 uCOS 操作系统的一点建议
原创: 鱼鹰Osprey 鱼鹰谈单片机 3月2日 预计阅读时间: 4 分钟 对于想入门操作系统的读者,我的建议是先学 uCOS II.原因有以下几点: 1.最为重要的原因是网上相关资源非常丰富,这对 ...
随机推荐
- Bootstrap modal常用参数、方法和事件
Bootstrap modal(模态窗)常用参数.方法和事件: 参数: 名称 类型 默认值 描述 Backdrop Boolean或字符串“static” True True:有背景,点击modal外 ...
- Apache JMeter压力测试实例
脚本录制 脚本录制,JMeter启用WEB代理,浏览器把代理上网设置为JMeter所在的IP地址,自己电脑就是127.0.0.1代理端口默认8080.至于浏览器修改代理上网服务器,不做截图. Jmet ...
- React native 无法弹出调试控件的问题
React Native 在debug模式下,可以通过摇动手机,弹出调试选项.但是今天利用了cocoapods 把react native 文件整理后,调试界面就弹不出了,其他功能正常.查了好久,发现 ...
- CENTOS 7 安装 TINYPROXY 代理服务器
https://www.cnblogs.com/new_2050/p/7658508.html
- Node中包的加载机制
1.Node原生提供的核心模块:http.fs.os.path.url.querystring,Node在加载核心模块时,不需要传入路径,因为Node.js已经将核心模块的文件代码编译到了二进制的 ...
- cf1153D 树形dp+思维
一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...
- 强大的IDEA开发工具
开发工具切换IDEA 一:首先安装好IDEA工具并且配置maven信息 打开-File-Settings 新建maven WEB项目 打开-File-New-Project 点击NEXT 点击NEXT ...
- 如何在element-ui table 取到对应的ID的最后一个对象
来回切换3个状态值如何得到对应ID的最后一个对象 var is_push = () => { for (var i = 0; i < this.form.FaultDevices.leng ...
- HBase2.0.5 WordCount
待计算的wordCount文件放在HDFS上. wc.txt: hive hadoop hello hello world hbase hive 目标:进行WordCount计算,把结果输出到HBas ...
- SQLServer中的CTE通用表表达式
开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...