嵌入式中的时间和定时

本文探讨了嵌入式系统中获取时间与定时服务的重要性,讲解了实时时钟(RTC)和定时器在硬件层面的角色,以及它们如何提供时间基准和周期中断。在软件层面,Linux系统通过clocksource和clock-event device抽象硬件,提供jiffies、xtime、timer和hrtimer等接口。嵌入式开发中,理解并利用好这些时间服务对于简化开发至关重要。
摘要由CSDN通过智能技术生成

开发软件经常会用到时间,不同的场合用到的时间也不尽相同,有时候我们需要的是年月日时分秒这样很容易理解的格式,也有时候我们只是想知道系统开机了之后运行了多久,还有的时候我们不需要知道具体时间,只是想像设定一个闹钟一样,时间到了叫我干活就行。

在操作系统的内核里也一样,没了时间做基础,什么时间片、周期调度、延迟处理都没办法实现,这些关于时间的服务(也可以叫功能),总结下来是下面这两类:

  • 获取时间

  • 定时服务

那这两个功能是怎么实现的呢?世上没有免费的午餐,想用到什么功能,就得有相应的软硬件来支持,我们先来看看要想获取时间和定时在硬件上都需要什么,下面是一个硬件框图,基本在单片机或者嵌入式linux都适用。

这些框框都用来干嘛呢?RTC(Real Time Clock)就是实时时钟,主要用来提供时间基准,有独立的芯片也有些MCU是内置的,一般会有单独的电池供电,就像电脑主板上一样,即使关了机RTC的时间也是在继续走的。RTC提供的时间通常是UTC时间,年月日时分秒,很容易阅读,缺点是精度不高,

嵌入式系统开发定时器常常用于周期性的任务调度或者时间触发的事件处理。以C语言为例,在许多嵌入式微控制器如Arduino Uno 或者基于ARM Cortex-M的芯片上,经常会使用像Keil μVision这样的开发环境,使用RTOS (Real-Time Operating System) 比如FreeRTOS。 下面是一个基本的示例,假设我们使用的是FreeRTOS库和Cortex M0+的定时器,比如Timer1,设置定时时间为1秒: ```c #include "FreeRTOS.h" #include "task.h" // 定义定时器常量 #define TIMER_PERIOD_MS 1000 // 1000ms = 1s void vMyTimerTask(void *pvParameters) { unsigned long ulPreviousWakeTime; xTaskCreatePinnedToCore(pdIdleTask, "Timer Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL, portCPU0); // 创建并启动定时任务,绑定到某个核心 // 获取当前唤醒时间 ulPreviousWakeTime = pdMS_TO_TICKS(TIMER_PERIOD_MS); // 循环等待定时器断 while(1) { // 等待下一个唤醒时刻 vTaskDelayUntil(&ulPreviousWakeTime, pdMS_TO_TICKS(TIMER_PERIOD_MS)); // 在这里添加你需要每1秒执行的任务代码 // 示例:LED闪烁一次 PGM_P ledStr = "LED ON"; GPIO togglePin(PIN_LED); togglePin.toggle(); // LED开或关 PGM_P ledOffStr = "LED OFF"; printf("%s\n", ledStr); if(togglePin.isHigh()) { printf("%s\n", ledOffStr); } } } int main(void) { // 初始化 FreeRTOS 和配置定时器 initFreeRTOS(); configureTimerForTasks(); // 启动定时任务 xTaskCreate(vMyTimerTask, "Timer Handler", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); // 进入无限循环 for (;;) {} return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值