首页 > 嵌入式软件 > Uc/os II

uC/OS-II是一个简洁、易用的基于优先级的嵌入式抢占式多任务实时内核。尽管它非常简单,但是它的确在很大程度上解放了我的嵌入式开发工作。既然是一个操作系统内核,那么一旦使用它,就会涉及到如何基于操作系统设计应用软件的问题。

本文引用地址: http://embed.21ic.com/software/ucos/201805/51766.html

1. uC/OS-II的任务框架

void task_xxx(void *pArg)

{

/* 该任务的初始化工作 */

……

/* 进入该任务的死循环 */

while(1)

{

……

}

}

每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型”。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片。当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型”。事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:

(1)中断服务函数发送的事件

(2)系统延时时间到所引起的

(3)其它任务发送的事件。

其中“中断服务函数发送的事件”就是指每当有硬件中断发生,那么中断服务程序就会以事件的形式告诉任务,而等待该事件的最高优先级任务就会马上得以运行;“系统延时时间到所引起的”事件其实也是硬件中断导致的,那就是系统定时器中断。而“其它任务发送的事件”则是由任务代码自身决定的,这是完全的“软事件”。不管“软事件”还是“硬事件”,反正引起uC/OS-II任务切换的原因就是“事件”,所以用户编写应用代码的时候一定要体现出“事件驱动的编程模型”。

2.uC/OS-II的任务优先级分配

uC/OS-II的任务优先级分配需要按照不同的系统设计具体分析。比如,对实时性要求越高的任务,则优先级要越高。

3.uC/OS-II的软件层次

uC/OS-II会直接操纵硬件,比如:任务切换代码必然要保存和恢复CPU及协处理器的寄存器;uC/OS-II的内核时基时钟就需要硬件定时器的中断。

BSP就是“板极支持包”,它包括基于uC/OS-II而开发的事件驱动模型、支持多任务的驱动程序,这些驱动程序直接控制各个硬件模块并利用uC/OS-II的系统函数来实现多任务功能,它们应该尽量避免应用程序直接操纵硬件和uC/OS-II内核。BSP还应该为应用程序提供标准、统一的API,以达到软件层次分明、应用软件代码可复用的目的。

应用程序就是用户为具体应用需要而开发的软件,它必须符合uC/OS-II的编程模型,即“事件驱动的编程模型”。应用程序还应该尽量避免直接控制硬件和直接调用uC/OS-II系统函数、变量,一个完善的uC/OS-II系统是不需要应用程序来针对具体硬件而设计的。也就是说,uC/OS-II必须拥有完备的设备驱动程序,而驱动程序和BSP共同提供完备、标准的API。

4.uC/OS-II中使用互斥信号对象应该注意

互斥信号对象(Mutual Exclusion Semaphore)简称Mutex,是uC/OS-II的内核对象之一,用于管理那些需要独占访问的资源,并使其适应多任务环境。

创建每一个Mutex,都需要指定一个空闲的优先级号,这个优先级号的优先级必须比所有可能使用此Mutex的任务的优先级都高!

uC/OS-II的Mutex实现原理大致如下:

当一个低优先级的任务A申请并得到了Mutex,于是它获得资源访问权。如果此后有一个高优先级的任务B开始运行(此时任务A已经被剥夺),而且也要求得到Mutex,系统就会把任务A的优先级提高到Mutex所指定的优先级。由于此优先级高于任何可能使用此Mutex的任务的优先级,所以任务A会马上获得CPU控制权。一直到任务A释放Mutex,任务A才回到它原有的优先级,这时任务B就可以拥有该Mutex了。

应该注意的是:当任务A得到Mutex后,就不要再等待其它内核对象(诸如:信号量、邮箱、队列、事件标志等等)了,而应该尽量快速的完成工作,释放Mutex。否则,这样的Mutex就失去了作用,而且效果比直接使用信号量(Sem)更糟糕!

虽然普通的信号量(Sem)也可以用于互斥访问某独占资源,但是它可能引起“优先级反转”的问题。假设上面的例子使用的是Sem,当任务A得到Sem后,那么任务C(假设任务C的优先级比A高,但比B低)就绪的话将获得CPU控制权,于是任务A和任务B都被剥夺CPU控制权。任务C的优先级比B低,却优先得到了CPU!而如果任务A是优先级最低的任务,那么它就要等到所有比它优先级高的任务都挂起之后才会拥有CPU,那么任务B(优先级最高的任务)跟着它一起倒霉!这就是优先级反转问题,这是违背“基于优先级的抢占式多任务实时操作系统”原则的!

综上所述,uC/OS-II中多个任务访问独占资源时,最好使用Mutex,但是Mutex是比较消耗CPU时间和内存的。如果某高优先级的任务要使用独占资源,但是不在乎久等的情况下,就可以使用Sem,因为Sem是最高效最省内存的内核对象。

5.uC/OS-II应用程序调用OSSchedLock()和OSSchedUnlock()函数应注意

uC/OS-II的OSSchedLock()和OSSchedUnlock()函数允许应用程序锁定当前任务不被其它任务抢占。使用时应当注意的是:当你调用了OSSchedLock()之后,而在调用OSSchedUnlock()之前,千万不要再调用诸如OSFlagPend()、OSMboxPend()、OSMutexPend()、OSQPend()、OSSemPend()之类的事件等待函数!而且应当确保OSSchedLock()和OSSchedUnlock()函数成对出现,特别是在有些分支条件语句中,要考虑各种分支情况,不要有遗漏!

需要一并提醒用户的是:当您调用开关中断函数OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()时也要确保成对出现,否则系统将可能崩溃!不过,在OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函数之间调用OSFlagPend()、OSMboxPend()、OSMutexPend()、OSQPend()、OSSemPend()之类的事件等待函数是允许的。

6.uC/OS-II驱动程序编写规范,特别推荐

首先应该阐明的是,我们这里讨论的是“驱动程序”,而不是“中断服务程序”,这两个词语往往被用户混淆。

(1)中断服务程序指那种硬件中断一旦发生,就会立即被硬件中断控制器调用的一小段程序,它的操作追求简单明了,越快速越精简就越好。

(2)驱动程序是指封装了某种硬件操作细节的函数集,它提供给应用程序的是统一、标准、清晰、易用的API。

对于中断服务程序的编写,往往与驱动程序的设计相关联。比如驱动程序提供异步操作的功能,那么就需要中断服务程序为它准备缓冲区和一个结构体,并且中断服务程序会依照这个结构体的成员参数自动完成所要求的操作。又如,串口(UART)中断服务程序的设计有两种:基于数据包传输和基于单字节传输,前者适用于以数据包为单位的通信程序,而后者适用于如超级终端这样的应用程序。

如果在一个系统中,要求使用同一个硬件设备完成几种不同的操作方式,就需要设计一个通用的驱动程序,而该驱动程序可以根据需要安装各种针对性很强的中断服务程序。

在设计驱动程序时,特别需要注意的是,某些外设的操作往往以一个连续而严格的时序作为原子操作,比如用I/O端口来访问DS1302、24C01、LM75A等等。在这类设备的操作过程中,不允许有其它任务来控制对应的I/O端口,否则会引起数据错误甚至器件损坏。所以,这种设备的驱动程序都应该仔细设计“原子操作”,把必须连贯操作的时序控制代码用互斥对象封装成一个“原子操作”,以适应多任务环境。其实,大部分设备都是这样,需要确定“原子操作”,如LCD、RTL8019AS、Flash等等也是如此。

1.AI时代FPGA厂商与FPGA工程师该如何转型?

2.介绍几款嵌入式开发工具,或许能用上!

3.牛人已经总结了单片机应用程序架构,去看即可!

4.4 月编程语言排行榜:万年不变的前三

5.通过这 9 本开源好书学习 C 语言

6.ARM寄存器与汇编指令详解

换一批

延伸阅读

[行业资讯] 郭台铭:中国可以做出自己的芯片和操作系统,但路要慢慢走

郭台铭:中国可以做出自己的芯片和操作系统,但路要慢慢走

鸿海董事长郭台铭表示,中国可以做出自己的芯片和操作系统。他认为,今年富士康进行园区改造,深圳龙华产业园区预计5年改造完成。 ......

关键字:芯片 操作系统 机器人

[行业资讯] 无人驾驶公交来了!湖南湘江新区智能系统测试区正式开园

无人驾驶公交来了!湖南湘江新区智能系统测试区正式开园

湘江智谷,驱动未来!6月12日,湖南湘江新区智能系统测试区正式开园,这个国内封闭式测试区中场景复杂程度最高、测试服务全国最全的测试区揭开“神秘面纱”。开园仪式当日还举行了“2018智能网联汽车产业·湘江对话”。这标志着长沙向全力打造全球智能......

关键字:智能系统 自动驾驶 智能网联汽车

[行业资讯] 齐聚深圳、嵌入式专家研讨人工智能时代发展机遇

齐聚深圳、嵌入式专家研讨人工智能时代发展机遇

