FreeRtos
文章平均质量分 89
知无止境
这个作者很懒,什么都没留下…
展开
-
FreeRtos源码分析之消息队列工作原理(九)
一、消息队列API函数xQueueCreate( uxQueueLength, uxItemSize );xQueueSend( xQueue, pvItemToQueue, xTicksToWait );BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );xQueueCreate 创建一个消息队列,队列中有uxQueueLength个元素,每个元素大小为ux原创 2021-03-04 20:57:39 · 834 阅读 · 1 评论 -
FreeRtos源码分析之任务挂起和恢复(八)
一、概述任务的挂起和进入临界区的功能类似,进入临界区通过直接操作硬件寄存器屏蔽中断来禁止任务切换,任务的挂起则是通过纯软件的方式来实现禁止任务切换的功能。二、任务挂起和恢复的原理FreeRtos使用uxSchedulerSuspended变量来表示内核调度器的打开和关闭,当这个值大于0时,内核调度器打开,等于0时内核调度器关闭。我们可以在FreeRtos的Systick中断xTaskIncrementTick中比较清晰的理解这个变量的含义。xTaskIncrementTick函数的部分代码如下:Ba原创 2021-02-23 16:36:20 · 666 阅读 · 1 评论 -
FreeRtos源码分析之临界区(七)
一、概述FreeRtos临界区的作用是保证位于临界区内的代码在执行过程中不被其它中断或者任务打断。临界区的作用类似于互斥锁,不同的是临界区是通过直接操作寄存器来屏蔽中断,而互斥锁只是通过软件来实现对共享资源的保护。二、BASEPRI寄存器FreeRtos通过直接操作CortexM4或者CortexM3的BASEPRI寄存器来屏蔽中断。BASEPRI的作用是屏蔽优先级不高于某个具体数值的中断。当它被设置为某个值时,所有优先级值大于等于这个数值的中断都会被关闭(优先级号越大,优先级越低)。若被设置为0,则原创 2021-02-19 18:15:14 · 2610 阅读 · 0 评论 -
FreeRtos源码分析之任务通知xTaskNotify(六)
一、概述任务通知功能是FreeRtosV8.2.0版本推出的全新功能。任务通知在某些场景下可以代替二值信号量、计数信号量、事件组甚至是消息队列。任务通知功能和信号量、消息队列相比速度更快,占用的RAM也更少。但是任务通知功能也有它的局限性:任务通知消息能从中断发给任务或者从任务发给任务,但是不能从任务发给中断;任务通知消息只能发送给某个特定的任务,无法发送给多个任务;任务通知的消息一次只能保持一个值,无法向队列那样存储多个消息;消息对列或者信号量的发送可以阻塞等待,直到上一条消息被接收端处理,原创 2021-02-02 17:51:40 · 4454 阅读 · 0 评论 -
FreeRtos源码分析之vTaskList和vTaskGetRunTimeStats等调试函数(五)
一、概述在使用FreeRtos进行开发的过程中,我们通常需要了解系统的运行状态、内存、CPU使用情况等信息,来确保系统能够长期稳定的运行。FreeRtos提供了许多这样的接口,我们也可以通过阅读FreeRtos相关的源代码自己编写需要的Debug接口。通常我们需要用到的一些系统信息为:当前任务的剩余内存;当前任务历史最小内存;系统总的剩余内存;系统运行的总时间;单个任务的运行时间;每个任务占用的CPU时间;二、获取系统信息的相关函数2.1、vTaskList函数原型:void vT原创 2021-02-01 22:53:29 · 1989 阅读 · 0 评论 -
FreeRtos源码分析之任务切换原理(四)
一、CortexM3中断优先级CortexM3支持多达240个外部中断和16个内部中断,每一个中断都对应一个中断都对应一个优先级寄存器。每一个优先级寄存器占用8位,STM32采用其中的高四位来表示优先级,低四位不可用。FreeRtos一共会使用到三种中断:SysTick、SVC、PendSV。SVC在启动任务调度的时候使用;SysTIck定时器用于周期性的中断,为系统提供心跳;PendSV用于任务切换;对于实时操作系统而言,我们一般外部中断优先得到响应,所以SysTick和PendSV的原创 2021-01-26 19:05:02 · 855 阅读 · 1 评论 -
FreeRtos源码分析之任务创建和管理(一)
一、任务控制块TCB在开始学习FreeRtos任务相关源码之前,我们需要先了解一个重要的结构体-任务控制块。FreeRtos的每一个任务都有一个独立的任务控制块TCB,TCB中记录了任务的优先级、名称、栈地址等内容,是FreeRtos任务管理最重要的一个结构体。这里不讨论mpu和newlib相关的内容。TCB结构体如下:typedef struct tskTaskControlBlock /* The old naming convention is used to prevent brea原创 2021-01-13 13:23:20 · 542 阅读 · 0 评论 -
FreeRtos源码分析之任务状态管理(三)
一、概述FreeRtos的每一个任务都有一个对应的优先级,较高优先级的任务具有优先运行的权利,当高优先级的任务调用系统的延时函数或者需要阻塞等待某些信号时,会让出CPU的使用权,从而使低优先级的任务得以运行。FreeRtos支持抢占式调度,当低优先级的任务正在运行时,如果有高优先级的任务处于就绪状态,系统优先运行高优先级的任务。如果两个或者多个任务具有相同的优先级,这些任务会轮换运行,并且它们会占用相同的时间片。FreeRtos有两种切换任务的方式,一种是让内核自己按照约定好的规则进行切换,一种是调原创 2021-01-23 11:20:22 · 438 阅读 · 1 评论 -
FreeRtos源码分析之启动任务调度vTaskStartScheduler(二)
一、概述FreeRtos在创建任务之后,需要启动任务调度器才能使任务正常有序的运行。任务调度器的开启依赖于底层硬件,对于CortexM3内核而言,任务调度器需要用到中断和滴答定时器。FreeRtos在对中断优先级、空闲任务等进行初始化之后,会开启滴答定时器的中断,这样每隔1毫秒系统就会进入滴答定时器中断,FreeRtos会在这个中断中进行诸如记录系统运行时间、查找下一个就绪态任务等操作。换句话说,滴答定时器就是FreeRtos的心脏。FreeRtos任务调度需要用到CortexM3和汇编知识,可以结合C原创 2021-01-20 10:47:23 · 1852 阅读 · 0 评论