您的位置:首页 > 编程语言

STM8 嵌入式特性编程之构建你的系统时间

2014-06-02 09:39 295 查看
 

STM8 嵌入式特性编程之构建你的系统时间
 
-                                                         2014 酷玩创意
 
      时间或许对一个系统来说太重要了,他是系统定时任务处理,测量度量、信号捕捉、事件记录的基础。在手机里面开机时系统会从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的“多线程”处理了,这一块实现我们将在另一模块专门来写。

 

完整代码工程可通过http://shop108911095.taobao.com/?spm=2013.1.0.0.Z8tf8S取得
 

更多趣味算法、应用更新中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息