FreeRTOS笔记(仅供参考)

2023-05-16

文章目录

  • 1.FreeRTOS
    • 1.1.文件
    • 1.2.移植
    • 1.3.FreeRTOS的编程风格
      • 1.3.1.数据类型
      • 1.3.2.变量名
      • 1.3.3.函数名
    • 1.4.裸机&多任务系统
    • 1.5.数据结构
      • 1.5.1.链表
      • 1.5.2.双向链表
      • 1.5.3.FreeRTOS的链表
  • 2.任务
  • 2.1.创建任务
  • 临界段保护
  • 空闲任务与阻塞延时
  • 多优先级
  • 延时列表
  • 支持时间片
  • 移植
  • 创建任务
  • 任务管理
  • 消息队列
  • 信号量
  • 互斥量
  • 事件
  • 软件定时器
  • 任务通知
  • 内存管理
  • 中断管理
  • CPU使用率

1.FreeRTOS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4P4MfHnK-1657685391686)(https://www.freertos.org/a00104.html)]
ref: 野火 《FreeRTOS 内核实现与应用开发实战—基于STM32》
可在野火大学堂下载 或 下载链接

1.1.文件

FreeRTOS

  • License: 许可信息
  • Source: 源码
    • include: 头文件
    • portable: 软件到硬件驱动
      • RVDS
        • ARM_CM3: 移植所需
          FreeRTOS-Plus: 增加的功能代码

1.2.移植

  1. 原工程添加FreeRTOS文件夹
  2. \FreeRTOSv202112.00\FreeRTOS\Source的文件拷贝进去
  3. portable中删剩下Keil, MemMang, RVDS
  4. 在MDK工程添加分组和文件
    |--FreeRTOS_CORE
        |--croutine.c
        |--event_groups.c
        |--list.c
        |--queue.c
        |--tasks.c
        |--timers.c
    |--FreeRTOS_PORTABLE
        |--port.c
        |--heap_4.c
    
  5. 添加头文件路径\FreeRTOS\include\FreeRTOS\portable\RVDS\ARM_CM3
  6. 从官方历程\FreeRTOSv202112.00\FreeRTOS\Demo\CORTEX_STM32F103_Keil中找到文件FreeRTOSConfig.h,拷贝到工程目录的\FreeRTOS\include
  7. 编译

1.3.FreeRTOS的编程风格

1.3.1.数据类型

portmacro.h

  • portCHAR: char
  • portSHORT: short
  • portTickType: 定义系统时基计数器值&阻塞时间
    • unsigned short int: FreeRTOSConfig.h: configUSE_16_BIT_TICKS=1 为16位
    • unsigned int: FreeRTOSConfig.h: configUSE_16_BIT_TICKS=01 为32位
  • portBASE_TYPE: long 定义函数返回值/布尔类型: 32/16/8bit处理器–32/16/8bit数据类型

1.3.2.变量名

前缀:类型

  • c: char型
  • s: short型
  • l: long型
  • x: portBASE_TYPE型, 数据结构, 任务句柄, 队列句柄
  • u: 无符号型 uc: 无符号char
  • p: 指针变量 pc: char指针

1.3.3.函数名

前缀:哪个头文件定义

  • port: portable.h
  • task: task.h
  • pd: projdefs.h
  • config: FreeRTOSConfig.h
  • err: projdefs.h
    通用宏定义
  • pdTRUE: 1
  • pdFALSE: 0
  • pdPASS: 1
  • pdFAIL: 0

1.4.裸机&多任务系统

在这里插入图片描述

1.5.数据结构

1.5.1.链表

通过节点将离散的数据链接到一起,组成一个表,常规操作:插入&删除, 通常人为规定一个根节点(生产者),还有个节点计数器.
在这里插入图片描述

含有n个节点,前一节点有一个箭头指向后一节点,首尾相连. 节点是自定义类型的数据结构,本身含一个结点指针, 指向后一节点, 还携带一些私有信息(单个数据,数组,指针,结构体等).
单向链表

通常在节点中只包含一个用于指向下一个节点的指针,通过链表存储的数据内嵌一个节点
在这里插入图片描述

1.5.2.双向链表

两个节点指针,分别指向前后两个节点
在这里插入图片描述

链表&数组在这里插入图片描述

  • 数组:开辟一段连续内存来存储数据,有起始结束地址
  • 链表:一个圈,通常人为规定一个根节点,对节点插入/删除来实现存取数据

1.5.3.FreeRTOS的链表

链表节点数据结构定义

struct xLIST_ITEM
{
    TickType_t xItemValue; // 辅助值:帮节点做顺序排列
    struct xLIST_ITEM * pxNext; // 指向链表下一个节点
    struct xLIST_ITEM * pxPrevious; // 指向链表前一个节点
    void * pvOwner; // 指向拥有该节点的内核对象(TCB)
    void * pvContainer; // 指向该节点所在链表
};
typedef struct xLIST_ITEM ListItem_t; // 节点数据类型重定义

在这里插入图片描述

在这里插入图片描述

2.任务

2.1.创建任务

  • 任务栈: 多任务系统中,每个任务分配独立的栈空间(RAM中预定义的全局数组/动态分配的一段内存空间)
  • 任务控制块: 存有任务栈指针,名称,形参等所有信息
  • 任务创建函数: 任务栈,函数实体,控制块联系起来
    • 动态创建: 任务控制块,栈的内存是创建任务时动态分配,删除时内存释放
    • 静态创建: 控制块,栈的内存事先定义好,为静态内存,删除时不释放
TaskHandle_t Task1_Handle;  //  任务句柄
#define TASK1_STACK_SIZE                    128 //  任务栈大小
StackType_t Task1Stack[TASK1_STACK_SIZE]; //  任务栈
TCB_t Task1TCB; //  任务控制块
Task1_Handle = xTaskCreateStatic( (TaskFunction_t)Task1_Entry,   /* 任务入口 */
                                  (char *)"Task1",               /* 任务名称,字符串形式 */
                                  (uint32_t)TASK1_STACK_SIZE ,   /* 任务栈大小,单位为字 */
                                  (void *) NULL,                 /* 任务形参 */
                                  (UBaseType_t) 2,               /* 任务优先级,数值越大,优先级越高 */
                                  (StackType_t *)Task1Stack,     /* 任务栈起始地址 */
                                  (TCB_t *)&Task1TCB );   

临界段保护

  • 临界段: 执行时不能被中断的代码段 (操作全局变量)

空闲任务与阻塞延时

  • RTOS的延时: 阻塞延时
  • 空闲任务: 启动调度器时创建的优先级最低的任务
  • 阻塞延时: 调用时任务被剥离cpu使用权, 进入阻塞状态, 可去执行其他任务(若也阻塞, 运行空闲任务)

FreeRTOSConfig.h决定SysTick的中断周期

#define configCPU_CLOCK_HZ			( ( unsigned long ) 25000000 )	
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )

