FreeRTOS软件定时器
软件定时器 对某些精度要求不高的场合,可以不使用硬件定时器 定时器服务任务本身也是一个任务(系统自动创建的任务) 用户对寄存器操作的指令实际上是通过定时器指令队列传给这个任务,然后这个任务来执行操作 定时器到期后执行回调函数,回调函数无法阻塞,无法延时 (1)USE_TIMERS 功能:启用或禁用整个软件定时器功能。 默认值:Enabled(启用)。 关键特性:一旦启用,不可修改(在CubeMX中灰色显示,无法禁用)。启用后,FreeRTOS内核会自动创建定时器服务任务和指令队列。 建议:始终保持启用,除非系统绝对不需要软件定时器功能。 (2)TIMER_TASK_PRIORITY 功能:设置定时器服务任务的优先级。 默认值:2。 设置范围:0到 55(因为FreeRTOS优先级总数通常为56)。 优先级上下文:比空闲任务(优先级0)高,确保定时器服务总能及时运行。但低于许多应用任务(典型应用任务优先级在3及以上)。 配置建议:提高优先级(如5以上):如果定时器回调需要快速响应(如实时控制)。降低优先级(如1):如果定时器操作不紧急,避免抢占关键任务。避免与硬件中断冲突:优...
FreeRTOS任务调度
多任务运行机制 任务是实现某种功能的函数,里面通常有死循环 任何任务都不应该自己退出,不能有return 两种方法结束任务: 任务中跳出死循环,使用vtaskdelete删除自己,也就是在函数返回前,杀死自身 其他任务中调用vtaskdelete 多任务: 优先级数字越小,优先级越低 RTOS将CPU时间分为基本时间片systick定时器的定时周期 任务轮询时,交出CPU使用权的任务会把CPU当前任务的场景压到自己的栈空间 获得使用权的一方会把自己栈空间保存的数据恢复至CPU 任务状态 就绪状态 (与运行状态之间的转换叫做切入和切出) 任务被创建之后自动进入 运行状态 占有cpu并运行的状态, 让出cpu的方法 vtasksuspend() 执行阻塞式函数进入阻塞状态 阻塞状态 任务暂时让出cpu使用权,处于等待状态 时间延迟类函数:以 vTaskDelay()或 vTaskDelayUntil()为代表。运行状态任务调用后进入阻塞,延迟指定时长后转为就绪状态,参与调度后有机会再次运行。 事件请求类函数(进程间通信场景):以请求信号量的 xSemaphoreTake()为例。...
CPP树
\theta=5description和keywords都是给爬虫看的 map myMap键值对,键唯一,按照键的大小自动排序 12345678910111213//插入,访问,查找,删除myMap.insert(make_pair(1, 100)) #make_pair打包键值对myMap[2] = 200;myMap.insert({{3, 300}, {4, 400}}); auto it = myMap.find(3);if (it != myMap.end()) { a= it->first; b= it->second ;} else {}myMap.erase(1); str.size()获取列表长度 string定义字符串 unordered_map:适合对元素顺序没有要求,且需要快速访问的场景,尤其是在元素数量较多且频繁进行查找、插入和删除操作时。 .push_back(),在vector后面添加元素 vector
FreeRTOS空闲任务与低功耗
系统时钟问题 弱函数,通过__weak来修饰,使得用户可以覆盖 使用systick作为HAL基础定时器时,作用是产生滴答信号计数值,然后用于延时计算,如果不需要延时计算,停掉systick对系统运行无影响 可以使用TIM6作为HAL的基础时钟,TIM6完全代替了SysTick。 FreeRTOS使用systick作为基础时钟,用于产生FreeRTOS滴答信号,而且在定时中断中检查任务状态,发出任务调度申请 在使用FR的时候,必须为HAL库设置一个非Systick的时钟 Systick是Cortex-M内核的一个定时器,在整个32系列都存在,用它作为基础时钟适应性更强 不使用FreeRTOS时:系统默认使用SysTick定时器作为HAL库的基础时钟(也可配置其他定时器)。时钟默认周期为1ms,HAL的毫秒级延时函数(如HAL_Delay())依赖此时钟。 使用FreeRTOS时:SysTick定时器必须作为FreeRTOS的基础时钟(用于系统嘀嗒信号)。需为HAL库单独指定一个非SysTick定时器(如TIM6、TIM7等)作为其基础时钟。 FreeRTOS中SysTick的作用...
FreeRTOS进程通信与消息队列
进程间通信 当 ADC 中断 ISR 向缓冲区写入数据后,若检测到“缓冲区已满”,会发送一个“数据就绪”信号(如信号量、队列通知等,具体由 RTOS 的 IPC 机制实现)。 此前因“等待数据就绪”而处于阻塞状态的数据处理任务,收到信号后会退出阻塞,被 RTOS 调度器唤醒为“运行状态”,进而从缓冲区读取数据并处理。 消息队列 动态分配(xQueueCreate()):由FreeRTOS自动从系统的堆空间分配队列所需内存。代码简洁但依赖堆可用空间,若堆不足可能创建失败。 静态分配(xQueueCreateStatic()):需开发者手动准备两块内存:存储数据的数组(对应队列存储单元)、存储队列元信息的结构体变量(如长度、元素数等)。不依赖堆内存,适合内存安全要求高或资源紧张场景,但需手动管理内存生命周期。 静态创建的时候,需要填写控制块的名称,队列的句柄就是控制块的指针。 xQueueCreate()本质是宏函数,调用更通用的 xQueueGenericCreate()(该函数同时用于队列、信号量、互斥量等IPC对象创建,体现代码复用)。 QueueHandle_t xQueue...
贪心算法
分发饼干大饼干优先给大胃口的学生,遍历学生,满足条件后再更新饼干 摆动序列多种情况,记录上一个对差值,遇到平坡不更新差值,只在变化时更新差值(last带等号,now不带等号) 最大子序和当当前值为负数的时候,放弃掉当前值,重新开始,因为负数加上任意一个数都会更小int result = INT32_MIN;表示32位有符号整数的最小值 买股票的最佳时机II只计算上升段的和写法优化:大于0,+=value:+=max(value,0); 1result += max(prices[i] - prices[i - 1], 0); 跳跃游戏最大覆盖值,一直更新for循环的限制值,只在限制值范围内循环,找到答案提前return 跳跃游戏II(重做没思路)在当前覆盖范围内,找最大的跳跃距离 K次取反后最大化数组和先尽量吧负数全变成正数,再针对最小的数疯狂取反代码优化:cmp排序: 1234static bool cmp(int a, int b) {return abs(a) > abs(b);}sort(A.begin(), A.end(), cmp...
FreeRTOS中断管理
中断是MCU硬件特性,STM32由NVIC(嵌套向量中断控制器)管理硬件中断。以STM32F4为例,通过4位优先级分组配置中断的抢占优先级(数字越小优先级越高,决定中断嵌套)和子优先级(同抢占优先级时决定响应顺序)。每个中断对应一个中断服务例程(ISR),用于响应中断事件。 在启动freertos后,会自动对中断进行一些设置 在CubeMX配置FreeRTOS的“config”参数时需关注以下两个中断相关参数 configLIBRARY_LOWEST_INTERRUPT_PRIORITY: 表示系统中断的最低优先级数值。由于采用4位抢占优先级分组,该参数固定为 15(4位二进制最大值为15) configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY: 表示FreeRTOS可管理的中断最高优先级,默认值为 5。其核心作用是: 仅当中断优先级 ≥ 5 时,中断服务程序(ISR)中才能调用FreeRTOS的中断安全API(即带 FromISR后缀的函数,如 taskDISABLE_INTERRUPTS()); 该参数绝不能设为0,且高优先级(>5)的...
Legged gym 使用笔记
Legged gym 使用笔记测试图床 入门案例1.倒立摆 首先在envs目录下创建自己的环境cartpole 导入LEGGEDGYMROOT_DIR路径envs文件夹同级下的__init的文件中注册的Cartpole2Config是对应的config文件必须导入的 123456789101112131415from legged_gym import LEGGED_GYM_ROOT_DIR, envsfrom time import timefrom warnings import WarningMessageimport numpy as npimport osfrom isaacgym.torch_utils import *from isaacgym import gymtorch, gymapi, gymutilimport torch# from legged_gym import LEGGED_GYM_ROOT_DIRfrom legged_gym.envs.base.base_task import BaseTaskfrom legged_gym.utils.h...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment


