![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
uC/OS-III
linuxweiyh
这个作者很懒,什么都没留下…
展开
-
uC/OS-III之资源管理
1.最常用的独占共享资源和创建临界区的方法有4种:关中断、禁止任务调度、使用信号量、使用互斥型信号量。 一般推荐使用互斥信号量。 在访问数据量极少的时候可以使用关中断的方式。2.关中断/开中断 (1)在使用关中断/开中断时,必须先调用宏CPU_SR_ALLOC()。它的作用是分配存储空间来存储当前CPU的中断状态。 (2)关中断/开中断属于CPU相关的函数,所以它们的定义位于cpu.h中,3原创 2017-05-26 17:32:42 · 2988 阅读 · 0 评论 -
uC/OS-III之学习总结
1.uC/OS-III系统的三大表:任务就绪表、时钟节拍轮、任务挂起表。任务控制块OS_TCB就是在这三张表中轮转。原创 2017-05-25 15:24:20 · 474 阅读 · 0 评论 -
uC/OS-III之信号量
1.信号量更多的被用于实现任务间的同步以及任务和ISR间的同步。2.信号量的数据结构类型为OS_SEM,它的定义位于os.h中。typedef struct os_sem OS_SEM; // 631行struct os_sem { // 858行 -原创 2017-06-05 10:12:16 · 854 阅读 · 0 评论 -
uC/OS-III的任务管理
uC/OS-III的任务管理欢迎进入linuxweiyh的博客。。。1.多任务管理就是在多个任务间调度和切换CPU使用权的过程。2.任务的类型有两种:运行至完成型和无限循环型。 注:嵌入式系统一般使用的是无限循环类型的任务。在无限循环类型的任务中必须调用某个uC/OS-III服务函数,使该任务进入等待某个事件的状态。3.任务的创建参考另一篇文章《uC/OS-III任务创建函数》4.有关任务优先级的原创 2017-05-18 18:49:31 · 848 阅读 · 0 评论 -
uC/OS-III之任务信号量
1.给任务发布信号量是一种非常常用的同步方法,因此,在uC/OS-III中,每个任务都有它自己的内嵌信号量。2.当创建任务时,任务信号量会被自动创建,且初始计数为零。3.等待任务信号量使用函数OSTaskSemPend(),它的定义位于os_task.c中。OS_SEM_CTR OSTaskSemPend (OS_TICK timeout, // 1190行 -原创 2017-06-07 10:50:10 · 2618 阅读 · 0 评论 -
uC/OS-III之资源管理--互斥型信号量
1.uC/OS-III支持一种特殊的二进制信号量–互斥型信号量。2.互斥型信号量通过安全优先级继承机制(一旦一个具有高优先级的任务H想要访问共享资源,占有该资源的任务的优先级将被提升至与任务H一样),来避免无界优先级翻转的问题。3.互斥型信号量是一种被定义为OS_MUTEX数据类型的内核对象,它的定义位于os.h中。 注:与信号量一样,只有任务才能使用互斥型信号量(中断服务程序不可以)。typed原创 2017-06-02 17:37:37 · 1962 阅读 · 0 评论 -
uC/OS-III之事件标志组
1.当任务需要与多个事件的发生同步时,可以使用事件标志组。 等待多个事件时,任何一个事件发生,任务都被同步,这种同步机制称为“或”同步(逻辑“或运算”); 当所有事件都发生时,任务才被同步,这种同步机制被称为“与”同步(逻辑“与”运算)。2.使用事件标志组前需要先配置事件标志组相关的宏定义,它们的定义位于os_cfg.h中#define OS_CFG_FLAG_EN原创 2017-06-07 11:38:20 · 682 阅读 · 0 评论 -
uC/OS-III之任务同步
1.uC/OS-III中有关任务的同步指的是 中断服务程序(ISR)和任务间的同步 以及 任务和任务间的同步。2.uC/OS-III中有两种同步机制:信号量和事件标志。3.信号量 (1)使用信号量时要注意的是任务可以调用所有的信号量相关函数,但是ISR只能调用OSSemPost()函数。 (2)信号量用作单相同步 (3)信号量用作信用记录 (4)多个任务等待同一个信号量原创 2017-06-05 10:37:56 · 518 阅读 · 0 评论 -
uC/OS-III之任务挂起表
1.任务挂起表与就绪表十分相似,只不过就绪表记录的是出于就绪态的任务,任务挂起表记录的是等待某个内核对象的任务,比如任务等待信号量、互斥型信号量、事件标志组或消息队列等。2.在任务挂起表中,任务是按照优先级排序的,即高优先级的任务放在该表的前面,低优先级的任务放在表的后面。3.任务挂起表是一个类型为OS_PEND_LIST的数据结构,它的定义位于os.h中。typedef struct os_p原创 2017-06-02 18:16:56 · 604 阅读 · 0 评论 -
uC/OS-III之等待多个内核对象
1.uC/OS-III既可以等待一个内核对象,也可以同时等待多个内核对象。然而,uC/OS-III仅允许任务同时等待多个信号量或多个消息队列。换言之,uC/OS-III不支持同时等待多个事件标志组或互斥信号量。原创 2017-06-05 09:52:53 · 357 阅读 · 0 评论 -
uC/OS-III任务创建函数OSTaskCreate()
uC/OS-III任务创建函数OSTaskCreate()1.OSTaskCreate()函数原型void TaskCreate(OS_TCB *p_tcb, // 任务控制OS_TCB的地址CPU_CHAR *p_name, // 任务的名字OS_TASK_PTR p_task, // 任务代码的起始地址void *p_arg, // 任务第一次运行时接收到原创 2017-05-17 19:16:37 · 4730 阅读 · 0 评论 -
uC/OS-III之任务就绪表学习总结
1.任务就绪表包含两部分:一个就绪优先级位映射表OSPrioTbl[],用来标明哪个优先级下有任务就绪;一个就绪任务列表OSRdyList[],其中包含指向各个就绪任务的指针。2.就绪优先级位映射表OSPrioTbl[] // 就绪优先级位映射表的大小#define OS_PRIO_TBL_SIZE原创 2017-05-23 16:43:59 · 1125 阅读 · 0 评论 -
uC/OS-III之任务调度总结
1.任务调度 任务调度,简单的理解就是确定下一个要执行的任务。uC/OS-III中的任务调度通过任务调度器实现。uC/OS-III是一个可剥夺型的、基于优先级的内核。2.调度点 任务调度,说白了其实就是在某些时刻进行任务的调度,这些调度的时刻称为调度点。 在uC/OS-III中的任务调度点有以下几种: (1)任务释放信号量或给另一个任务或向另一个任务发消息 (2)任务调用延时函数OSTim原创 2017-05-24 11:23:44 · 1761 阅读 · 0 评论 -
uC/OS-III之任务切换学习总结
1.当uC/OS-III需要切换到另外一个任务时,它将保存当前任务的现场到当前任务的堆栈中,主要是CPU相关的寄存器,然后恢复新任务的现场并执行新任务。这个过程叫做任务切换2.由任务调度可知,任务级调度OSSched()中调用OS_TASK_SW()实现任务的切换,而中断级调度OSIntExit()中调用OSIntCtxSw()实现任务的切换。 在os_cpu.h文件中有如下定义// 0xE000原创 2017-05-24 17:38:19 · 870 阅读 · 0 评论 -
uC/OS-III之临界段代码学习总结
1.临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段。在uC/OS-III中存在大量的临界段代码。2.中断处理程序和任务都会访问的临界段代码,需要使用关中断的方法加以保护;仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。3.在uC/OS-III中,使用宏OS_CRITICAL_ENTER()进入临界区;使用宏OS_CRITICAL_EXIT()和OS_CRITICAL原创 2017-05-25 11:55:14 · 3235 阅读 · 0 评论 -
uC/OS-III之中断管理总结
1.uC/OS-III对从中断发布消息或信号的处理有两种模式:直接发布和延迟发布。 在文件os_cfg.h中,将OS_CFG_ISR_POST_DEFERRED_EN设置成0,使用直接发布模式;设置成1,则使用延迟发布模式。2.直接发布模式使用关闭中断的方式来保护临界段代码。3.延时发布模式通过给调度器上锁的方式来保护临界段代码。4.延时发布模式与直接发布模式相比,主要是减少了关闭中断的时间,因而原创 2017-05-25 09:23:34 · 1304 阅读 · 0 评论 -
uC/OS-III之时钟节拍列表
1.时钟节拍列表由一个时钟节拍轮(,见os_cfg_app.c中的OSCfg_TickWheel[])和一个计数器OSTickCtr构成。2.时钟节拍轮是一个数组,其中数组的元素的类型为OS_TICK_SPOKE,它的大小由OS_CFG_TICK_WHEEL_SIZE设定。 建议OS_CFG_TICK_WHEEL_SIZE的大小为任务数目的1/4左右,不要把它的值与时钟节拍的频率成倍数关系,最好为原创 2017-05-25 16:12:44 · 1503 阅读 · 0 评论 -
uC/OS-III之时间管理
1.uC/OS-III的时间管理函数的主要工作是改变当前任务的状态,把任务添加到时钟节拍轮中,同时把任务从任务就绪表中删除,最后执行调度程序。2.OSTimeDly()函数 OSTimeDly()函数的源代码位于os_time.c文件,79行 - 138行void OSTimeDly (OS_TICK dly, // 延时长度 OS_OPT原创 2017-05-25 17:13:02 · 1017 阅读 · 0 评论 -
uC/OS-III之系统内部任务
1.uC/OS-III系统内部有提供了5个任务:空闲任务、时钟节拍任务、统计任务、中断服务管理任务和定时器任务。其中空闲任务和时钟节拍任务是必须创建的,而统计任务、定时器任务和中断服务管理任务是可选的。2.空闲任务(OS_IdleTask()、os_core.c) 空闲任务是系统必须创建的。当其他所有的任务都未就绪时,就需要运行它。 (1)优先级–它的优先级比较特殊,总是设置为OS_CFG_PR原创 2017-05-23 14:40:29 · 1400 阅读 · 0 评论 -
uC/OS-III之定时器管理
1.所谓定时器本质上是递减计数器,当计数器减到零时可以出发某种动作的执行。这种动作可以通过回调函数(callback funtion,简称回调)来实现。需要注意的是,一定要避免在回调函数中使用阻塞调用。 注:定时器在一些协议栈的实现中很有用,也可以用来定期轮训IO设备。2.定时器任务的频率通过宏定义OS_CFG_TMR_TASK_RATE_HZ来实现,单位是Hz。 该宏定义位于文件os_cfg_原创 2017-05-26 14:59:29 · 1036 阅读 · 1 评论 -
uC/OS-III之消息传递
1.一个任务或者中断服务程序有时候需要和另一个任务交流信息,这个信息传递的过程被称为任务间的通信。 任务间的消息传递可以通过两种途径来实现:一是通过全局变量,二是通过发布消息。 注1:任务要想与中断服务程序通信,只能通过全部变量。 注2:当有多个任务在等待消息的时候,可以使用外部的消息队列;而如果只有一个任务需要对接收的数据进行处理,则应该使用内部消息队列。2.消息 (1)一则消息包含几个部原创 2017-06-07 16:41:41 · 549 阅读 · 0 评论