文档章节

SylixOS最小系统开发(二)

逍遥蓝云
 逍遥蓝云
发布于 2017/06/14 15:27
字数 777
阅读 15
收藏 0

 

 

  1. 系统Tick

    MPC8313芯片的Tick实现比较特殊,因为在MPC8313芯片中存在名为Decrementer的寄存器,如图 1.1 Decrementer寄存器所示。

    图 1.1 Decrementer寄存器

    Decrementer寄存器中保存的数据会每4个总线周期减1,当Decrementer寄存器递减到0时,触发Decrementer异常,CPU会执行异常服务程序。Decrementer的异常服务函数需要在startup.S文件中设置,如图 1.2 startup.S所示。

    图 1.2 startup.S

  2. Decrementer异常流程解析

    第一步:当Decrementer寄存器递减到0时,触发Decrementer异常,CPU会执行异常服务程序,系统通过异常向量表跳转到archDecrementerInterruptEntry函数。

    第二步:archDecrementerInterruptEntry函数会执行archDecrementerInterruptHandle函数,在archDecrementerInterruptHandle中会对Decrementer寄存器进行设置并调用系统的中断服务函数。

    第三步:系统的中断服务函数会根据archDecrementerInterruptHandle传入的用户注册的伪中断向量查找用户注册的Tick中断服务函数。

  3. Tick实现

    根据上文所述,可以看出MPC8313的系统Tick可以在Decrementer寄存器的基础之上实现。由于Decrementer寄存器的控制接口已经在PowerPC的系统Base中实现,所以笔者无需自己实现,只需要调用系统接口即可。

    Tick的实现分以下三个步骤:

    第一步:使用非已有中断向量号并且大于255的非负数作为Tick的伪中断向量注册中断,如图 1.3 注册Tick中断所示。

    图 1.3注册Tick中断

    第二步:声明archDecrementerInit函数,如图 1.4 声明archDecrementerInit所示

    图 1.4声明archDecrementerInit

    第三步:初始化Decrementer,如图 1.5 初始化Decrementer所示

    图 1.5初始化Decrementer

  4. 高速定时器

    由于系统Tick是基于Decrementer寄存器实现的,所以高速定时器也需要基于Decrementer寄存器实现。

  5. 高速定时器原理简述

    高速定时器实质上是为了补偿系统Tick的不足,用于统计比一个Tick粒度更小的时间。在MPC8313中笔者通过读取Decrementer寄存器中的值来实现高速定时器的功能。

  6. 高速定时器的实现

    由于Decrementer寄存器无状态位可读取,无法通过读取硬件获得是否产生了Tick中断,因此在base中添加了状态全局变量_G_bTickinterTag,并且在系统进入archDecrementerInterruptHandle时把_G_bTickinterTag置为LW_TRUE。

    高速定时器在bspLib.c下的bspTickHighResolution函数实现,如程序清单 2.1 高速定时器所示。

    程序清单 2.1高速定时器

    VOIDbspTickHighResolution (struct timespec *ptv)
    
    {
    
        REGISTER UINT32uiCntCur,uiDone;
    
        ULONG    ulCPUId =LW_CPU_GET_CUR_ID();
    
    
        uiCntCur = ppcGetDEC ();
    
        uiDone =GuiFullCnt - uiCntCur;
    
    
    /*
    
    * 由于Decrementer寄存器无状态位可读取,无法通过读取硬件获得是否产生
    
    * 了Tick中断,因此在base中添加了状态全局变量_G_bTickinterTag
    
    */
    
        if (_G_bTickinterTag[ulCPUId] ==LW_TRUE) {
    
    /*
    
    * 这里由于 TICK 没有及时更新, 所以需要重新获取并且加上一个 TICK 的时间
    
    */
    
            uiCntCur= ppcGetDEC ();
    
            uiDone =GuiFullCnt - uiCntCur;
    
    
            if (uiCntCur != 0) {
    
                 uiDone +=GuiFullCnt;
    
            }
    
        }
    
    
        ptv->tv_nsec += (LONG)((Gui64NSecPerCnt7 * uiDone) >> 7);
    
        if (ptv->tv_nsec >= 1000000000) {
    
        ptv->tv_nsec -= 1000000000;
    
        ptv->tv_sec++;
    
        }
    
    }

     

  7. 参考资料

© 著作权归作者所有

逍遥蓝云
粉丝 2
博文 23
码字总数 17574
作品 0
合肥
高级程序员
私信 提问
SylixOS-IgH系统平台搭建

1.参考手册 下面7个文件存放在本地服务器“\10.9.1.113.研发部9.ExchangeFolder郑磊”路径下 《RealEvo-IDE使用手册》 《SylixOS应用开发手册》 《SylixOSshell用户手册》 《SylixOS-IgH使用...

zhengleich
2018/05/15
0
0
SylixOS线程堆栈大小浅析

目录 1. SylixOS线程、线程栈介绍 1 1.1 线程的介绍 1 1.2 线程栈的介绍 1 2. SylixOS线程栈大小的分配 1 2.1 线程、线程栈相关属性的设置 2 2.2 线程栈大小 2 2.3 线程堆栈警戒区 3 3. 总结...

Esc120
2018/06/26
0
0
SylixOS上EtherCAT实现

1 EtherCAT开源协议栈介绍 目前常见开源的主站代码为RT-LAB开发的SOEM(Simple OpenSource EtherCAT Master)和EtherLab的the IgH EtherCAT® Master,SylixOS对两者都支持。其中IgH作为常用的...

Jackstraw瑞
2017/11/01
260
0
VxWorks驱动移植至SylixOS总结

本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现。 1. 驱动注册与初始化 1.1 VxWorks中驱动注册与初始化 1.1.1 初始化函数 VxWo...

zhywxyy
2018/08/21
39
0
SylixOS调试方法详解——性能分析

1. SylixOS调试方法介绍 SylixOS实现了一个功能强大的调试stub(桩),可在设备或模拟器上在线调试应用程序,RealEvo-IDE也提供配套的调试插件。目前RealEvo-IDE既支持自动推送调试、也支持传...

Esc120
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部