历史上的今天
今天是:2025年08月16日(星期六)
2018年08月16日 | STM8 嵌入式特性编程之构建你的系统时间
2018-08-16 来源:eefocus
时间或许对一个系统来说太重要了,他是系统定时任务处理,测量度量、信号捕捉、事件记录的基础。在手机里面开机时系统会从PMU的RTC模块读取时间,作为系统一切任务的时间基准,此后就有操作系统来维护这个时间,关机的时候内存下电系统时间也会同时丢失,时间由RTC硬件驱动。这就是Android等这样完善的系统对时间的大概处理方法,他们自有非常成熟的方案去实现相应的需求。
那么低端的嵌入式平台也需要时间吗?我想很多时候这样的需求是非常必须的,比如你要测试一段代码的执行时间你会怎么做呢?或者你要定时去执行一项任务你又该如何设计?最常见的你要做一段精确到us的延时你怎么办?
不要说我每次对时间有依赖的操作我都直接去操作定时器!前辈们一直都采用这种原始的方式在操作:设置定时器初值-->设置定时器溢出值—>中断溢出处理;这样的操作在短时间的单任务定时操作时是高效有用的,但定时通道通常只能处理一个任务;在处理多个任务或者长时间的定时任务的时候就需把中断函数写的非常庞大,标志控制或任务的逻辑关系混杂在一起,我们有没有更好的方法来解决这个问题呢?其实所有的需求都只是要你的系统能够有一个时间戳来度量你的任务,这就是我要给大家分享的如何在低端嵌入式平台增加一个类似于Android系统一样的系统时间。
做Android系统开发的朋友都知道使用gettimeofday的系统调用可以获取到时间,这个时间是Unix时间,即1970/01/01起的秒数和微妙时间,使用struct timeval结构体描述。说白了其实操作系统也是通过系统计数来维护时间的,受此启发我们在MCU里面也可以采用这样的思路去维护一个时间戳。
说到这里我们又回到了定时器,我们先来看看超级无敌低端MCU的莫过于40pin DIP的51 工频1M 指令1us,使用它的定时器都可以达到1us的精度,更高性价比的STM8(工频16M是STC的16倍价格还不到它的1/3)或者高端一点的STM32,Freescale、avr等处理器已经远远突破us的时间级别,我们只关注us的精度那就需要对他们的定时器分频处理了。以STM8为例我们说说这个“时间戳”的构建吧。
首先是数据结构的设计如下:
时间数据结构
和android类似我们也定义了sec,usec用于记录系统的ms级时间,tick用于存放系统的ustime;因为是系统时间所以定义了一个全局的timeval;
其次是关于定时器的设置。这里需要考录一个问题就是定时器定时周期的设置,周期过短,中断频发会占用过多系统其他正常任务的处理时间,周期太短则时间更新周期就比较大,对依赖改时间的实时任务来所时间久不太可靠;综合考虑我们设置系统定时周期为1ms
最后是关于中断优先级的问题,因为是系统时间,假如在你的其他中断函数中也要使用到这个时间戳的话那么必须要将定时器的中断设置为最该优先级。这一点需要留意。
接下来是处理代码:
定时器设置
中断处理
这里的tick记录的是系统的us时间,用于us延时处理,不直接使用usec的原因是usec满1000000会重新清零使用sec和usec来计算us时间需要做相应转换运输。
系统时间处理
如图,根据时间的关系我们就可以很容易的精确到us的延时,以及测量信号长度等相关操作。
有了这种方法我们只要通过系统的定时器资源就能解决很多对时间有要求的处理任务了,基于该定时器我们还可以做定时任务调度,实现MCU的“多线程”处理了,这一块实现我们将在另一模块专门来写。
史海拾趣
|
大开眼界---看看国外电子工程师们设计的AVR单片机开发板、学习板-连载中 前几天在论坛发了一个帖子:大开眼界---史上最牛AVR单片机开发板 https://bbs.eeworld.com.cn/thread-88307-1-1.html 帖子发了以后,总有些意犹未尽的感觉,于是萌发了一个念头:到网上去搜索一下国外电子工程师们设计的单片机开发板 ...… 查看全部问答> |
|
最近在用ARM+GPRS做收发短信系统,但总是没反应,短信发不了!困惑很久,请路过的兄台多多指点,帮我看看程序有何错误!谢谢!谢谢! # include # include # include # include # include # include # include # include # includ ...… 查看全部问答> |
|
说出用labview做可编程控制器实验(8259)的思路和具体做法,最好把显示器调用和代码如何往里加说清楚,可以的话加我qq:924605285,谢谢各位了!… 查看全部问答> |
|
void Fn_Init_DS18B20() { uchar i; uint j; PORTD=PORTD|BIT(6); //拉高总线电平 PORTD=PORTD&(~BIT(6));//置总线为低电 ...… 查看全部问答> |
|
跪求各位: 谁有Unicode编码表UTF-16对应的GB2312编码表,越详细越好,本人在做UTF-16向GB2312转换是,应为UTF-16是Shift_JIS (日语)类型,因为在UTF-16中,对应的GB2312不是连续的,故无法判断当前的是日语还是汉语 ...… 查看全部问答> |
|
MSP430系列的原理和应用,是华东师范大学计算机开心与技术学院经典教程,分享给大家!!! [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:38 编辑 ]… 查看全部问答> |
|
MSP430的复位System Reset and Initialization 1.MSP430的复位信号有两种:上电复位信号(POR)和上电清除信号(PUC)。a power-on reset (POR) and a power-up clear (PUC) signal. 从图中可以看出: • Powering up the device • A low signal on the RST/NMI pin when config ...… 查看全部问答> |