vTaskDelay( 1 );

多优先级

  • 就绪列表pxReadyTasksLists[configMAX_PRIORITIES]数组存储就绪任务的TCB(的xStateListItem节点), 数组下标越小, 任务优先级越低
  • 创建任务时根据任务优先级将任务插入到就绪列表不同位置, 同优先级插入同一条链表
  • pxCurrenTCB: 全局TCB指针, 任务切换时指向优先级最高的就绪任务TCB
  • taskSELECT_HIGHEST_PRIORITY_TASK
taskSELECT_HIGHEST_PRIORITY_TASK() // 寻找优先级最高的就绪任务 (更新`uxTopReadyPriority`和`pxCurrentTCB`的值)
taskRESET_READY_PRIORITY( uxPriority )  //  将变量uxTopReadyPriority某个位清0
// 实现任务延时列表后, 任务非就绪时, 清零uxTopReadyPriority对应位, 将任务从就绪列表删除

延时列表

  • 任务需要延时时,将任务挂起, 从就绪列表删除, 插入延时列表, 更新下一个任务解锁时刻变量xNextTaskUnblockTime
  • xNextTaskUnblockTime = 时基计数器值xTickCount + 任务延时xTickToDelay
    • 每次时基中断来, 比较xTickCount xNextTaskUnblockTime

