本文章都是基于学习野火STMF4系列的开发板的学习做的,大部分都是开发手册的内容,做笔记用,具体请参考野火官方的开发手册。
1. uC/OS-III 文件结构

①配置文件,通过定义这些文件里宏的值可以轻易地裁剪 uC/OS-III 的功能。
②用户应用文件, 定义和声明应用任务。
③内核服务文件,其代码与 CPU 无关,可以不做任何修改移植到任何 CPU。
④底层函数库,比如字符串的常规操作, 常用的数学计算, 等等。
⑤CPU 移植文件, 用户如果想要移植 uC/OS-III 到不同平台上,需要修改这部分代码。
⑥CPU 配置文件,主要是 CPU 的一些工作模式和服务函数。
⑦其他 CPU 相关文件。
2.uC/OS-III 数据结构
uC/OS-III 中的内核对象大多都是以结构体的形式存在的,例如出现最多的任务的任务控制块的数据结构如下所示,结构体中的每个成员代表任务具有的一种属性。在结构体中,可以看到很多宏,通过定义这些宏,就可以轻易地裁剪任务控制块具有的属性(任务的功能)。
在 uC/OS-III 中,对内核对象的管理大多采用线性链表的数据结构,包括单向链表和双向链表。链表就是将要管理的对象按照方便管理的规则一个接一个串联在一起,提高管理效率。

3.uC/OS-III 内核对象
在 uC/OS-III 初始化的时候, 至少会创建空闲任务 OS_IdleTask()和时基任务OS_TickTask()这两个任务, 另外还有三个可选择的内部任务,软件定时器任务OS_TmrTaks() 、中断延迟提交任务 OS_IntQTask()和统计任务 OS_StatTask()。

任务切换情况:

从 uC/OS-III 任务管理的角度来看, uC/OS-III 中的任务 9 种状态, 如下所示。 分别是休眠态、就绪态、运行态、挂起态和中断态,如下表示。OS_TASK_STATE_RDY:就绪状态。处于该状态的任务按照优先级高低先后占有 CPU 运行。
OS_TASK_STATE_DLY:延时状态。任务调用 uC/OS 的延时韩式OSTimeDly()或 OSTimeDlyHMSM 后,就停止运行,进入延时状态。
OS_TASK_STATE_PEND:无期限等待状态。 任务需要停止运行,等待某个事件(内核对象),直到等到才继续运行。
OS_TASK_STATE_PEND_TIMEOUT:有期限等待状态。任务需要停止运行,在
一定时间内等待某个事件(内核对象),如果超时或事件发生了,就继续运行。
OS_TASK_STATE_SUSPENDED:挂起状态。任务被强制暂停运行,直到被
恢复才可继续运行。
OS_TASK_STATE_DLY_SUSPENDED:延时中被挂起状态。 任务在延时状态时,
又被其它任务挂起。
OS_TASK_STATE_PEND_SUSPENDED:无期限等待中被挂起状态。任务在无期限等待某个事件(内核对象)时,又被其它任务挂起。
OS_TASK_STATE_PEND_TIMEOUT_SUSPENDED:有期限等待中被挂起状态。任务在有期限等待某个事件(内核对象)时,又被其它任务挂起。
OS_TASK_STATE_DEL:删除状态。 任务被删除, 不再参与任务管理, 重新创建后才收 uC/OS 管理。
4.软件定时器
软件定时器的功能跟硬件定时器一样,主要用于定时,但其精度达不到硬件定时器的标准,可以用于定时一些精度要求不是特别严格的事件。理论上, uC/OS-III 可以创建无数个软件定时器,这是硬件定时器无法媲美的。
5. 多值信号量
多值信号量主要用于管理资源和标志事件的发生。管理资源的一个常用仿例就是停车场,把总停车位看做信号量,每次申请一个停车位信号量就减 1,如果停车位为 0,就申请不到,但可以等待其它汽车释放停车位。 标志事件的发生类似于裸机里常用的事件标志变量,就是标志某事是否发生,然后通知任务。
6. 互斥信号量
互斥信号量的作用是保护共享资源,避免共享资源正在被重写时被其它任务读取,这样读取到的数据就有错误。 互斥信号量的作用跟多值信号量的作用有些重叠,多值信号量的执行时间少于互斥信号量,但多个任务访问共享资源时,容易出现优先级反转的问题,这会降低系统的可预知性, 而互斥信号量可以防止优先级反转,所以建议在互斥信号量可以解决需要时,就优先使用互斥信号量。
7.消息队列
消息队列是由多个消息串联而成的一个机制,需要消息的任务就从消息队列的出口端获取,如果消息队列里没有消息了,可以选择等待或者不等待消息的到来。消息可以比信号量携带更丰富的信息, 可以是任意长度的消息内容。
8.事件标志组
事件标志组用于标志若干个事件否发生的组合。这个功能可以轻易地实现键盘的按键组合。
9.任务信号量
任务信号量的作用与多值信号量的一样,但多值信号量是所有任务都可以申请使用,而任务信号量却只能给一个特定任务使用,也就是说任务信号量是一个任务本身的属性,但其他任务都可以给这个任务发送任务信号量。
10.任务消息队列
任务消息队列的作用与(普通)消息队列的一样,但(普通)消息队列是所有任务都可以申请它的消息,而任务任务消息队列的消息却只能给一个特定任务使用,也就是说任务消息队列是一个任务本身的属性,但其他任务都可以给这个任务发送任务消息。
11. 内存管理(分区)
内存管理(分区)主要是为了尽量减少内存在不断分配和释放过程造成的内存碎片,避免过多的浪费内存。 内存分区就是一次性开辟一大块连续内存,然后将内存分区平均分成若干个内存块,需要使用内存时就申请一个内存块,用完了再释放回内存分区, 这样就实现内存块的循环使用。
12. uC/OS-III 常用程序段
(1).临界段
临界段主要是为了某段代码在执行时避免被其它任务或中断打断。临界段根据是否是使能了中断延迟提交(OS_CFG_ISR_POST_DEFERRED_EN)。
(2). 中断嵌套管理

4.0-uC/OS-III目录结构的更多相关文章

  1. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  2. uC/OS - III 移植 IAR平台

    关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...

  3. Thinkphp5.0实战开发二------自动生成目录结构

    序言 ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build 类库.ThinkPHP5.0中模块文件夹在application ...

  4. 关于SVN 目录结构

    Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/   |   +-trunk   +-bra ...

  5. 关于SVN 目录结构,使用教程

    SVN使用教程:http://www.cnblogs.com/armyfai/p/3985660.html Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn ...

  6. SVN 目录结构

    Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...

  7. SVN是什么,svn的目录结构

    Svn是一个离线的代码管理,可以多个人一起修改,然后再将修改的内容提交到Svn中.每一个svn服务器中的数据存储单位叫做存储,但是你不仅仅可以把整个存储当作你维护的内容,也可以将其中的某个分支目录像根 ...

  8. 【转】svn 的开发目录结构和流程

    原文: https://blog.csdn.net/iteye_15570/article/details/82548132 ------------------------------------- ...

  9. THINKPHP 5.0目录结构

    目录结构 下载最新版框架后,解压缩到web目录下面,可以看到初始的目录结构如下: project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更 ...

  10. thinkphp5.0目录结构

    下载最新版框架后,解压缩到web目录下面,可以看到初始的目录结构如下: project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ...

随机推荐

  1. MinGW 使用 mintty 终端替代默认终端以解决界面上复制与粘贴的问题

    使用了一段时间的 cygwin,挺开心的,又尝试了下同类工具 Msys + MinGW,安装好之后发现它居然使用默认的 cmd 作为终端,界面输出内容的复制与粘贴极其不便,我记得 Cygwin 使用的 ...

  2. 奇葩问题 eclipse中DDMS的LOGcat只有一列level

    http://stackoverflow.com/questions/25010393/eclipse-logcat-shows-only-the-first-letter-from-each-mes ...

  3. Spring源码学习:day2

    前言: 我还是太懒了,连截图都懒得粘贴,故直接用书上说的话的截图吧. 代码的编写过程都是应该有一个入口的,所有的代码最终都是为了那个入口更加方便更加简单而产生的. 看代码的过程,就应该抓住主线,顺着主 ...

  4. 公众平台返回原始数据为: 错误代码-40164,错误信息-invalid ip, not in whitelist hint

    1.登录公众平台,进入开发->基本配置页面 2.点击配置进入IP白名单设置页 3.填写微客助理IP地址:183.63.25.68 4.管理员扫码确认保存 5.设置成功后点击“关闭” 6.修改成功 ...

  5. jenkins 部署问题

    1. 怀疑 jenkins 没有拉到最新的包解决:清除 jenkins 工作空间 2. jenkins 自动构建时, start.sh 脚本已经执行成功,但是应用总是启动后自动退出了进程没有起来,从 ...

  6. 13组合模式Composite

    一.什么是组合模式 Composite模式也叫组合模式,是构造型的设 计模式之一.通过递归手段来构造树形的对象结 构,并可以通过一个对象来访问整个对象树. 二.组合模式的结构 三.组合模式的角色和职责 ...

  7. js中的构造函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 一篇文章带你看懂Cloudflare信息泄露事件

    版权声明:本文由贺嘉  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/753847001488039974 来源:腾云阁  ...

  9. linux如何安装多个jdk?

    1 官网下载JDK版本 jdk-8u181-linux-x64.tar.gz 2 利用ssh工具上传安装包到Linux系统 传至:/usr/local 3 Linux用户安装的程序一般放在 /usr/ ...

  10. ssh 管理 linux登录远程服务器

    使用 ssh 免秘登录方式 客户端:1. 生成公钥和私钥 ssh-keygen 一般不需要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个. 运行结束以后,在$HOME/. ...