/****************************************************/

**关于移植,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的更多相关文章

  1. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  2. ucos ii 46个系统API函数解析

    源: ucos ii 46个系统API函数解析

  3. FreeRTOS 和uCOS II的简单比较

    转载:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=114 这是两种RTOS, 现在粗略比较一下. freeRTOS比uCO ...

  4. ucos ii 百度官方介绍

          μC/OS II(Micro-Controller Operating System Two)是一个可以基于ROM运行的.可裁剪的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处 ...

  5. 嵌入式无操作系统下管理内存和队列(类UCOS II思想)

    例子:存储日志,最多存128条,每条最大1MB. 内存方面 因为嵌入式不适合用动态内存,会产生碎片.这里我们用 u8 data[LOG_SIZE];开辟固定128MB的内存区,再对其分为128个1MB ...

  6. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  7. ucos串口通讯模块设计

    在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率.缩短开发周期.uCOS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位 ...

  8. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  9. 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...

  10. 入门 uCOS 操作系统的一点建议

    原创: 鱼鹰Osprey  鱼鹰谈单片机 3月2日 预计阅读时间: 4 分钟 对于想入门操作系统的读者,我的建议是先学 uCOS II.原因有以下几点: 1.最为重要的原因是网上相关资源非常丰富,这对 ...

随机推荐

  1. 完全卸载删除gitlab

    完全卸载删除gitlab 1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里写的是gitlab-ce) rpm -e gitlab-ce 3.查看gitlab进程 p ...

  2. Java_数据类型

    变量就是申请内存来存储值. java的两大数据类型:内置数据类型和引用数据类型 数据类型 6种数据类型(4种整数型,2种浮点型),一种字符类型,一种布尔类型 数据类型 位数 描述 byte 8位 -1 ...

  3. Git使用十:匿名分支和checkout命令

    匿名分支 新建个仓库,并且初始化,创建3个文件,并提交 此时在没有创建新分支的情况下,checkout一下,比如上一个快照 这一段话的意思是,使用了checkout命令,但是没有指定分支名,所以git ...

  4. sass进阶—mixin的使用(浏览器兼容性调整)

    @mixin content($color:red,$fontSize:14px){ color:$color; font-size: $fontSize;} /*调用含参数的mixin,使用更加灵活 ...

  5. nuxt

    nuxt nuxt 1.4.0 https://zh.nuxtjs.org/guide/installation vue init nuxt-community/starter-template te ...

  6. kuangbin带你飞dp专题-基础dp

    dp HDU - 1257 最少拦截系统 最长递增子序列 #include<iostream> using namespace std; const int maxn=1e7; int a ...

  7. 微服务化不同阶段 Kubernetes 的不同玩法

    本文由  网易云发布. 作为容器集群管理技术竞争的大赢家,Kubernetes 已经和微服务紧密联系,采用 Kubernetes 的企业往往都开始了微服务架构的探索.然而不同企业不同阶段的微服务实践面 ...

  8. 项目必备!永无 bug 注释

    佛祖保佑 永无bug 代码注释 // // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`-- ...

  9. 自定义PlantUML和C4 Model样式

    什么是PlantUml PlantUml是一个支持快速绘制的开源项目.其定义了一套完整的语言用于实现UML关系图的描述.并基于强大的graphviz图形渲染库进行UML图的生成.绘制的UML图还可以导 ...

  10. DWM1000 巧用Status 快速Debug

    在Debug DWM1000 的时候,可以巧用Status 加快Debug,例如如下代码 if (status_reg & SYS_STATUS_RXFCG) { …… } else { sp ...