支持时间片

  • 同一优先级下多个任务, 每个任务轮流享有相同CPU时间

移植

  • 配置FreeRTOSConfig.h
    #include "stm32f10x.h"  //  
    #include "bsp_usart.h"  //  断言操作需要打印
    
    #define xPortPendSVHandler PendSV_Handler // 中断服务函数配置相关
    #define vPortSVCHandler SVC_Handler
    
  • 配置stm32f10x_it.c
    //systick 中断服务函数 
    void SysTick_Handler(void) 
    { 
    #if (INCLUDE_xTaskGetSchedulerState == 1 ) 
        if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
    #endif /* INCLUDE_xTaskGetSchedulerState */ 
            xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState == 1 ) 
        }
    #endif /* INCLUDE_xTaskGetSchedulerState */
    }
    

创建任务

  1. 板级初始化
  2. 定义任务函数
  3. 实现空闲任务, 定时器任务堆栈函数
  4. 定义任务栈
  5. 定义任务控制块
  6. 创建静态任务
  7. 启动任务

任务管理

  • 任务: 竞争系统资源的最小运行单元
    • FreeRTOS的任务可认为是一系列独立任务集合, 每个任务在自己环境中运行, 同一时刻一个任务运行(调度器决定启动停止, 切入切出保存上下文环境), 宏观上每个任务都在执行, 系统可用SRAM决定能运行多少任务
    • 抢占式调度机制: 高优先级任务可打断低优先级任务, 低优先级任务必须在高优先级任务阻塞/结束才能得到调度
  • 任务调度器: 基于优先级的全抢占式调度
    • 中断处理函数, 调度器上锁部分, 禁止中断 不可抢占, 其他部分可抢占
    • 同优先级采用时间片轮转方式调度, 最大可能保证高优先级任务得以运行
  • 任务状态迁移
    • 在这里插入图片描述
    • 就绪态: 任务准备就绪, 等调度器进行调度, 有更高优先级任务创建/恢复, 原运行任务->就绪态
    • 运行态: 任务切换时, 就绪列表的最高优先级任务被执行, 选择运行的永远是最高优先级的就绪态任务
    • 阻塞态: 运行任务发生阻塞(被挂起,延时,等待信号量), 任务退出就绪列表, 切换任务
    • 挂起态: 通过vTaskSuspend()将处于任何状态的任务挂起, 挂起后无cpu使用权, 不参与调度, 用vTaskResume()解除
      • vTaskSuspend()任务挂起函数
      • vTaskResume()任务恢复函数
      • xTaskResumeFromISR()恢复被挂起的任务(中断)
      • vTaskSuspendAll()挂起调度器, 相当于挂起所有任务
      • xTaskResumeAll()恢复调度器, 用多少次挂起要用多少次恢复
  • 函数
    • vTaskDelete()任务删除函数
    • vTaskDelay()相对任务延时函数, 不适用于周期性执行任务的场合
    • vTaskDelayUntil()绝对延时函数, 实现固定频率定期执行任务

消息队列

  • 消息队列: 常用于任务间通信的数据结构
    • 可在任务与任务间中断和任务间传递信息, 实现任务接受来自其他任务/中断的不定长消息
    • 任务可从队列读取消息, 空消息时该任务阻塞
      • 阻塞任务时间xTicksToWait, 若队列空, 任务保持阻塞态以等待队列数据有效
      • 有新消息: 唤醒处理消息
      • 超过阻塞时间: 任务就绪
    • 先进先出FIFO
  • 特性
    • 消息支持先进先出排队, 异步读写工作方式
    • 读写队列支持超时机制
    • 支持后进先出排队LIFO
    • 允许不同长度任意类型消息
    • 一任务从任意队列接受发送消息
    • 多任务从同一队列接受发送消息
    • 队列使用结束可删除
  • 运作机制
    • 创建队列: 分配内存空间 = 单个空间大小 x 消息队列长度
      • 头指针pcHead, 尾指针pcTail, 消息大小uxItemSize, 队列长度uxLength
    • 初始化: 队列为空
    • 发送消息
      • 队列未满/允许覆盖: 拷贝到队列队尾
      • 否: 阻塞
      • 其他任务读入数据/超过阻塞时间 ->就绪态
    • 紧急消息
      • 队列队头
    • 在这里插入图片描述
  • 阻塞机制
    • 无消息: 不等, 等一段时间, 持续等
    • 队列满: 入队任务阻塞
    • 多任务阻塞一个队列: 优先级高获得访问权
  • 函数
    • xQueueCreate()创建消息队列 分配RAM:队列状态+存储区域
    • vQueueDelete()消息队列删除函数
    • 发送
      • xQueueSend()向队列尾部发送一个队列消息(不能被中断调用)
      • xQueueSendFromISR()中断向队列尾部发消息
      • xQueueSendToFront()向队列队首发一个消息
      • xQueueSendToFrontFromISR()中断向队列队首发一个消息
      • xQueueGenericSend()通用消息队列发送函数
      • xQueueGenericSendFromISR()中断通用消息队列发送
    • 接收
      • xQueueReceive()接收消息, 将消息从队列删除
      • xQueueReceiveFromISR()中断接收消息, 将消息从队列删除, 无阻塞
      • xQueuePeed()接收消息, 不删除消息
      • xQueuePeedFromISR()中断接收消息, 不删除消息, 无阻塞
      • xQueueGenericReceive()通用任务从队列读取消息
  • 注意
    • 先创建消息队列, 后使用读写函数
    • 先进先出FIFO / 后进先出LIFO
    • 定义存储读取数据处 > 消息大小
    • 收发以拷贝进行, 大消息可用地址

信号量

  • 信号量
    • 实现任务间通信的机制, 同步/临界资源的互斥访问, 协助一组相互竞争的任务访问临界资源
    • 非负整数, 获取它的任务将该数-1, ->0所有获取它的任务阻塞
    • 0: 没有积累下来的释放信号量操作, 可能在信号量上阻塞的任务
    • +: 1/多个释放信号量操作
  • 二值信号量
    • 临界资源访问/同步
    • 与互斥信号量类似但无优先级继承机制(二值量偏向同步, 互斥量偏向临界资源访问)
    • 同步
      • 信号量创建后置空, 任务1获取信号量->阻塞, 任务2在某条件发生, 释放信号量, 任务1->就绪, 若优先级高即切换: 实现同步 (中断同理)
    • 在这里插入图片描述
  • 计数信号量
    • 长度>1的队列, 事件计数&资源管理
    • 事件发生, 任务/中断释放一个信号量(+1), 事件被处理, 取走信号量(-1)
    • 计数值表示系统中可用资源数
    • 在这里插入图片描述
  • 互斥信号量
    • 特殊的二值信号量, 优先级继承机制, 保护临界资源, 创建后满
    • 使用临界资源(任意时刻只能被一个任务访问)时, 先获取互斥信号量, 使之空, 其他需要使用资源的任务进入阻塞
  • 递归信号量
    • 已获取递归互斥量的任务可重复获取该递归互斥量, 该任务有递归信号量所有权, 获取几次要返还几次, 此前递归互斥量无效, 其他任务无法获取
  • 信号量控制块
    • semphr.h 结构体与消息队列结构体一致
    • uxMessagesWaiting有效信号量个数
      • 二值/互斥信号量 1:有可用信号量 0:无
      • 计数信号量: 可用信号量数
    • uxLength队列长度
      • 二值/互斥 最大=1
      • 计数: 最大信号量数
  • 函数
    • xSemaphoreCreateBinary()创建二值信号量(空), 要先释放才能获取
    • xSemaphoreCreateCounting()创建计数信号量
    • vSemaphoreDelete()删除一个信号量
    • xSemaphoreTake()任务获取信号量
    • xSemaphoreTakeFromISR()任务获取信号量
    • xSemaphoreGive()任务释放信号量
    • xSemaphoreGiveFromISR()中断释放信号量

互斥量

  • 互斥信号量, 特殊二值信号量, 支持互斥量所有权, 递归访问及防止优先级翻转的特性, 实现对临界资源独占式处理
    • 状态: 开锁 / 闭锁
    • 一任务持有互斥量, 其他任务不能再对互斥量开锁 / 持有, 持有互斥量的任务可再次获得该锁不被挂起(递归访问)
  • 优先级继承机制
    • 某资源受互斥量保护, 被1低优先级任务使用, 高优先级申请不到进入阻塞态, 则持有互斥量任务的优先级临时±>高优先级任务
  • 运作机制 在这里插入图片描述
  • 函数
    • xSemaphoreCreateMutex()创建互斥量
    • prvInitialiseMutex()初始化互斥量
    • xSemaphoreCreateRecursiveMutex()创建递归互斥量
    • vSemaphoreDelete()删除互斥量
    • xSemaphoreTake()获取互斥量
    • xSemaphoreTakeRecursive()获取递归互斥量, 需先创建
    • xSemaphoreGive()释放互斥量
    • xSemaphoreGiveRecursive()释放递归互斥量

事件

  • 一种实现任务间通信的机制, 主用于实现多任务间同步, 不传输数据
    • 只能实现事件类型通信, 无数据传输, 可实现一对多, 多对多同步, 一个任务可等待多个事件发生 / 任一时间发生时唤醒任务处理事件 / 几个事件发生后才唤醒任务处理事件
    • 存储于EventBits_t类型变量(少量RAM保存事件组状态)
    • 任务通过逻辑 与 / 或 与多个事件建立关联 -> 事件组
      • 与: 关联型同步, 任务感兴趣的若干事件都发生才唤醒
      • 或: 独立型同步, 任务感兴趣的任一时间发生即唤醒
      • 在这里插入图片描述
  • 特点
    • 事件相互独立, 只与任务关联, 32位时间集合EventBits_t24位表示事件: 0:未发生 1:已发生 共24种事件类型
    • 仅用于同步, 不传输数据
    • 无排队性, 多次向任务设置同一事件(未响应) = 设置一次
    • 允许多任务对同一事件读写
    • 支持事件等待超时机制
  • 函数
    • xEventGroupCreate()创建事件
    • vEventGroupDelete()删除事件
    • xEventGroupSetBits()置位事件组, 阻塞于该位的任务被解锁
    • xEventGroupSetBitsFromISR()中断置位事件组, 阻塞于该位的任务被解锁
    • xEventGroupWaitBits()阻塞等待事件, 获取事件是否已经发生
    • xEventGroupClearBits()清除事件组指定的位
    • xEventGroupClearBitsFromISR()中断清除事件组指定的位

软件定时器

  • 经过设定的时钟计数值后触发用户定义的回调函数, 适于对时间精度要求不高的任务
    • 节拍周期的整数倍
    • 单次模式: 创建启动定时器后, 定时时间到, 只执行一次进入休眠,
    • 周期模式: 列表中删除, 下一次定时到时升序插入
    • 按设置定时时间循环执行回调函数直至删除
    • 在这里插入图片描述
  • 函数
    • xTimerCreate()创建软件定时器
    • xTimerStart()启动软件定时器
    • xTimerStartFromISR()中断启动软件定时器
    • xTimerStop()停止一个已启动的软件定时器
    • xTimerStopFromISR()中断停止一个已启动的软件定时器
    • xTimerDelete()删除软件定时器函数

任务通知

  • 每个任务有一个32位的通知值, 可替代二值信号量, 计数信号量, 事件组, 长度1队列
    • 发送通知给任务, 若有通知未读, 不覆盖通知值
    • 发送通知给任务, 覆盖通知值
    • 发送通知给任务, 设置通知值一个/多个位, 作为事件组
    • 发送通知给任务, 递增通知值, 作为计数信号量
    • 只能有一个任务接收通知消息, 须指定接收通知的任务
    • 只有等待通知的任务可阻塞, 发通知的任务不阻塞
  • 函数
    • xTaskGenericNotify()发送任务通知函数
    • vTaskNotifyGiveFromISR()中断发送任务通知函数
    • xTaskNotify()直接向另一个任务发送一个事件
    • xTaskNotifyFromISR()中断直接向另一个任务发送一个事件
    • ulTaskNotifyTake()获取任务通知, 配合Give()
    • xTaskNotifyWait()等待通知

内存管理

  • 用于系统中内存资源, 初始化, 分配, 释放
    • heap_1.c
    • heap_2.c
    • heap_4.c内存堆为一个大数组ucHeap[configTOTAL_HEAP_SIZE]
    • heap_3.c封装了c标准库的malloc(), free(), 可安全地在嵌入式系统执行
    • heap_5.c允许用户使用多个非连续内存堆空间, 每个堆起始地址,大小由用户定义
  • heap_1.c
    • 只能申请内存不能释放, 申请时间为常量, 不会产生碎片导致崩溃, 不能回收, 内存利用率低
    • 用于从不删除任务, 队列, 信号量, 互斥量等的程序
    • 函数执行时间确定, 不产生内存碎片
    • pvPortMalloc()申请一块用户指定大小的内存空间, 系统管理的空间满足需求则成功
  • heap_2.c
    • 最佳匹配算法, 优先分配申请量接近的内存块
    • 支持释放申请内存, 不能把相邻小内存块合并为大内存块
    • 适于反复删除任务, 队列, 信号量等内核对象, 不担心内存碎片的程序
    • 不确定性, 效率>c库malloc()
    • 不能用于内存分配, 释放随机大小的程序
    • pvPortMalloc()最佳匹配算法管理内存, 先从内存块空闲链表头开始遍历, 查找符合用户申请大小的内存块, 申请成功后判断当前内存是否剩余, 完善该内存块信息, 插入内存块空闲链表
      • 在这里插入图片描述
    • vPortFree()传入要释放的内存地址, 自动索引到对应链表节点, 取出信息, 插入空闲内存块链表
      • 在这里插入图片描述
  • heap_3.c
    • 封装标准c库的malloc()功能和free()函数, 有保护功能
    • 需要链接器设置一个堆
    • 不确定性
    • 增大RTOS内核代码大小
  • heap_4.c
    • 最佳匹配算法实现动态内存分配, 合并算法可将相邻空闲内存块合并为更大的块, 减少内存碎片
    • 适于重复删除任务, 队列, 信号量, 互斥量等的应用
    • 用于分配, 释放随即字节内存的应用, 不会有严重内存碎片
    • 不确定性, 效率>标准c库malloc()
  • heap_5.c
    • 最佳匹配算法, 合并算法, 允许内存跨多个非连续内存区, 在不连续内存堆实现分配
    • vPortDefineHeapRegions()实现系统管理的内存初始化

中断管理

  • 异常: 打断处理器正常执行, 迫使处理器进入一个由有特权的特殊指令执行的事件
    • 同步异常: 内部事件(处理器指令运行产生的事件引起), 触发后须立刻处理, 不能执行原有程序指令步骤
    • 异步异常: 外部硬件装置产生的事件引起的异常源, 触发后可以延缓/忽略
      • 中断: 可以打断任何优先级的任务, 临界段中会挂起中断
        • 相关硬件
          • 外设: 外设需要请求CPU, 产生一个中断信号, 连接到中断控制器
          • 中断控制器: CPU外设之一, 接收其他外设中断信号输入, 发出中断信号给CPU, 控制中断源优先级,触发方式,开关源
          • CPU: 响应中断源请求, 当前任务->中断处理程序
        • 概念
          • 中断号: 每个中断请求信号有特定标志, 使计算机可判断哪个设备提出的中断请求
          • 中断请求: 紧急事件向CPU提出申请要求CPU暂停当前执行任务, 处理紧急事件
          • 中断优先级: 使系统及时响应, 处理所有中断, 由中断时间的重要性&紧迫程度, 分若干级别
          • 中断处理程序: 产生中断请求后, CPU暂停当前任务响应中断申请, 执行中断处理程序
          • 中断触发: 中断源发出, 送给CPU控制性能好, 触发器置1表明产生了中断
          • 中断触发类型: 外部中断申请通过一个物理信号发到NVIC, 电平触发/边沿触发
          • 中断向量: 中断服务程序入口地址
          • 中断向量表: 存储中断向量, 对应中断号
          • 临界段: 该部分代码执行时不允许任何中断
        • 任务间发生 在这里插入图片描述
        • 嵌套发生 在这里插入图片描述
        • 中断延迟 = 识别中断事件 + [等待中断打开时间] + [关闭中断时间]

