
FreeRTOS
凯家勇士
这个作者很懒,什么都没留下…
展开
-
FreeRTOS学习笔记(18)---- 空闲任务分析
空闲任务是FreeRTOS不可缺少的任务,因为FreeRTOS设计要求必须至少有一个任务处于运行状态,当RTOS调度器开始工作后,为了保证至少有一个任务在运行,空闲任务被自动创建,占用最低优先级(0优先级)空闲任务有四个特点:(1)释放那些删除自身的任务的内存(2)保证系统至少有一个任务在运行(3)在空闲任务中处理一些事件(4)使用抢占式内核调度时,当有用户任务处于空闲优先级时,空闲任务立即让出CPU参考:https://blog.youkuaiyun.com/qq_27114397/article/det转载 2020-07-15 18:29:36 · 490 阅读 · 0 评论 -
FreeRTOS学习笔记(17)---- FreeRTOS 任务通知分析
任务通知和对列不同,它的数据结构嵌在任务TCB中的,并且数据结构十分简单,涉及到任务TCB的两个字段:volatile uint32_t ulNotifiedValue; /*任务通知值*/ volatile uint8_t ucNotifyState; /*任务通知状态,标识任务是否在等待通知等*/任务通知的优点:(1)RAM消耗少(2)由于任务通知的数据结构包含在任务TCB中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用缺点:(1)只能有一个任务接收通知事件。(2)转载 2020-07-15 17:48:12 · 153 阅读 · 0 评论 -
FreeRTOS学习笔记(16)---- 队列分析
一、队列创建队列创建函数xQueueCreate()实际上使用xQueueGenericCreate()函数来创建#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )xQueueGenericCreate()精简代码QueueHandle_t xQueueGenericCreate( co原创 2020-07-15 16:07:36 · 834 阅读 · 0 评论 -
FreeRTOS学习笔记(15)---- FreeRTOS 任务切换分析
FreeRTOS 任务切换FreeRTOS 有两种方法触发任务切换:(1)执行系统调用,比如普通任务可以使用 taskYIELD() 强制任务切换,中断服务程序中使用 portYIELD_FROM_ISR() 强制任务切换;(2)系统节拍时钟中断这两种方法的实质是一样的,都会使能一个 PendSV 中断,在 PendSV 中断服务程序中,找到最高优先级的就绪任务,然后让这个任务获得 CPU 运行权,从而完成任务切换。详见参考文献:https://blog.youkuaiyun.com/qq_27114397/原创 2020-07-15 10:28:04 · 289 阅读 · 0 评论 -
FreeRTOS学习笔记(14)---- 任务删除、挂起和恢复分析
一、任务删除vTaskDelete()精简代码void vTaskDelete( TaskHandle_t xTaskToDelete ){ TCB_t *pxTCB; taskENTER_CRITICAL(); pxTCB = prvGetTCBFromHandle( xTaskToDelete );//(1) //(2) if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) {原创 2020-07-15 09:20:45 · 762 阅读 · 0 评论 -
FreeRTOS学习笔记(13)---- FreeRTOS 任务创建分析
一、xTaskCreate()精简代码BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) {TCB原创 2020-07-14 23:48:28 · 326 阅读 · 0 评论 -
FreeRTOS学习笔记(12)--- FreeRTOS 调度器启动过程分析
FreeRTOS 调度器启动过程分析调度器是 FreeRTOS 操作系统的核心,主要负责任务切换,即找出最高优先级的就绪任务,并使之获得 CPU 运行权。调度器并非自动运行的,需要人为启动它。使用 FreeRTOS,一个最基本的程序架构如下所示:int main(void){ 必要的初始化工作; 创建任务1; 创建任务2; ... vTaskStartScheduler(); /*启动调度器*/ while(1); }一、任务调度器开启函原创 2020-07-14 21:31:00 · 665 阅读 · 0 评论 -
FreeRTOS学习笔记(11)---- 内存管理
内存管理简介FreeRTOS 创建任务、队列、信号量等的时候有两种方法,一种是动态的申请所需的 RAM。一种是由用户自行定义所需的 RAM,这种方法也叫静态方法,使用静态方法的函数一般以“Static”结尾,比如任务创建函数 xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈,使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请RAM,FreeRTOS 提供了 5 种内存分配方法, FreeRTOS 使用者可以其中的某一个方法,或者原创 2020-07-14 16:53:01 · 251 阅读 · 0 评论 -
FreeRTOS学习笔记(10)---- 任务通知
任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS 定义为 1。FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。也可以更新接收任务的任务通知值,任务通知可以通过如下方法更新接收任务的通知值:● 不覆盖接收任务的通原创 2020-07-13 23:24:59 · 402 阅读 · 0 评论 -
FreeRTOS学习笔记(9)---- 事件标志组
事件位事件位用来表明某个事件是否发生, 事件位通常用作事件标志。事件组一个事件组就是一组的事件位, 事件组中的事件位通过位编号来访问。事件API函数创建事件标志组:设置事件位:获取事件标志组:等待指定的事件位实验通过按键设置两个事件位key = KEY_Scan(0); switch(key) { case KEY1_PRES: printf("bit1 set 1\r\n"); xEventGroupSetBits(EventGroupHandle, E原创 2020-07-13 22:38:18 · 273 阅读 · 0 评论 -
FreeRTOS学习笔记(8)---- 软件定时器
使用FreeRTOS软件定时器需要在文件FreeRTOSConfig.h先做如下配置1、configUSE_TIMERS 使能软件定时器2、configTIMER_TASK_PRIORITY 定时器任务优先级3、configTIMER_QUEUE_LENGTH 命令队列长度4、configTIMER_TASK_STACK_DEPTH 定时器任务堆栈大小#define configUSE_TIMERS 1 //为1时启用软件定时器#define conf原创 2020-07-13 21:46:42 · 1256 阅读 · 0 评论 -
FreeRTOS学习笔记(7)----信号量之互斥信号量、递归互斥信号量
**信号量的主要目的有两个:共享资源访问。 与任务同步。FreeRTOS中信号量分为如下几种:1、二值信号量2、计数型信号量3、互斥信号量4、递归互斥信号量**3.互斥信号量互斥信号量其实就是一个拥有优先级继承的二值信号量, 在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合。 互斥信号量适合用于那些需要互斥访问的应用中。 在互斥访问中互斥信号量相当于一个钥匙,当任务想要使用资源的时候就必须先获得这个钥匙,当使用完资源以后就必须归还这个钥匙,这样其他的任务就可以拿着这原创 2020-07-12 22:50:50 · 1186 阅读 · 0 评论 -
FreeRTOS学习笔记(6)----信号量之计数信号量
信号量的主要目的有两个:共享资源访问。 与任务同步。FreeRTOS中信号量分为如下几种:1、二值信号量2、计数型信号量3、互斥信号量4、递归互斥信号量2.计数型信号量创建计数型信号量:释放计数型信号量:获取计数型信号量:实验讲信号量初始值设为0xSemaphoreCreateCounting( 255, 10 );task1_task任务通过按键释放信号量,Dataprocess_task每隔2s获取信号量task1_task任务函数//task1_task函.原创 2020-07-12 22:17:10 · 608 阅读 · 0 评论 -
FreeRTOS学习笔记(5)---- 信号量之二值信号量
信号量的主要目的有两个:共享资源访问。 与任务同步。FreeRTOS中信号量分为如下几种:1、二值信号量2、计数型信号量3、互斥信号量4、递归互斥信号量二值信号量二值信号量其实就是一个只有一个队列项的队列二值信号量创建函数老版本常见函数vSemaphoreCreateBinary()创建之后就马上有效释放信号量:获取信号量:实验任务之间同步task1_task任务通过按键释放信号量使之有效,Dataprocess任务获取信号量,没有获取到就阻塞无限等待tas.原创 2020-07-12 21:57:40 · 555 阅读 · 0 评论 -
FreeRTOS学习笔记(4)---- 队列
队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。 由于队列用来传递消息的,所以也称为消息队列。队列操作过程图示队列长度:4队列消息:int类型队列操作函数队列创建函数队列入队函数队列出队函数实验1通过task1_task任务将按键.原创 2020-07-12 20:44:37 · 619 阅读 · 0 评论 -
FreeRTOS学习笔记(3)---- 任务运行时间统计
FreeRTOS可能通过vTaskGetRunTimeStats()来统计每个任务使用CPU的时间,以及所使用的时间占总时间的比例。#define configGENERATE_RUN_TIME_STATS 1 //为1时启用运行时间统计功能#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimerForRunTimeStats()#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOS原创 2020-07-11 15:07:30 · 2419 阅读 · 0 评论 -
FreeRTOS学习笔记(2)---- 任务的挂起与恢复
实验内容:按键任务函数key_taskvoid key_task( void * pvParameters ){ u8 key; while(1) { key = KEY_Scan(0); switch (key) { case WKUP_PRES: vTaskSuspend(Task1Task_Handler); printf("任务1挂起\r\n"); break; case KEY1_PRES: vTaskResume(Task1.原创 2020-07-11 14:33:25 · 301 阅读 · 0 评论