UC/OS
猪的忧伤
时间不止,生命不息,学习不懈。
展开
-
UC/OS II事件管理(2)之信号量管理
信号量在资源互斥共享 任务同步与通信中有着广泛的应用。信号量也是事件中的种,信号量的函数实现在ucos的os_sem.c文件中。信号量是一个非负整数,当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用。当进程不再使用一个信号量控制的共享资源时,信号量的值+1,当进程成功请求到一个信号的时候原创 2015-09-09 17:23:33 · 1698 阅读 · 0 评论 -
UC/OS II 系统时钟
UCOS是一个实时的多任务任务基于优先级的操作系统,要运行多任务的话,在启动多任务之后,需要在每隔一段时间(一个滴答)内进行任务调度和相关数据的更新,以确保满足运行要求的最高优先级任务以便在下一次任务调度切换的时候能够得到一个及时的响应。这个时间间隔是由时间中断来实现,而且每个中断的中断函数需要对相关的数据进行一个周期性更新。在STM32中时间的中断由SysTick定时器(是cortexM原创 2015-09-05 12:45:44 · 3283 阅读 · 0 评论 -
UC/OS II 任务管理(6)之多任务启动
在之前的代码中看到很多地方都用到OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()这两个函数。而且这两个函数总是成对的出现。现在解释一下。这对函数实现的就是类似于原子操作的功能,在两个函数之间的代码部分再执行期间不会被中断或者是被其他任务抢占,会一次性执行完成。如何实现这功能的,就是通过开关总中断来实现的,OS_ENTER_CRITICAL() 在关掉中断之后,任原创 2015-09-05 16:13:11 · 1295 阅读 · 0 评论 -
UC/OS II 事件标志组管理(二)
事件标志组管理由9个函数实现,下面的8函数加上之前的初始化函数,其代码定义在os_flag.c中。1:创建事件标志组OSFlagCreate创建事件标志组函数OSFlagCreate主要功能为从空闲链表中去一块时间标志组控制块,进行一些属性的设置。其函数原型为:OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags,INT8U *perr)原创 2015-09-18 16:40:04 · 4484 阅读 · 0 评论 -
UC/OS II 事件标志组管理(一)
如果任务要等待多个事情的发生,或多个事情中的某一个发生,那么就应该采用事件标志组管理。1:事件标志组数据结构事件标志组的主要数据结构包括事件标志组、事件标志节点、事件标志组实体、链表等。事件标志组OS_FLAG_GRP事件标志组控制块是事件的最重要的数据结构之一,其定义如下所示。typedef struct os_flag_grp {原创 2015-09-14 22:20:03 · 3062 阅读 · 0 评论 -
UC/OS II 消息邮箱
消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。通常该指针指向一个包含了“消息”的特定数据结构。如果该指针为空,说明邮箱是为空,若该指针不为空,则该邮箱是满。消息邮箱才用的数据结构是ECB(事件控制块)。每隔消息邮箱的可以容纳的消息数目是为1。 消息邮箱的管理函数主要有7个。在os_mbox.c中定义。1:消息邮箱创建原创 2015-09-20 10:56:44 · 1733 阅读 · 0 评论 -
UC/OS II 消息队列
消息邮箱只能保存一条消息,消息队列没有这一局限,可以容纳多条信息队列,按照先进先出(FIFO)的原则发送和接受消息。消息队列的实体不是操作系统提供的,而是由用户任务提供的。操作系统提供的是对其进行管理的程序。1:消息队列的数据结构消息队列的数据结构主要包括消息队列、消息队列控制块(QCB)、消息队列控制块数组、空闲链表、事件控制块(ECB)等。消息队列的数据结构定义为一个指原创 2015-09-21 09:43:46 · 1983 阅读 · 0 评论 -
UC/OS II消息队列管理实例
实例描述:平台:MDK4.7+UCOSII+STM32F103系统移植:http://blog.csdn.net/mcu_tian/article/details/48224361UCOS II消息队列管理实例工程:http://download.csdn.net/detail/mcu_tian/9164937该工程实例除了使用消息队列的实例之外,还有在APP文原创 2015-10-09 09:49:16 · 1339 阅读 · 0 评论 -
UC/OS II 内存管理
COSII 采用的是固定分区的方式管理内存。将连续大块的内存按分区来管理,每个系统中若干个这样的分区,每个分区中又有若干个大小相同的内存块。在进行内存分配的时候,根据需求从分区中得到几个内存块。而在释放的时候,内存块又重新返回所在的分区。1:内存管理的数据结构内存管理的数据结构包括有内存控制块(MCB),空闲内存控制块链表,内存分区等。其定义如下:typedef s原创 2015-09-21 16:17:07 · 640 阅读 · 0 评论 -
UC/OS II事件管理之信号量管理实例
实例描述:平台:MDK4.7+UCOSII+STM32F103系统移植:http://blog.csdn.net/mcu_tian/article/details/48224361UC/OS II事件管理之信号量管理实例工程:任务A、任务B、任务C 3个任务 这3个任务都需要访问资源R,允许2个任务同时访问R,信号量设置为2。三个任务的优先级分别为 9、8、 7。原创 2015-09-13 12:59:56 · 977 阅读 · 0 评论 -
UC/OS II事件管理(3)之互斥信号量管理
当我们使用独占资源的时候,该资源只能提供给一个任务访问,例如说串口,USB、IO、定时器等,这个时候我们就要用到互斥信号量了。互斥信号量时信号量的一个特例,信号量的计数值只能为0和1。但是互斥信号量和信号量之间还是有区别的。互斥信号量需要解决优先级反转的问题。由于UCOSII是优先级实时系统,所以必须要保证优先级高的任务能够尽快执行。所谓优先级反转就是指低优先级占有着资原创 2015-09-10 23:31:18 · 5495 阅读 · 0 评论 -
UC/OS II 任务管理(4)之任务创建
任务的创建函数ucosii之前的版本都只支持64个任务,但是V2.90版本支持的任务数量达到了256。用法和原理都差不多。我这里就只介绍任务数不大于64的情况。当任务大于64的时候,只需要配置相关的宏就可。在之前的统计任务和空闲任务的初始化函数中使用到了任务创建函数OSTaskCreate、OSTaskCreateExt。UCOSII任务创建函数有两个OSTaskCreate和OS原创 2015-09-05 12:33:55 · 2236 阅读 · 0 评论 -
UC/OS II事件管理(1)
ucosii支持事件,事件包括信号量、消息等机制。需要配置OS_EVENT_EN、OS_MAX_EVENTS等相关的宏。事件控制块(ECB)事件控制块(ECB)是事件管理的核心数据结构。其定义如下:typedef struct os_event { INT8U OSEventType; //事件类型,具体有信号量、消息邮箱、消息队列原创 2015-09-08 19:10:37 · 1693 阅读 · 0 评论 -
UC/OS II中断管理
如果运行任务的时候中断没有关,在中断发生的时候会停止任务的运行。转去运行中断任务。中断程序尽可能的短,越短越好。在ucosii中中断时允许嵌套的,每中断嵌套深入一层,则全局变量OSIntNesting就会加1。当系统没有中断发生,运行任务的时候,OSIntNesting = 0(之前的任务管理中,有不少源码就用到了这个全局变量来判断程序是否运行在中断环境中)。要是某个中断在运行的时候,不希望被原创 2015-09-05 16:28:22 · 859 阅读 · 0 评论 -
UC/OS II 时间管理
volatile INT32U OSTime全局变量是时间管理最重要的数据结构。volatile:注意这个关键字,禁止优化,每次要读取OSTime都必须在内存中对改变量地址取值。时间管理的函数都在os_time.c中定义时间获取和设置函数NT32U OSTimeGet (void);void OSTimeS原创 2015-09-07 15:25:42 · 986 阅读 · 0 评论 -
UCOSII移植笔记(UCOSII+STM32F103+LED)
编译环境使用的是MDK,先实现ucosii的最基本功能,可以实现任务的调度,什么信号量,邮箱,队列那些东西先不管。1:文件准备之前下载的是官方没有移植的源码,教程说只需要改一下os_cpu.h,os_cpu_a.asm 和os_cpu_c.c 就可以了,但是一看源码中就是少了几个文件。未移植的源码文件列表如下图所示。后来查了一些资料,原来别人用的是官方移植好的案例。原创 2015-09-05 13:10:28 · 7501 阅读 · 0 评论 -
UC/OS II任务管理(1)之任务控制块
任务状态UCOSII任务状态一共有睡眠、就绪、阻塞、运行、以及中断挂起五种状态。睡眠态(Dormant):任务已经在内存中装入,但是还没有进行任务运行的所需要的条件。就绪态(Ready):是任务已经做好运行的一切准备了,就只差调度程序调度,将CPU让给运行。阻塞态(Waiting):当任务因为需要某些资源或条件,得不到满足的时候,或者是任务需要等待一定的时间的时候,任务设置为阻塞态原创 2015-09-04 21:24:09 · 2521 阅读 · 0 评论 -
UC/OS II 任务管理(5)之任务删除、阻塞和恢复
任务的删除 任务的删除就是任务创建的逆过程,需要将就绪组,就绪表、就绪组中将该任务优先级的标志清零。将对应的TCB的任务控制块从就绪链表中移除,转移到空闲链表。 和任务创建一样,任务的删除也需要进行一些检查,看任务是否符合被删除的条件。具体的删除过程看任务的删除函数。1:任务删除函数INT8U OSTaskDel (INT8U prio) 其函数代码如下原创 2015-09-05 12:40:13 · 1168 阅读 · 0 评论 -
UC/OS II 任务管理(3)之初始化
析完跟任务管理相关的数据结构之后,我们就开始了解跟任务相关的函数了,以及函数之间的关系结构了。从顶层往底层依此分析,这样可以让思路更加清晰,更加好理解。1: void OSInit (void) (os_core.c )在UCOS系统正式运行之前,我们需要对该系统进行初始化,包括重要的数据结构,创建空闲任务,统计任务等系统任务。这里我们只分析对于该函数里面关于任务管理的原创 2015-09-05 12:23:50 · 1034 阅读 · 0 评论 -
UC/OS II 任务管理(2)之就绪表和就绪组
就绪表和就绪组ucosii内核在进行任务调度的时候,必须查找就绪任务中最高优先级的任务。ucosii采用的就绪表和就绪组的位图算法。该方法无论有多少就绪任务,每次查找到就绪任务的时间是确定的。ucosii的具体方法是定义了两张位图表(以下代码都在ucosii.h中)#define OS_LOWEST_PRIO 63 (os_cfg.h)#define OS_RDY原创 2015-09-04 22:56:48 · 1973 阅读 · 0 评论 -
UC/OS II 软件定时器
转载出处:http://www.openedv.com/posts/list/15061.htmUCOSII从V2.83版本以后,加入了软件定时器,这使得UCOSII的功能更加完善,在其上的应用程序开发与移植也更加方便。在实时操作系统中一个好的软件定时器实现要求有较高的精度、较小的处理器开销,且占用较少的存储器资源。通过前面的学习,我们知道UCOSII通过OSTimTick转载 2015-09-21 20:26:56 · 1876 阅读 · 0 评论