CPU使用率

  • 外部变量统计时间, 消耗一个高精度定时器, 系统时钟节拍x10~20
  • vTaskGetRunTimeStats()获取任务相关信息
  • vTaskList()获取CPU使用率信息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS笔记(仅供参考) 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • 【FreeRTOS】多任务创建

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • FreeRTOS ------- 任务(task)

    在学习RTOS的时候 个人觉得带着问题去学习 会了解到更多 1 什么是任务 在FreeRTOS中 每个执行线程都被称为 任务 每个任务都是在自己权限范围内的一个小程序 其具有程序入口每个任务都是在自己权限范围内的一个小程序 其具有程序入口通
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • Vue / axios / props 调用后端接口数据并渲染到页面

    情景介绍 给了一个可视化大屏的代码 xff0c 代码上写的是假数据 现在要调用后端接口获取数据 xff0c 并将其渲染到页面上 分析问题 给的代码是一个 vue 组件嵌套一个子组件 xff0c 要把数据渲染到子组件上 要调用后端接口 xff
  • Element-ui关于el-icon无法正常显示的问题(已解决)

    在使用element ui组件库的时候 xff0c 使用自带的图标不显示 xff0c 查了好多篇博客 xff0c 都说是element ui的版本老了 xff0c 在package json中修改版本重新安装就行 xff0c 但是我的情况不
  • el-dialog关闭后表单数据缓存没清空【已解决】

    情景介绍 系统中有 新增 和 修改 两个功能 xff0c 共用一个对话框 要求新增时对话框内容为空 xff0c 修改时内容默认填充旧数据 遇到的问题是 xff0c 点击新增后内容填充了 xff0c 关闭对话框再点击新增或者其他条目的修改 x
  • Vue中父组件向子组件传值,子组件没有接收到

    情景介绍 父组件调用接口获取数据 xff0c 然后通过props传值给子组件 xff0c 子组件拿到数据后渲染到 el table 表格组件中 结果子组件没有将数据渲染到表格中 xff0c 但是控制台打印是获取到数据的 问题分析 先看父组件
  • 数字通信系统的性能及可靠性

    目录 1 数字通信系统的性能 2 数字通信系统的可靠性 1 数字通信系统的性能 数字通信系统的性能由码元速率 信息速率 频带利用率表示 每个码元所携带的信息量I定义如下 xff1a 这里 P 是每个码元的概率 xff0c M 是码元的个数
  • 前端学习资源分享

    学习资源 编程导航 xff08 包含以下所有资源 xff0c 强烈推荐 x1f44d xff09 xff1a https www code nav cn freeCodecamp 在线编程 xff1a https learn freecod
  • 嵌入式方向分析

    很多计算机 电子信息类专业的学生都想把嵌入式开发作为自己的职业目标 xff0c 但是因为嵌入式涉及的知识太多 xff0c 太杂 xff0c 太广 xff0c 很多嵌入式初学者陷入嵌入式知识的海洋中 xff0c 东学一点 xff0c 西学一点
  • UWB-DW1000初始化、发送和接收详解(一)

    DWM1000简介 DWM1000板子上的DW1000芯片 xff0c 是基于CMOS的 低功耗的无线收发集成电路 xff0c 遵循IEEE 802 15 4 2011协议中的UWB标准芯片 DWM1000不需要用户去设计电路 xff0c
  • 云计算-弹性存储

    云盘 挂载到ECS上的磁盘 NAS 文件存储 OSS 对象存储 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 1NMdcten 1653882562436 https files mdnice com user
  • computers & security投稿教程

    在computers amp security上投稿了一篇论文 xff0c 中间还是遇到一些不太懂的东西 xff0c 在此记录下来 1 首先打开官网 xff0c 链接 https www editorialmanager com cose
  • 【SDN测试题】

    SDN测试题 一 判断题 NFV与SDN的基础都是通用服务器 云计算以及虚拟化技术 正确答案 xff1a 对 安装OpenvSwitch时必须根据系统内核版本选择相应的Open vSwitch版本 正确答案 xff1a 对 执行命令ovs
  • 【阅读论文】基于VAE-LSTM混合模型的时间序列异常检测

    Anomaly Detection for Time Series Using VAE LSTM Hybrid Model CCFB Shuyu LinRonald ClarkRobert BirkeSandro Sch nbornNiki
  • Python调用adb shell

    在Android开发中 xff0c ADB xff08 Android Debug Bridge xff09 是一个非常重要的工具 它可以让我们通过命令行或者其他的客户端与安装了ADB驱动的Android设备进行通信 xff0c 并进行一些
  • stm32F103C8T6基于FreeRTOS操作系统的多任务

    目录 一 FreeRTOS简介1 什么是FreeRTOS 2 FreeRTOS特点 二 创建项目三 编写代码四 编译烧录五 总结参考链接 一 FreeRTOS简介 1 什么是FreeRTOS 我们看一下FreeRTOS的名字 xff0c 可
  • 通信系统是如何收发复数信号的:IQ 调制原理

    目录 1 IQ 调制过程 2 IQ 调制原理 3 IQ 调制解调系统框图 通信信号处理的过程中大多使用的都是复值信号 xff0c 但是我们应该清楚 xff0c 复值信号在自然界中是不存在的 xff0c 那么在理论中的复数信号是如何通过现实中
  • 【NVIDIA Xavier NX 安装ROS-melodic + Realsense D435i环境搭建】

    文章目录 背景一 软硬件信息二 过程1 盒子到手 xff0c 悔无调研2 死马当活医 xff0c 但仍有隐患3 安装ROS4 下载编译Realsense ros 三 正片 xff08 装Librealsense和ROS Wrapper看这里
  • 【入坑ORB-SLAM3系列2】未标定的realsense D435i试运行ORB-SLAM3(手把手教学,含realsense d435i一些错误的解决)

    文章目录 前言一 前奏1 Error 12 Error 2 二 正文1 查看自己相机的可用的分辨率与频率2 配置rs camera launch xff08 realsense ros文件夹中 xff09 3 修改 yaml配置文件4 修改
  • 【NVIDIA Xavier NX入坑记录2】基于Ubuntu18.04-Xavier NX的格式化磁盘,挂载磁盘到/home,转移系统到新磁盘

    文章目录 前言一 格式化1 查看磁盘情况2 磁盘分区3 格式化 二 把格式化后未挂载的磁盘挂载到 home xff08 此操作有风险 xff09 1 将 home目录重命名 xff0c 并创建新的 home文件夹2 挂载并迁移原home中的
  • 【杂记1】PC-Ubuntu18.04.5+ROS-melodic环境下安装cartographer功能包

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 ROS下命令行安装 xff08 简单 xff0c 稍微提一下 xff09 二 源码安装cartographer xff0
  • FreeRTOS笔记(仅供参考)

    文章目录 1 FreeRTOS1 1 文件1 2 移植1 3 FreeRTOS的编程风格1 3 1 数据类型1 3 2 变量名1 3 3 函数名 1 4 裸机 amp 多任务系统1 5 数据结构1 5 1 链表1 5 2 双向链表1 5 3