近日,嵌入式系统联谊会第23次主题讨论会就这些问题,邀请业内知名专家和学者做了深入的探讨!本次会议由嵌入式系统联谊会、深圳北航新兴产业技术研究院主办,深圳北航物联网研究院、物联网咖啡承办,北京航空航天大学出版社、泰智会共同协办。主题为”人工......

关键字:嵌入式 单片机 人工智能 嵌入式系统

[行业资讯] 在路上!我国自主智能终端操作系统日趋成熟

在路上!我国自主智能终端操作系统日趋成熟

长期以来,智能终端操作系统基础软件一直是我国短板领域。随着智能手机的普及,研发自主、可控、成熟的智能终端操作系统成为迫切需求。在国家大力支持和行业的共同努力下,近年来,我国涌现了一批以syberos为代表的自主智能终端操作系统填补空白,自主......

关键字:智能终端 操作系统 芯片

[行业资讯] 晶心科技再创里程碑 累积授权合约数突破200份

晶心科技再创里程碑 累积授权合约数突破200份

晶心的销售市场涵盖臺湾、美国、日本、韩国、大陆、欧洲等地,代表晶心科技的产品与技术获得全球客户的肯定。 ......

关键字:晶心科技 IPO 嵌入式系统

[疯狂史] 忆当年硬件开发梦:就俩字,TM青涩!

忆当年硬件开发梦:就俩字,TM青涩!

此文仅献给那些刚刚踏上硬件之路和还在徘徊的同学们,在此我简要的记录了我的学习经历和其间自己所获的一些心得,以帮助初学者少走弯路。......

关键字:硬件开发 硬件学习

[真心话] 裁员23%,VR市场转冷让HTC压力山大

裁员23%,VR市场转冷让HTC压力山大

在经历了连续几个季度的亏损后,7月2日晚间,HTC宣布启动组织优化政策,将于今年9月底之前裁员1500人。HTC表示,此项优化台湾制造部门的计划将使公司得以进行更加有效和灵活的资源管理,这次裁员是为了确保产能与市......

关键字:VR HTC 虚拟现实

[疯狂史] 涉案金额3.2亿!全国最大刷单案落定,每天最高7000单均价6元

涉案金额3.2亿!全国最大刷单案落定,每天最高7000单均价6元

预售、秒杀、抢购……每逢电商大促,剁手党疯狂下单掀起网络狂欢的同时,网络诚信也在经受着严峻的考验。今天是电商618的决战日,各家电商平台的流量战打得也是如火如荼,交易量、商品评价、信用评价等指......

关键字:电商 网络刷单

[猎聘集] 复盘一次失败的技术面试后,我成功拿到了 5 个offer

复盘一次失败的技术面试后,我成功拿到了 5 个offer

对于开发者来说,找工作最难的莫过于技术面试。Fredrik Strand Oseberg在freeCodeCamp上发表了一篇文章,介绍了自己学习编程6个月后找工作获得5个offer的经历。......

关键字:技术面试 offer
条评论

我 要 评 论

网友评论

大家都爱看

  • 扇出型晶圆级封装的优势和挑战!

    我们有能力创造一些能保持前代性能并且更好更小的电子设备,例如今天的可穿戴设备、智能手机或平板电脑,这是由于很多因素超过摩尔定律而快速发展,从而能够从底层的嵌入组件发展到今天把它们封…

    2018-03-29
  • Xilinx推出革命性的新型自适应计算产品

    自适应和智能计算的全球领先企业赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX)),近日宣布推出一款超越FPGA功能的突破性新型产品,名为ACAP(Adaptive Compute Acceleration Platform,自适应计算加速…

    2018-03-20
  • 赛普拉斯为树莓派3 B+ IoT单板计算机提供强大稳定的无

    先进嵌入式系统解决方案的领导者赛普拉斯(纳斯达克代码:CY)近日宣布其Wi-Fi®和蓝牙®combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3Model B+)IoT单板计算机提供强大稳定的无线连接…

    2018-03-20
  • 观看直播领红包,SEED-A10加速卡助力人工智能

    随着云服务器、云计算的发展,大家对硬件加速的需求越来越多,但是随着设备功耗的上升、性能需求越来越高,常规加速设备以及开始不能满足需求,因此FPGA逐渐在硬件加速中找到了自己的位置,而艾…

    2018-03-19
  • 特朗普:博通不得以任何形式收购高通

    白宫周一(3月12日)晚发出声明,川普(特朗普)总统出于“国家安全”考量、禁止新加坡博通公司(Broadcom)收购美国高通公司(Qualcomm)。

    2018-03-14