- 简述
- 定时器:是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率
- 分类:
- 硬件定时器:
- 芯片本身提供的功能
- 每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息
- 软件定时器:
- 由操作系统提供的一类系统接口,构建在硬件定时器(SysTick)基础上
- 软件定时器指定时间到过后要调用的函数(也称超时函数/回调函数,为了统一,下文均用回调函数),在回调函数中处理信息
- 硬件定时器:
- uC/OS定时模式
- 单次模式:启动定时器,时间到达,只执行一次回调函数后,将不再重复执行
- 周期模式:定时器会按照设置的定时时间,循环执行回调函数,直到用户将定时器删除
- 应用场景
- 适合于对时间精度要求不高的任务
- 软件定时器的精度
- 系统节拍是系统的心跳节拍,表示系统时钟的频率,OS_CFG_TICK_RATE_HZ,默认是1000,周期1ms
- 精度决定于系统时基频率,也就是变量OS_CFG_TMR_TASK_RATE_HZ的值,默认100,周期10ms
- 定时器任务的频率不能大于系统时基频率
- 相关函数
- OSTmrCreat(); 创建定时器
- OSTmrDel(); 删除定时器
- OSTmrStart(); 启动定时器计数
- OSTmrStop(); 停止定时器计时
- OSTmrRemainGet(); 获取定时器剩余时间
- OSTmrStateGet(); 获取当前定时状态
- 例程
- 创建,启动
/************************************************** * 函数名:static void AppTaskTmr(void *p_arg) * 描述 :创建软件定时器 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskTmr(void *p_arg) { OS_ERR err; OS_TMR my_tmr; //声明软件定时器对象 (void)p_arg; //创建软件定时器 OSTmrCreate( (OS_TMR *)&my_tmr, //软件定时器对象 (CPU_CHAR *)"MySoftTimer", //命名软件定时器 (OS_TICK )100, //定时器初始值,依10hz时基计算,即为1S (OS_TICK )100, //定时器周期重装值,依10Hz时基计算,即为1S (OS_OPT )OS_OPT_TMR_PERIODIC, //周期性定时 (OS_TMR_CALLBACK_PTR)TmrCallback, //回调函数 (void *)"Time over!!!", //传递实参给回调函数 (OS_ERR *)&err); //返回错误类型 //启动软件定时器 OSTmrStart( (OS_TMR *)&my_tmr, //软件定时器对象 (OS_ERR *)&err); //返回错误类型 ts_start = OS_TS_GET(); //获取定时前时间戳 while(DEF_TRUE) { OSTimeDly(1000, OS_OPT_TIME_DLY, &err);; //不阻塞该任务 } } - 回调函数
/************************************************** * 函数名:void TmrCallback (OS_TMR *p_tmr, void *p_arg) * 描述 :软件定时器的回调函数 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ void TmrCallback (OS_TMR *p_tmr, void *p_arg) { CPU_INT32U cpu_clk_freq; printf("%s", (char *)p_arg); cpu_clk_freq = BSP_CPU_ClkFreq(); //获取CPU时钟 LED1_TOGGLE; ts_end = OS_TS_GET() - ts_start; //获取定时后的时间戳 printf("\r\n 定时1S,通过时间戳测得定时 %07d us, 即%04d ms; \r\n", ts_end / (cpu_clk_freq / 1000000), //将定时时间折算成us ts_end / (cpu_clk_freq / 1000) ); //将定时时间折算成Ms ts_start = OS_TS_GET(); //获取定时前的时间戳 }
- 创建,启动
- 下载验证
- 总结
- 软件定时器核心是在底层的硬件定时器(SysTick内核定时器)上进行软件分频
- 回调函数是在定时器任务中被调用,所以回调函数的上、下文环境是在任务中,并且运行回调函数时调度器处于被锁状态
- 回调函数越简短越好,并且不能在回函函数中等待消息队列、信号量、事件等操作
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
相关推荐
【破局之道】LangChain4j 0.31.0 + Java 8 + Spring Boot:在“过时”环境中构建本地大模型应用的实战指南
本文为使用Java 8和Spring Boot等“过时”技术栈的团队提供了构建本地大模型应用的实战指南。通过采用LangChain4j 0.31.0这一兼容版本,结合Ollama部署本地大模型,开发者无需升级JDK即可在现有项目中快速集成AI能力,实现智能问答、文档摘要等功能,为传统项目注入创新活力。
嵌入式系统学习——STM32之UCOS-III中断和时间管理及软件定时器
UCOSIII中断: 中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。 void USART1_IRQHandler(void) { OSIntEnter(); //中断服务程序 OSIntExit(); } 进入和退出中断服务函数: 进入中断服务函数以后使用函数OSIntEnter(
海外最新AI营销AI销售书籍推荐AI营销培训讲师AI销售培训讲师人工智能营销培训师人工智能销售培训师AI赋能营销培训AI赋能销售培训企业AI营销内训企业AI销售内训AI营销课程讲师AI销售课程讲师
专栏|AI营销与AI销售实战 · 第46期在这个人类与算法共舞的时代,销售,已经不是你我熟悉的那个“打电话、见客户、做PPT”的老行当了。你还以为销售是“打感情牌”?错了,情感要继续,但方式已经升级。你还以为AI只是“写写文案”?错了,文案只是皮毛,真正的杀器,是思维方式的重构,是认知地图的重绘。首先,我们需要明确一个事实:AI并不会消灭销售这个职业,但它必然会重新定义销售的本质。在销售领域,真正的制胜之道不是简单地采用AI工具,而是的能力。
STM32F4X UCOSIII软件定时器
定时器在MCU中是一个很常用的外设,其作用是可以在某个事件点触发MCU中断,告知MCU处理事情。定时器跟生活中的闹钟很类似,可以设置闹钟每天什么时候响,还能设置响的次数,是响一次还是每天都响。定时器也有硬件定时器和软件定时器之分。
在Jetson orin NX上安装部署Yolov8
1、环境准备与依赖安装2、安装PyTorch和Torchvision:从NVIDIA官方论坛或开发者下载中心获取与你的JetPack版本兼容的PyTorch wheel文件。例如,对于JetPack 5.1.2,可以安装PyTorch v2.1.0 8。:需要编译安装与PyTorch版本匹配的Torchvision。这里自己编译没有成功,下载了一个现成的可以用torchvision-0.16.2+c6f3977-cp38-cp38-linux_aarch64.whl。
Vue - 快速入门,这一套就够了!(Vue core + 案例 + 效果演示)
前置条件:掌握 HTML、CSS、JavaScript、AJAX.工具:VsCode.插件:Live Server(浏览器实时预览)Ps:建议都提前下载下来,没网的时候也能用.
STM32F767 软件中断
软件中断
将Keil中的变量数组导出
首先,写好导出数据的函数。
STM32学习----通用定时器的应用(PWM)
TI1FP1和TI1FP2这两个信号的特性是一模一样的,都是通道1的信号经过滤波和边沿检测之后产生的信号,只是TI1FP1是送给捕获比较通道IC1,TI1FP2是送给捕获比较通道IC2。TI2FP1和TI2FP2这两个信号的特性是一模一样的,都是通道2的信号经过滤波和边沿检测之后产生的信号,只是TI2FP1是送给捕获比较通道IC1,TI2FP2是送给捕获比较通道IC2。如果要输出一个占空比可调的PWM信号,其实也很简单,就是改变对应通道的比较捕获寄存器的值就可以了,其他的跟固定占空比信号的设置一样就行。
【安全启动】HSM安全启动原理与技术实现白皮书
摘要: 安全启动(Secure Boot)与度量启动(Measured Boot)通过硬件信任根(HSM/TPM等)确保系统启动链路的可信性,实现代码验证与状态记录。HSM作为核心组件,承担密钥保护、签名验证和密码运算任务,与SHE、TPM等协同构建分层信任链。通用计算与嵌入式/汽车场景的启动流程差异显著,前者依赖TPM的PCR度量,后者以HSM为核心实现硬件级安全闭环。工程实践中需权衡性能、合规性及抗攻击能力,并结合后量子密码(PQC)等演进技术优化方案。
C#跨平台制图新纪元:Mapsui,一库在手,地图我有
深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。
uCOS-III 学习记录(4)——时间戳
参考内容:《[野火]uCOS-III内核实现与应用开发实战指南——基于STM32》第 9 章。 文章目录1 时间戳2 DWT 外设2.1 DWT 外设简介2.2 初始化 DWT 的步骤2.3 DWT 外设的宏定义(cpu_core.c)3 CPU 和时间戳的初始化3.1 时间戳的相关定义(cpu_core.h)3.1.1 通过宏定义开启/关闭时间戳功能3.1.2 时间戳的数据类型定义3.1.3 时间戳的全局变量定义——CPU_TS_TmrFreq_Hz3.2 时间戳的初始化3.2.1 CPU 初始化函数 C
Fiori Elements 从入门到精通开发教程的文章目录
Fiori Elements 开发技术相对 SAP 其他历史悠久,发展成熟的开发技术来说,是一个新事物。正因如此,迄今为止国内深入讲解 Fiori Elements 应用的中文材料几乎没有。
面向PHM的民机飞行数据分析及应用研究进展
该模型输入为发动机的运行条件(海拔、标准温度偏差等)和环境条件(大气温度、大气压力等)、 工作过程参数(压气机流量、压气机压比、燃烧室出口温度、涵道比、压气机压比、涡轮前温度等)以及预测的部件效率和管道恢复系数,通过基于GasTurb进行设计点性能匹配和非设计点性能匹配,最终得到总体性能模型,模型输出数据为整机性能参数(油耗等), 各站位的压力、温度、流量,部件效率以及EGT 等参数,同时模型还可对不同工况点进仿真,输出不同工况点下整机及各站位的温度、压力和流量等参数。图5展示了某飞机在一年内的健康指数。
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
从0到1教你写UCOS-III 第八部分:时间戳
本章实现时间戳用的是 ARM Cortex-M 系列内核中的 DWT 这个外设的功能,有关这个外设的功能和寄存器说明具体见手册“STM32F10xxx Cortex-M3 programming manual” 8.1 时间戳简介: 在 uC/OS-III中,很多地方的代码都加入了时间测量的功能,比如任务关中断的时间,关调度器的时间等。知道了某段代码的运行时间,...
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
UCOIII时间片轮转调度
前提: 时间片轮转法:主要用于分时系统中的进程调度。为了实现轮转调度,系统把所有就绪进程按先入先出的原则排成一个队列的队首进程,让它在CPU上运行一个时间片的时间。时间片是一个小的时间单位,通常为 10~100ms 数量级。当进程用完分给它的时间片后,系统的计时器发出时钟中断,调度程序便停止该进程的运行,把它放入就绪队列的末尾;然后,把它放入就绪队列的末尾;然后,把CPU分给就绪队列的队首进程,同样也让它运行一个时间片,如此往复。 实现思想:时间片轮转算法的基本思想是,系统将所有的就绪进程按先来先服务算法的
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
STM32F1(以 STM32F103 系列为例)入门与工程实践详尽指南
摘要 本指南为STM32嵌入式开发者提供从入门到进阶的实践指导,涵盖工程搭建、寄存器操作、标准外设库使用等核心内容。重点包括: 工程结构:推荐模块化目录设计,分离用户代码与库文件 开发流程:Keil工程创建、启动文件配置、时钟初始化解析 两种LED实现: 寄存器级操作:直接控制GPIO寄存器(CRL/BSRR) 标准库实现:使用GPIO_InitTypeDef结构体和RCC时钟使能函数 调试要点:常见编译/烧录问题解决方案,时钟配置注意事项 进阶路径:提供CMSIS规范、外设寄存器映射原理等深入学习方向 特
(STM32笔记)二、开发环境搭建
我用的是正点的STM32F767来进行学习。之后的这个系列笔记开头未标明的话,用的也是这个板子。 二、开发环境搭建 1、MDK软件安装 (1)MDK是什么? RealView MDK是Keil公司开发的,为基于Cortex 、ARM7、ARM9等处理器设备提供的一个完整的开发环境。 MDK=Keil for ARM, 大家学习51的时候就会用到Keil C51。 (2)下载 MDK安装包 即下载Keil软件 官网下载地址:点击进入 (注:因为是非注册版,所以只能编译不超过32K的代码!!超过32K需要注
uCOS-III ——时间戳(DWT外设)
在 uCOS 中,我们已经使用了 SysTick 作为系统的时间片,所以不能再使用 SysTick 来实现时间戳了。在 Cortex-M3 中有一个调试组件,其中有一个组件是跟踪组件,叫数据观察点与跟踪(Data Watchpoint and Trace,DWT)外设,该外设有一个 32 位寄存器 CYCCNT,它是一个向上的计数器,记录的是内核时钟 HCLK 运行的个数,当 CYCCNT 溢出之后,会清零重新开始向上计数。该计数器在 uCOS 中正好被用来实现时间戳的功能。
uCOS-III中的OS_CRITICAL_ENTER()和OS_CRITICAL_EXIT()使用
uCOS-III是uCOS-II的升级版本,虽然针对于后者有各种优化,但是有一点不是特别好,就是有些宏定义名称会做一些修改,这种修改可能更合理,但是可能会引起一些不必要的“误会 ”,例如在uCOS-II中临界区的使用函数名字为: #include "os_cpu.h" //包含该头文件 xxxx() { OS_CPU_SR cpu_sr=0; //必须要定义一个局部变量才
STM32开发者指南:Keil MDK下载及基础设置操作指南
详细介绍Keil MDK下载步骤及在STM32开发中的基础设置,帮助新手快速搭建开发环境。掌握keil mdk下载与项目配置关键点,提升嵌入式开发效率。
基于STM32F407VET6自学笔记
基于STM32F407VET6的自学笔记,Keil 5MDK下载与安装,STM32F07XX的工程配置
uC/OS任务信号量
在实际任务间的通信中,一个或多个任务发送一个信号量或者消息给另一个任务是比常见的,而一个任务给多个任务发送信号量和消息相对比较少。前面所讲的信号量和消息队列均是单独的内核对象,是独立于任务存在的。这两章要讲述的任务信号量和任务消息队列是 任务特有的属性,紧紧依赖于一个特定任务。 任务信号量和任务消息队列分别与多值信号量和消息队列非常相似,不同之处是,前者仅发布给一个特定任务,而后者可以发布给多个任务。因此,前者的操作相对比较简单,而且省时。如果任务信号量和任务消息队列可以满足设计需求,那么尽量不要使用
STM32f767之通用定时器
TIM3
UCOS学习(六)——软件定时器
如何实现一个软件定时器
uC/OSIII时钟节拍处理过程
uC/OSIII时钟节拍处理过程 时钟节拍涉及到的函数调用过程: 从main开始,创建了第一个任务AppTaskStart,在其一开始执行时,对BSP和CPU进行初始化,调用BSP_CPU_TickInit()函数; 该函数定义在bsp文件夹下的bsp.c文件中,该函数先读取时钟频率,然后按OSCfg_TickRate_Hz值计算应该为CM3的systick定时器设置的

557



被折叠的 条评论
为什么被折叠?



