ucosii中文书邵贝贝

合集下载

转:一步一步教你使用uCOS-II

转:一步一步教你使用uCOS-II

转:⼀步⼀步教你使⽤uCOS-II第⼀篇 UCOS介绍第⼀篇 UCOS介绍这个⼤家都知道。

呵呵。

考虑到咱们学习的完整性还是在这⾥唠叨⼀下。

让⼤家再熟悉⼀下。

⾼⼿们忍耐⼀下吧! uC/OS II(Micro Control Operation System Two)是⼀个可以基于ROM运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。

为了提供最好的移植性能,uC/OS II最⼤程度上使⽤ANSI C语⾔进⾏开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。

uC/OS II可以简单的视为⼀个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。

其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。

内核属于抢占式,最多可以管理60个任务。

µC/OS-II 的前⾝是µC/OS,最早出⾃于1992 年美国嵌⼊式系统专家Jean brosse 在《嵌⼊式系统编程》杂志的5 ⽉和6 ⽉刊上刊登的⽂章连载,并把µC/OS 的源码发布在该杂志的B B S 上。

µC/OS 和µC/OS-II 是专门为计算机的嵌⼊式应⽤设计的,绝⼤部分代码是⽤C语⾔编写的。

CPU 硬件相关部分是⽤汇编语⾔编写的、总量约200⾏的汇编语⾔部分被压缩到最低限度,为的是便于移植到任何⼀种其它的CPU 上。

⽤户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件⼯具,就可以将µC/OS-II嵌⼈到开发的产品中。

µC/OS-II 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。

µC/OS-II 已经移植到了⼏乎所有知名的CPU 上。

ucos2中系统函数OSTaskDelReq()的用法,体会,和注意事项

ucos2中系统函数OSTaskDelReq()的用法,体会,和注意事项

OSTaskDelReq()本文就该函数做了细致,深入的解答。

并借用网友的例子和邵贝贝书上的例子,讲解了一般的问题和常用的用法。

带了自己的感想和思考。

希望对自己有帮助。

做此记录。

在ucos中这个函数很常用,个人觉着,使用OSTaskDel,是有风险的,因为他会删除那些变量。

比如下面的一篇文章的部分内容。

慎用OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTaskDel(OS_PRIO_SELF);这个函数,把该任务使用到的变量都给删除了!比如,在Wake_Modem();中使用到了char txmsg;.................txmsg ='7';OSQPost(QSem, (void *)&txmsg);而在另一个任务中等待该消息,char *rxmsg = 0;....................rxmsg=(char *)OSQPend(QSem, 0, &err);switch(*rxmsg){ case '7':OS_ENTER_CRITICAL();Uart_Select(0);Uart_Init(0,115200);Uart_Printf("OK!\n");OS_EXIT_CRITICAL();break;}程序则无法输出OK,因为OSTaskDel(OS_PRIO_SELF);这个函数的存在,导致txmsg 也被删除了!OSTaskSuspend(OS_PRIO_SELF); 与之同效!解决办法:static char txmsg;下面是OSTaskDelReq的用法。

一、发出删除任务请求的任务和打算被时删除的任务都必须调用OSTaskDelReq() 函数举个例子:请求删除其他任务的任务,设为Task-1。

要被删除的任务,设为Task-2。

uC_OS-II实验指导书

uC_OS-II实验指导书
3.1 µC/OS-II 概述............................................................................................................................. 5 3.2 µC/OS-II 的特点......................................................................................................................... 6 3.3 µC/OS-II 主要源代码文件介绍.................................................................................................7 4 LambdaTOOL 集成开发环境简介....................................................................................................... 7 5 µC/OS-II 实验内容简介........................................................................................................................ 8 5.1 任务管理实验............................................................................................................................ 8 5.2 优先级反转实验........................................................................................................................ 8 5.3 优先级继承实验........................................................................................................................ 9 5.4 哲学家就餐实验........................................................................................................................ 9 5.5 内存管理实验............................................................................................................................ 9 5.6 时钟中断实验............................................................................................................................ 9 5.7 消息队列实验............................................................................................................................ 9 6 预备实验:嵌入式开发环境的建立................................................................................................... 9 6.1 目的............................................................................................................................................ 9 6.2 实验步骤及说明...................................................................................................................... 10

ucos-ii中文书(邵贝贝)第4章

ucos-ii中文书(邵贝贝)第4章

第4章任务管理 (1)4.0建立任务,OSTaskCreate() (2)4.1建立任务,OSTaskCreateExt() (6)4.2任务堆栈 (9)4.3堆栈检验,OSTaskStkChk() (11)4.4删除任务,OSTaskDel() (14)4.5请求删除任务,OSTaskDelReq() (17)4.6改变任务的优先级,OSTaskChangePrio() (20)4.7挂起任务,OSTaskSuspend() (23)4.8恢复任务,OSTaskResume() (25)4.9获得有关任务的信息,OSTaskQuery() (26)第4章任务管理在前面的章节中,笔者曾说过任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。

这里要注意的是,任务代码并不是被真正的删除了,而只是µC/OS-Ⅱ不再理会该任务代码,所以该任务代码不会再运行。

任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。

任务的返回类型必须被定义成void型。

在本章中所提到的函数可以在OS_TASK文件中找到。

如前所述,任务必须是以下两种结构之一:void YourTask (void *pdata){for (;;) {/* 用户代码 */调用µC/OS-Ⅱ的服务例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用户代码 */}}或void YourTask (void *pdata){/* 用户代码 */OSTaskDel(OS_PRIO_SELF);}本章所讲的内容包括如何在用户的应用程序中建立任务、删除任务、改变任务的优先级、挂起和恢复任务,以及获得有关任务的信息。

µC/OS-Ⅱ可以管理多达64个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。

ucos-ii中文书(邵贝贝)第2章

ucos-ii中文书(邵贝贝)第2章

第2章实时系统概念 (1)2.0 前后台系统(F OREGROUND/B ACKGROUND S YSTEM) (1)2.1 代码的临界段 (2)2.2 资源 (2)2.3 共享资源 (2)2.4 多任务 (2)2.5 任务 (3)2.6 任务切换(C ONTEXT S WITCH OR T ASK S WITCH) (4)2.7 内核(K ERNEL) (5)2.8 调度(S CHEDULER) (5)2.9 不可剥夺型内核(N ON-P REEMPTIVE K ERNEL) (5)2.10 可剥夺型内核 (6)2.11 可重入性(R EENTRANCY) (7)2.12 时间片轮番调度法 (9)2.13 任务优先级 (10)2.14 2.14静态优先级 (10)2.15 动态优先级 (10)2.16 优先级反转 (10)2.17 任务优先级分配 (12)2.18 互斥条件 (13)2.18.1关中断和开中断 (14)2.18.2测试并置位 (15)2.18.3禁止,然后允许任务切换 (15)2.18.4信号量(Semaphores) (16)2.19 死锁(或抱死)(D EADLOCK (OR D EADLY E MBRACE)) (21)2.20 同步 (21)2.21 事件标志(E VENT F LAGS) (23)2.22 任务间的通讯(I NTERTASK C OMMUNICATION) (24)2.23 消息邮箱(M ESSAGE M AIL BOXES) (25)2.24 消息队列(M ESSAGE Q UEUE) (26)2.25 中断 (27)2.26 中断延迟 (27)2.27 中断响应 (28)2.28 中断恢复时间(I NTERRUPT R ECOVERY) (29)2.29 中断延迟、响应和恢复 (29)2.30 中断处理时间 (30)2.31 非屏蔽中断(NMI) (31)2.32 时钟节拍(C LOCK T ICK) (33)I2.33 对存储器的需求 (35)2.34 使用实时内核的优缺点 (36)2.35 实时系统小结 (37)II1 第2章 实时系统概念实时系统的特点是,如果逻辑和时序出现偏差将会引起严重后果的系统。

如何学习ARM

如何学习ARM

如何学习ARM2010年05月17日星期一19:15学习必备条件:1、一块开发板——现在淘宝上有很多开发板,建议初学者不要去购买那些ARM9体系结构的,因为作为初学者来说ARM9体系的东西是很复杂的,买块ARM7的就可以了(先入门,然后再提高);2、学习必备书籍《Pointer on C》中文名字叫《C和指针》(美)里科|译者:徐波前提你的了解C 指针吧(这本书时非常经典的书籍,完全可以看中文版的,作者翻译的非常到位)《嵌入式实时操作系统μCOS-II(第二版)》--邵贝贝翻译的(不能不承认邵贝贝是一个非常好的翻译者)《μC/OS-Ⅱ标准教程》--杨宗德对于英文不好的朋友可以购买《ARM体系结构与编程》--杜春蕾(该书其实还是有很多翻译错误的,大家在看的时候要注意一下,但是不可否认的是这本书到目前为止算得上是我见过最好的讲解关于ARM体系结构的书籍了)对于英文过关的兄弟姐妹可以直接看《ARM+Architecture+Reference+Manual(2nd+Edition)》3、有条件的兄弟姐妹可以选购一个仿真器JLINK V8全功能版(这个的感谢中国的优秀工程师,是他们把原价1999多的JLINK变成了几十元钱的东西4、开发环境--MDK350或者IARARM如果要熟悉这些开发环境,就需要好好读一些这些开发环境的手册资料,不好意思,这个就只有英文的了。

以上4个条件具备下来,可能也不会超过500元钱。

下面来讲讲我的学习经历:我刚开始学习的时候,自己走了不少弯路,这里就省略不说了。

第一步:在开发板上跑跑简单程序因为你有开发板,所以你就先在网上找一下对应开发板上的ARM芯片的datasheet,你都不先搞懂芯片的手册,又谈何让自己实现很多功能呢。

熟读数据手册后,就尽可能的在开发板上实现芯片对应的每个功能,像GPIO实验,UART通讯,I2C,ADC,DAC,PWM,RTC,SPI等等。

自己写自己的程序,然后在开发板上好好实践一下。

谈谈uCOS中全局变量的使用

谈谈uCOS中全局变量的使用
#include "includes.h"
当编译器处理.C文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。所以编译器给每个全局变量分配内存空间,而当编译器处理其他.C文件时,xxx_Gห้องสมุดไป่ตู้OBAL没有定义,xxx_EXT被定义为extern,这样用户就可以调用外部全局变量。为了说明这个概念,可以参见uC/OS_II.H,其中包括以下定义:
OS_EXT INT32U OSIdleMax;
同时,uCOS_II.H有中以下定义:
#define OS_GLOBALS
#include "includes.h"
当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。
INT32U OSIdleCtr;
#ifdef XXX_GLOBALS
#define XXX_EXT
#else
#define XXX_EXT extern
#endif
.H 文件中每个全局变量都加上了xxx_EXT的前缀。xxx代表模块的名字。该模块的.C文件中有以下定义:
#define XXX_GLOBALS
阅读邵贝贝翻译的《uC/OS-II》一书,发现里面用了一种非常巧妙的全局变量定义的方法,下面就自己的理解做一下记录,算是自己的笔记。也写出来和大家共同学习。
uC/OS-II中定义了一全局使用的头文件includes.h。这个文件在任意一个.C 文件中引用。
在每一个.H文件中定义了这样一个宏。\
#ifdef OS_GLOBALS
#define OS_EXT

ucos-ii中文书(邵贝贝)第1章

ucos-ii中文书(邵贝贝)第1章

/ 电子技术论坛 电子发烧友第一章: 第一章:范例在这一章里将提供三个范例来说明如何使用 C/OS-II。

笔者之所以在本书一开始就写 这一章是为了让读者尽快开始使用 C/OS-II。

在开始讲述这些例子之前,笔者想先说明一 些在这本书里的约定。

这些例子曾经用 Borland C/C++ 编译器(V3.1)编译过,用选择项产生 Intel/AMD80186 处理器(大模式下编译)的代码。

这些代码实际上是在 Intel Pentium II PC (300MHz)上 运行和测试过,Intel Pentium II PC 可以看成是特别快的 80186。

笔者选择 PC 做为目标系 统是由于以下几个原因:首先也是最为重要的,以 PC 做为目标系统比起以其他嵌入式环境, 如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写 EPROM,不断地向 EPROM 仿 真器中下载程序等等。

用户只需要简单地编译、链接和执行。

其次,使用 Borland C/C++产 生的 80186 的目标代码(实模式,在大模式下编译)与所有 Intel、AMD、Cyrix 公司的 80x86 CPU 兼容。

1.00 安装 C/OS-II C/OS本书附带一张软盘包括了所有我们讨论的源代码。

是假定读者在 80x86,Pentium,或者 Pentium-II 处理器上运行 DOS 或 Windows95。

至少需要 5Mb 硬盘空间来安装 uC/OS-II。

请按照以下步骤安装: 1.进入到 DOS(或在 Windows 95 下打开 DOS 窗口)并且指定 C:为默认驱动器。

2.将磁盘插入到 A:驱动器。

3.键入 A:INSTALL 【drive】 注意『drive』是读者想要将 C/OS-II 安装的目标磁盘的盘符。

INSTALL.BAT 是一个 DOS 的批处理文件,位于磁盘的根目录下。

它会自动在读者指定的 目标驱动器中建立\SOFTWARE 目录并且将 uCOS-II.EXE 文件从 A: 驱动器复制到\SOFTWARE 并 且运行。

关于uCOS-II中优先级翻转问题

关于uCOS-II中优先级翻转问题

关于uC/OS-II中优先级翻转问题■ 山东大学 秦绍华 陈涤1uC/OS-II的运行机制在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。

本文着重分析优先级翻转问题的产生和影响,以及在uC/OS-II中的解决方案。

uC/OS-II采用基于固定优先级的占先式调度方式,是一个实时、多任务的操作系统。

系统中的每个任务具有一个任务控制快OS_TCB,任务控制块记录任务执行的环境,包括任务的优先级,任务的堆栈指针,任务的相关事件控制块指针等。

内核将系统中处于就绪态的任务在就绪表(ready list)进行标注,通过就绪表中的两个变量OSRdyGrp和OSRdyTbl[]可快速查找系统中就绪的任务。

在uC/OS-II中每个任务有唯一的优先级,因此任务的优先级也是任务的唯一编号(ID),可以作为任务的唯一标识。

内核可用控制块优先级表OSTCBPrioTbl[]由任务的优先级查到任务控制块的地址。

uC/OS-II主要就是利用任务控制快OS_TCB、就绪表(ready list)和控制块优先级表OSTCBPrioTbl[]来进行任务调度的。

任务调度程序OSSched()首先由就绪表(ready list)中找到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优先级表OSTCBPrioTbl[]取得相应任务控制块的地址,由OS_TASK_SW()程序进行运行环境的切换。

将当前运行环境切换成该任务的运行环境,则该任务由就绪态转为运行态。

当这个任务运行完毕或因其它原因挂起时,任务调度程序OSSched()再次到就绪表(ready list)中寻找当前系统中处于就绪态中优先级最高的任务,转而执行该任务,如此完成任务调度。

若在任务运行时发生中断,则转向执行中断程序,执行完毕后不是简单的返回中断调用处,而是由OSIntExit()程序进行任务调度,执行当前系统中优先级最高的就绪态任务。

学习ucosii要用的几本书介绍

学习ucosii要用的几本书介绍

打算学习一个嵌入式操作系统,研究了一下决定还是先研究一下ucosii,一方面权当学习C语言,另一方面ucosii2.52版本代码只有5500行左右,还是一个能接受的范围。

对于新手,入门选书是最重要的了。

用了几天研究了一下参考书,和大家分享一下。

1.嵌入式实时操作系统μC/OS-II(第2版) 邵贝贝等译北京航空航天大学出版社应该说每一个学习ucosii的人都应该知道这本书,也都应该看一下这本书,但是不建议作为入门书籍。

这本书是ucosii的作者原著的翻译本,必然是很详细,必然是权威,然而书中分析ucosii内核原理是核心内容,应用则不多。

想要快速上手的应当选用其他书籍,这本书应该当做手册。

2.嵌入式实时操作系统μC/OS-II原理及应用(第2版) 任哲北京航空航天大学出版社这本书和第一本书比在讲述ucosii原理的同时,配备了一些很简单的例子,可以在PC上调试代码。

我用了大概5天的时间反复看了三遍这本书,感觉不错,适合入门。

当然书中有一些原理讲的不清楚,这个时候翻一下邵贝贝那本书就懂了。

3.ucosii标准教程杨宗德人民邮电出版社这本书我只翻了一下,看了看目录和前面一点内容。

用的模拟环境是VC++6.0对于那些搞软件的朋友看这本书应该合适,书中的内核是2.8版本。

我对这本书的好奇是,为什么没有参考文献?呵呵,所以。

你懂的。

4.基于嵌入式实时操作系统的程序设计技术周慈航北京航空航天大学出版社这本书有第一版和第二版,我手里只有第一版,在网上查了一下第二版的信息。

应该说内容差不多,第一版例子的平台是基于LPC2000系列的ARM7,而第二版是真对ARM Cortex-M3的。

LPC2000系列的ARM是可以用proteus仿真的,所以建议手里面没有ARM Cortex-M3开发板的朋友还是看第一版。

第一版的缺点是要有一些实时系统的知识,在你看完第任哲的那本书的时候就可以看这本了。

5.嵌入式系统软件设计中的数据结构陆玲周慈航北京航空航天大学出版社如果你和我一样,是非计算机专业的学生,没有学过数据结构,又不想看计算机系那么厚的所谓经典教材,那我建议你看一看这本书。

关于DSP2812上uCOS-II操作系统的说明

关于DSP2812上uCOS-II操作系统的说明

关于uCOS-II操作系统的说明一、工程文件的说明工程的所有文件在ucos目录下,打开工程文件后可以看到下面一些源文件·cmd文件工程的CMD文件与一般程序中的CMD 文件相同。

由F2812.cmd和DSP281x_Headers_nonBIOS.cmd两个文件组成。

其中对F2812.cmd文件进行了一些修改,将代码段定义在FLASH中,.bss和.ebss段都定义在低64K的数据空间中,以保证定义在.ebss段中的人物堆栈可以通过堆栈指针被访问。

·C语言和汇编源文件这部分文件在CCS窗口的Source文件夹下可以看到,主要有下面一些文件:Ucos_ii.c:操作系统的头文件包含文件。

OS_TickISR.asm:主要是OSTickISR( )函数,是操作系统时钟节拍中断的服务函数。

OS_Sw.asm:主要是OSCtxSw( )函数,非中断级任务切换函数,也是系统完成任务切换调用的30号中断(即USER 11 软中断)的中断服务函数。

OS_StartHighRdy.asm:主要是OSStartHighRdy()函数,在操作系统开始运行后(OSStart()函数开始执行以后)启动优先级最高的任务,一般情况下该任务是TaskStart任务。

OS_ISR.asm:中断服务程序的汇编源文件,尽量把要使用的中断服务程序放在这个文件中,使用汇编语言按照OS_SCIARXISR( )的结构编写。

关于中断服务程序后面会进一步加以说明。

OS_IntSw.asm:主要包含中断级任务切换函数OSIntCtxSw( ),完成中断级任务切换。

OS_GlobalStack.c:该文件中主要是全局任务堆栈的定义。

OS_cpu_c.c:该文件中主要是任务堆栈初始化函数OSTaskStkInit( )及其他一些与CPU相关的C语言函数的定义。

Ex1l.c:工程的主函数文件。

DSP281x_xxxx.c:例程中DSP2812外设操作的一些源代码,可以在这些文件中添加必要的操作外设的函数。

μCOS

μCOS

μC/OS-II在S3C44BOX处理器上的移植- ET电子技术网::因此,对μC/OS-II实时操作系统的学习研究、开发、应用具有重要意义。

Samsung S3C4 4B0X 微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。

它使用ARM公司的16位/32位RISC结构,内核是ARM7TDMI,工作在66MHz,片上集成了/html/dianzhijxwz/qianrushixitong/ARMxilie/20070105/101.htm lAnalysiS of Porting c/0s-i I to SkyEye 宋凯熊海泉严丽平Song Kai ::ARⅥ系列的处理器当前有ARbi7、ARM9、ARMgE、ARMIO等多个产品,此~bARM公司合作伙伴,例如Intel也提供基于XScale微体系结构的 S 4 结束语文件的移植,这个文件的实现集中体现了所要移植到处理器uC/OS-II作为一个优秀的实时操作系统已经被移植到各的/content/tp/97497a/2004/000/012/gc127_tp3_12188625.pdf摘要:本文介绍了基于ARM微处理器的µC/OS-II的移植,并对其进行扩展,主要包括内核、lwip、µC/GUI的移植。

关键字:微处理器; µC/OS-II;LWIP TCP/IP协议栈; µC/GUI嵌入式图形用户接口; 实时操作系统0 概述嵌入式操作系统µC/OS-II是一个公开源代码的占先式多任务的微内核RTO S,其特点可以概括为以下几个方面:公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。

内核属于抢占式,最多可以管理60个任务。

目前国内对µC/OS-II的研究和应用都很多。

只要买一本书就可获得源代码,对学校和教育的使用完全免费,商业应用的费用相对也很低。

ucOSII学习笔记(标志事件组_信号量_邮箱_互斥)

ucOSII学习笔记(标志事件组_信号量_邮箱_互斥)

目前因项目开发要用到ucOSII,在网上查找到了一些资料,为方便其他同仁,把我个人认为写得很好的文档摘抄到一个文件中,并上传到百度空间,希望对初学都有所帮助。

UCOS事件标志组管理笔记Ⅰ说明:本文摘自网上,来源已忘记,望原作者见谅。

当某个任务需要与多个任务同步时,须要使用事件标志组。

1、弄清楚OS_FLAG_GRP、OS_FLAG_NODE和OS_TCB之间的关系。

当一个任务开始等待某些事件标志位时,就回建立一个事件标志节点OS_FLAG_NODE数据结构,并且将任务所要等待的事件标志位写入OS_FLAG_NODE的分量.OSFlagNodeFlags。

然后将该数据结构分量.OSFlagNodeFLagGrp指向事件标志组OS_FLAG_GRP,将.OSFlagNodeTCB 指向该任务的控制块OS_TCB,建立起任务与事件标志组之间的联系,说明该任务是等待该事件标志组中某些事件标志位的任务。

当有多个任务都需要等待某个事件标志组中某些事件标志位时,这些任务分别建立自己的事件标志节点。

并且将这些事件标志节点通过分量.OS FlagNodeNext和.OSFlagNodePrev连接成链。

⒉、任务可以等待事件标志组中某些位置位1,也可以等待事件标志组中某些位清0,而置1(或清0)又可以分为所有事件都发生的“与”型和任何一个事件发生的“或”型。

这样便有了4种不同的类型存放在.OSFlagNodeWaitType(OS_FLAG_NODE)中。

3、事件标志组和信号量我觉得是有不同的。

信号量建立以后,假设初始值为N,前N个任务调用OSSemPend()函数都会得到信号量。

之后如果第N+1个任务调用OSSemPend()函数申请信号量,该任务将会被置为等待事件发生的状态(睡眠态)。

只到前N个任务中有任务运行完了所要运行的程序,调用OSSenmP ost()函数,释放了所占用了信号量,第N+1个任务。

(这里假设该任务是所有等待信号量任务中优先级最高的任务)才会获得信号量,被从睡眠态转入就绪态。

嵌入式μC-OS-II系统基础之邵贝贝节选

嵌入式μC-OS-II系统基础之邵贝贝节选

y = OSUnMapTbl[pevent->OSEventGrp]; x = OSUnMapTbl[pevent->OSEventTbl[y]]; prio = (y void OSEventWaitListInit (OS_EVENT *pevent) { INT8U i; pevent->OSEventGrp = 0x00; for (i = 0; i pevent->OSEventTbl[i] = 0x00; } } 程序清单 L6.6 使一个任务进入就绪状态 void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk) {
ptcb = OSTCBPrioTbl[prio]; (7) ptcb->OSTCBDly = 0; (8) ptcb->OSTCBEventPtr = (OS_EVENT *)0; (9) #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN ptcb->OSTCBMsg = msg; (10) #else msg = msg; #endif ptcb->OSTCBStat &= ~msk; (11) if (ptcb->OSTCBStat == OS_STAT_RDY) { (12) OSRdyGrp |= bity; (13) OSRdyTbl[y] |= bitx;
嵌入式 μC/OS-II 系统基础之邵贝贝节选
μC/OS-II 通过 uCOS_II.H 中定义的 OS_EVENT 数据结构来维护 一个事件控制块的所有信息 [程序清单 L6.1],也就是本章开篇讲到的事件控制块 ECB。该结构中除了 包含了事件本身的定 义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的 指针数组等,还定义 了等待该事件的所有任务的列表。 typedef struct { void *OSEventPtr; /* 指向消息或者消息队列的指针 */ INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* 等待任务列表 */ INT16U OSEventCnt; /* 计数器(当事件是信号量时) */ INT8U OSEventType; /* 时间类型 */ INT8U OSEventGrp; /* 等待任务所在的组 */

(完整word)PWM音频驱动

(完整word)PWM音频驱动

宁波理工学院嵌入式设计(论文)项目名称: PWM音频驱动专业班级: 07电信2班组员: 陈情柯 3070432048吴国炎 3070432040郦秋阳 3070432056任甲元 3070432053金刚明 3070432047指导教师:张德荣PWM音频驱动一、任务描述本次任务主要是用PWM波驱动蜂鸣器播放音乐。

整个系统以PHILIPSLPC2290为核心,开发PWM 音频驱动程序。

软件要求需要能够使播放的音乐能清晰的辨别高低音和音符。

二、资料收集2.1 ARM的PWM占空比控制在对PWM占空比控制做介绍之前,我们先来了解下PWM的单边沿控制和PWM的结构。

这两个是我们设计软件的基础.在对PWM的控制方面我们才用的是单边沿控制,PWM的结构主要反映了用程序控制产生可控制占空比的PWM波的过程。

在了解了PWM的单边沿控制和PWM的结构后我们开始对讲如何来控制ARM的PWM占空比控制。

2.1。

1 单边沿控制的PWM输出单边沿控制PWM描述。

2个匹配寄存器可用于提供单边沿控制的PWM输.一个匹配寄存器(PWMMR0)通过,匹配时复位定时器来控制PWM周期,另一个匹配寄存器控制PWM边沿的位置。

每增加1路单边沿PWM输出,只需要再提供一个匹配寄存器即可,因为所有的PWM输出的速率都是相同的,都是使用匹配寄存器0来控制的。

单边沿控制PWM输出在每个PWM周期的开始,输出都会变为高电平。

下图为不同占空比的单边沿控制PWM输出。

所有单边沿控制的单边沿控制的PWM输出在PWM周期开始时都为高电平,除非它们的匹配值等于0,每个PWM输出在到达其匹配值时都会变为低电平。

如果没有发生匹配(既匹配值大于PWM周期的值),PWM输出将一直保持高电平。

我们从下图中可以看到这个单边沿控制PWM的规则.2。

1.2 PWM的结构PWM的结构的方框图:由上图可知PWM的控制输出的过程。

映像寄存器中的值只有当所存使能寄存器(LER)使能时,才能到达匹配寄存器中,从而控制比较值.在控制中我们需要使能定时器控制寄存器的值(TCR )才能使预分频器(PR 、PC )和定时计数器(TC )工作。

学习RTOS——(2003嵌入式世界研讨暨展示会上的讲话节选)

学习RTOS——(2003嵌入式世界研讨暨展示会上的讲话节选)

学习RTOS——(2003嵌入式世界研讨暨展示会上的讲话节
选)
邵贝贝
【期刊名称】《电子产品世界》
【年(卷),期】2003(000)10A
【摘要】我讲学习,从嵌入式2000大会开始,年年都讲,这是第4次了。

今年奉献给读者的μC/OC-Ⅱ的第2版,是北航出版社6月份出的。

新版μC/OC-Ⅱ特点是通过美国的航空航天管理局的认证,是大家可以放心使用的书。

【总页数】3页(Pi007-i008,i013)
【作者】邵贝贝
【作者单位】清华大学工程物理系
【正文语种】中文
【中图分类】TP316.2
【相关文献】
1."微电子发展趋势与展望"(2003嵌入式世界研讨暨展示会上的讲话节选) [J], 张兴
2.DSP技术综述(2003嵌入式世界研讨暨展示会的讲话整理) [J], 张旭东
3.嵌入式通信设备和Linux操作系统——(2003嵌入式世界研讨暨展示会上的讲话整理) [J], 何小庆
4.“微电子发展趋势与展望”(2003嵌入式世界研讨暨展示会上的讲话节选)[J], 张兴
5.中国物流业的发展呼唤物流企业家--在首届中国物流企业家论坛暨2003中国物流(企业)年会上的讲话(节选) [J], 丁俊发
因版权原因,仅展示原文概要,查看原文内容请购买。

建立一个属于自己的AVR的RTOS[1]

建立一个属于自己的AVR的RTOS[1]

自从03年以来,对单片机的RTOS的学习和应用的热潮可谓一浪高过一浪.03年,在离开校园前的,非典的那几个月,在华师的后门那里买了本邵贝贝的《UCOSII》,通读了几次,没有实验器材,也不了了之。

在21IC上,大家都可以看到杨屹写的关于UCOSII在51上的移植,于是掀起了51上的RTOS的热潮。

再后来,陈明计先生推出的small rots,展示了一个用在51上的微内核,足以在52上进行任务调度。

前段时间,在ouravr上面开有专门关于AVR的Rtos的专栏,并且不少的兄弟把自己的作品拿出来,着实开了不少眼界。

这时,我重新回顾了使用单片机的经历,觉得很有必要,从根本上对单片机的RTOS的知识进行整理,于是,我开始了编写一个用在AVR单片机的 RTOS。

当时,我所有的知识和资源有:可以用来模拟仿真avr系列的单片机WinAVR 基于GCC AVR的编译环境,好处在于可以在C语言中插入asm的语句mega8 1K的ram有8K的rom,是开发8位的RTOS的一个理想的器件,并且我对它也比较熟悉。

写UCOS的Jean 在他的书上有这样一句话,“渐渐地,我自然会想到,写个实时内核直有那么难吗不就是不断地保存,恢复CPU的那些寄存器嘛。

”好了,当这一切准备好后,我们就可以开始我们的Rtos for mega8的实验之旅了。

本文列出的例子,全部完整可用。

只需要一个文件就可以编译了。

我相信,只要适当可用,最简单的就是最好的,这样可以排除一些不必要的干扰,让大家专注到每一个过程的学习。

第一篇:函数的运行在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。

例子如下:makefile的设定:运行WinAvr中的Mfile,设定如下MCU Type: mega8Optimization level: sDebug format :AVR-COFFC/C++ source file: 选译要编译的C文件#include <avr/>void fun1(void){unsigned char i=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}int main(void){fun1();}首先,提出一个问题:如果要调用一个函数,真是只能以上面的方式进行吗相信学习过C语言的各位会回答,No!我们还有一种方式,就是“用函数指针变量调用函数”,如果大家都和我一样,当初的教科书是谭浩强先生的《C程序设计》的话,请找回书的第节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

u c o s i i中文书邵贝贝集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]第5章时间管理在节时钟节拍中曾提到,μC/OS-Ⅱ(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。

这个定时中断叫做时钟节拍,它应该每秒发生10至100次。

时钟节拍的实际频率是由用户的应用程序决定的。

时钟节拍的频率越高,系统的负荷就越重。

节讨论了时钟的中断服务子程序和节时钟节函数OSTimeTick——该函数用于通知μC/OS-Ⅱ发生了时钟节拍中断。

本章主要讲述五个与时钟节拍有关的系统服务:OSTimeDly()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeGet()OSTimeSet()本章所提到的函数可以在文件中找到。

5.0任务延时函数,OSTimeDly()μC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。

实现这个系统服务的函数叫做OSTimeDly()。

调用该函数会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。

任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。

注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。

程序清单所示的是任务延时函数OSTimeDly()的代码。

用户的应用程序是通过提供延时的时钟节拍数——一个1 到65535之间的数,来调用该函数的。

如果用户指定0值[(1)],则表明用户不想延时任务,函数会立即返回到调用者。

非0值会使得任务延时函数OSTimeDly()将当前任务从就绪表中移除[(2)]。

接着,这个延时节拍数会被保存在当前任务的OS_TCB中[(3)],并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数。

最后,既然任务已经不再处于就绪状态,任务调度程序会执行下一个优先级最高的就绪任务。

程序清单 L OSTimeDly().void OSTimeDly (INT16U ticks){if (ticks > 0) { (1)OS_ENTER_CRITICAL();if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { (2)OSRdyGrp &= ~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly = ticks; (3)OS_EXIT_CRITICAL();OSSched(); (4)}}清楚地认识0到一个节拍之间的延时过程是非常重要的。

换句话说,如果用户只想延时一个时钟节拍,而实际上是在0到一个节拍之间结束延时。

即使用户的处理器的负荷不是很重,这种情况依然是存在的。

图详细说明了整个过程。

系统每隔10ms发生一次时钟节拍中断[(1)]。

假如用户没有执行其它的中断并且此时的中断是开着的,时钟节拍中断服务就会发生[(2)]。

也许用户有好几个高优先级的任务(HPT)在等待延时期满,它们会接着执行[(3)]。

接下来,图中所示的低优先级任务(LPT)会得到执行的机会,该任务在执行完后马上调用[(4)]所示的OSTimeDly(1)。

μC/OS-Ⅱ会使该任务处于休眠状态直至下一个节拍的到来。

当下一个节拍到来后,时钟节拍中断服务子程序会执行[(5)],但是这一次由于没有高优先级的任务被执行,μC/OS-Ⅱ会立即执行申请延时一个时钟节拍的任务[(6)]。

正如用户所看到的,该任务实际的延时少于一个节拍!在负荷很重的系统中,任务甚至有可能会在时钟中断即将发生时调用OSTimeDly(1),在这种情况下,任务几乎就没有得到任何延时,因为任务马上又被重新调度了。

如果用户的应用程序至少得延时一个节拍,必须要调用OSTimeDly(2),指定延时两个节拍!Figure Delay resolution.5.1按时分秒延时函数 OSTimeDlyHMSM()OSTimeDly()虽然是一个非常有用的函数,但用户的应用程序需要知道延时时间对应的时钟节拍的数目。

用户可以使用定义全局常数OS_TICKS_PER_SEC(参看的方法将时间转换成时钟段,但这种方法有时显得比较愚笨。

笔者增加了OSTimeDlyHMSM()函数后,用户就可以按小时(H)、分(M)、秒(S)和毫秒(m)来定义时间了,这样会显得更自然些。

与OSTimeDly()一样,调用OSTimeDlyHMSM()函数也会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。

任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时(参看,恢复延时的任务OSTimeDlyResume()),它就会马上处于就绪态。

同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。

程序清单所示的是OSTimeDlyHMSM()的代码。

从中可以看出,应用程序是通过用小时、分、秒和毫秒指定延时来调用该函数的。

在实际应用中,用户应避免使任务延时过长的时间,因为从任务中获得一些反馈行为(如减少计数器,清除LED等等)经常是很不错的事。

但是,如果用户确实需要延时长时间的话,μC/OS-Ⅱ可以将任务延时长达256个小时(接近11天)。

OSTimeDlyHMSM()一开始先要检验用户是否为参数定义了有效的值[(1)]。

与OSTimeDly()一样,即使用户没有定义延时,OSTimeDlyHMSM()也是存在的[(9)]。

因为μC/OS-Ⅱ只知道节拍,所以节拍总数是从指定的时间中计算出来的[(3)]。

很明显,程序清单中的程序并不是十分有效的。

笔者只是用这种方法告诉大家一个公式,这样用户就可以知道怎样计算总的节拍数了。

真正有意义的只是OS_TICKS_PER_SEC。

[(3)]决定了最接近需要延迟的时间的时钟节拍总数。

500/OS_TICKS_PER_SECOND的值基本上与个节拍对应的毫秒数相同。

例如,若将时钟频率(OS_TICKS_PER_SEC)设置成100Hz(10ms),4ms的延时不会产生任何延时!而5ms的延时就等于延时10ms。

μC/OS-Ⅱ支持的延时最长为65,535个节拍。

要想支持更长时间的延时,如(2)所示,OSTimeDlyHMSM()确定了用户想延时多少次超过65,535个节拍的数目[(4)]和剩下的节拍数[(5)]。

例如,若OS_TICKS_PER_SEC的值为100,用户想延时15分钟,则OSTimeDlyHMSM()会延时15x60x100=90,000个时钟。

这个延时会被分割成两次32,768个节拍的延时(因为用户只能延时65,535个节拍而不是65536个节拍)和一次24,464个节拍的延时。

在这种情况下,OSTimeDlyHMSM()首先考虑剩下的节拍,然后是超过65,535的节拍数[(7)和(8)](即两个32,768个节拍延时)。

程序清单 L OSTimeDlyHMSM().INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli){INT32U ticks;INT16U loops;if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) { (1)if (minutes > 59) {return (OS_TIME_INVALID_MINUTES);}if (seconds > 59) {return (OS_TIME_INVALID_SECONDS);}If (milli > 999) {return (OS_TIME_INVALID_MILLI);}ticks = (INT32U)hours * 3600L * OS_TICKS_PER_SEC (2)+ (INT32U)minutes * 60L * OS_TICKS_PER_SEC+ (INT32U)seconds * OS_TICKS_PER_SEC+ OS_TICKS_PER_SEC * ((INT32U)milli+ 500L/OS_TICKS_PER_SEC) / 1000L; (3)loops = ticks / 65536L; (4)ticks = ticks % 65536L; (5)OSTimeDly(ticks); (6)while (loops > 0) { (7)OSTimeDly(32768); (8)OSTimeDly(32768);loops--;}return (OS_NO_ERR);} else {return (OS_TIME_ZERO_DLY); (9)}}由于OSTimeDlyHMSM()的具体实现方法,用户不能结束延时调用OSTimeDlyHMSM()要求延时超过65535个节拍的任务。

换句话说,如果时钟节拍的频率是100Hz,用户不能让调用OSTimeDlyHMSM(0,10,55,350)或更长延迟时间的任务结束延时。

5.2让处在延时期的任务结束延时,OSTimeDlyResume()μC/OS-Ⅱ允许用户结束延时正处于延时期的任务。

延时的任务可以不等待延时期满,而是通过其它任务取消延时来使自己处于就绪态。

这可以通过调用OSTimeDlyResume()和指定要恢复的任务的优先级来完成。

实际上,OSTimeDlyResume()也可以唤醒正在等待事件(参看第六章——任务间的通讯和同步)的任务,虽然这一点并没有提到过。

在这种情况下,等待事件发生的任务会考虑是否终止等待事件。

OSTimeDlyResume()的代码如程序清单所示,它首先要确保指定的任务优先级有效 [(1)]。

接着,OSTimeDlyResume()要确认要结束延时的任务是确实存在的[(2)]。

如果任务存在,OSTimeDlyResume()会检验任务是否在等待延时期满[(3)]。

只要OS_TCB域中的OSTCBDly包含非0值就表明任务正在等待延时期满,因为任务调用了OSTimeDly(),OSTimeDlyHMSM()或其它在第六章中所描述的PEND函数。

然后延时就可以通过强制命令OSTCBDly为0来取消[(4)]。

延时的任务有可能已被挂起了,这样的话,任务只有在没有被挂起的情况下才能处于就绪状态[(5)]。

相关文档
最新文档