摘要:

本文介绍了航天应用领域中CAN总线的多种冗余方法,重点论述了在实时操作系统VxWorks下基于ARM处理器的二模(DRM)CAN冗余的硬件设计和软件驱动程序设计过程,并在空间六自由度机器人通信平台中得到实现。

下载地址

Files:
Date 2018-09-05
File Size 553.82 KB
Download 638

目前有多种在嵌入式计算机操作系统中检测CPU占用率的方法,例如,目前在嵌入式操作系统vxWorks中主要有两种CPU占用率检测的方法。

第一种:通过spy工具利用辅助定时器产生中断,并且为每个任务维护一个计数器。然后记下被中断的任务,并且将该任务的计数器加一。经过一段时间后,每个任务的计数器反映了该任务占用CPU利用率的情况。很明显,这是利用抽样技术。并且得到的cpu利用率的准确程度取决于任务的持续性和周期性。

通过查找spyLib.h的文件,我们发现除了spy()函数外,还有一spyCommon函数,带一函数指针参数。推测函数指针类型为(int)(*p)(char * fmtStr,…)(经过验证确实如此)。所以可以写一自己的函数去接受spy需要打印的数据,Spy调用该函数按行打印结果。我们可以不断分析一行字符串来得到我们需要的结果。

int SpyPtnFunc(const char * fmtPtn,...)
{
  char buf[128];

  CPUUSAGEDATAMSG data;

  va_list vl;

  va_start(vl,fmtPtn);

  vsprintf(buf,fmtPtn,vl);  //得到一行字符串。

  va_end(vl);

  //分析buf,得到一个任务的CPU的使用情况。

  return 0;
}

第二种:通过创建两个特殊的任务,一个优先级别最高的任务和一个优先级别最低的任务,在这个优先级别最高的任务里运行一个循环次数很大的循环用于占用所有的CPU时间,记录一段时间内计数值;然后再设置一个优先级别最低的任务,当所有任务都停止时CPU才会调度此任务,此任务记下在无其他任务占用CPU的情况下计数,最后通过算法CPU占用率 = (total -idle)% total。

作者:Surest

一、背景介绍

VxWorks提供了一种错误检测及报告的机制帮助开发者调试软件,6.9版本中称为edr功能。在创建内核时,在workbench组件编辑component configuration中可以找到如下组件

VxWorks 6.9 EDR Component

这个edr功能的特性:在RAM中保留一块内存区域,热启动时不会擦除该块区域的内容,此区域用做edr记录的空间。VxWorks内核在处理CPU、用户以及地址等各种各样的异常时,会在EDR中记录异常发生的任务、地址、堆栈调用、异常触发时间,然后再进行保护机制例如热启动等,当重启发生后,我们可以通过VxWorks提供的show routine在shell中进行查看发生的故障,进行问题回溯。

edr功能记录的种种信息对于我们评估驱动程序、应用程序、调试bug等具有非常大的帮助,但是edr毕竟是在RAM中记录,一旦冷启动,所有的记录信息都会消失。

基于想要保存edr中各种重要的记录的想法,我们可以设置一些列的辅助手段,将EDR中记录的内容写到非易失存储器当中。

二、edr 概要

edr中记录的异常种类极多,但是按照严重级别可以分为几类,如图所示发生异常的事项(Table 14-1),严重级别(Table 14-2),可以注意到有一个envent type是user,这表示edr功能运行开发者在运行时自动触发异常记录,api如下所示。

作者:Surest

1.双斜杠注释

在WorkBench集成开发环境当中,默认的注释方式为/*xxxxxx*/,如果想要使用// 注释的方法必须修改WorkBench的编译选项,为编译选项添加c99支持或者gnu89,在编译选项中添加 -std=c99

VxWorks 6.9 Build Properties for Project

图1 vxWorks Image Project标题

VxWorks 6.9 Build Properties for app

图2 DKM (downloadable kernel module)

2.编译时,可以通过在编译选项中添加-D Debug 增加对代码的宏定义
3.输出路径选择

中断服务程序 ISR

硬件中断处理是实时系统的关键,因为它是外部时间通知系统的方式。 ISR亦称为中断处理函数,是对中断的正确响应。可以使用任何ISR连接到任何没有被VxWorks使用的中断上。当关联的中断发生时,VxWorks运行ISR;ISR的处理不会延迟,除非你配置系统去延迟。

VxWorks的ISR配置

默认支持ISR。但是,中断栈和额外特征可以被配置。此外,ISR的延迟支持和显示函数支持可以被增加到系统。

配置中断栈

所有中断使用相同的中断栈。栈在系统启动时更加配置参数来分配和初始化。它必须足够大来处理最糟糕的嵌套中断的情况。中断栈的大小由ISR_STACK_SIZE参数指定。

注意:一些架构并不支持单独的中断栈,ISR使用被中断的任务的栈。这种架构中,确保创建的任务带有足够的栈空间来处理中断嵌套或普通嵌套的情况。架构是否支持单独中断栈请看BSP。

中断栈填充

默认,中断(和任务)栈一0XEE填充。栈填充在调试中使用checkStack()非常有用。对于开发系统来说,不填充比起填充系能更加。使用VX_GLOBAL_NO_STACK_FILL来启用栈填充。

中断栈保护

系统通过配置INCLUDE_PROTECT_INTERRUPT_STACK组件来提供从栈顶端到底端区域的保护,如果MMU被启用。当任务超出了栈的预定义大小时,将产生溢出,这能保证数据完整性,不会破坏其它栈和数据。对于向下增长的架构,可以防止缓存溢出损坏栈上面的内存。当任务企图访问任何保护区域,CPU将产生异常。当包含区域被插入时,它的大小总是被圆整为MMU页的整数倍。

包含区域大小通过下面的参数来定义:

  • INTERRUPT_STACK_OVERFLOW_SIZE -- 中断栈的溢出大小
  • INTERRUPT_STACK_UNDERFLOW_SIZE -- 中断栈的下溢大小

如果系统的尺寸有问题,本组件可以在最终阶段或生成阶段移除。设置参数为0来阻止响应的保护区的插入。

增加显示函数支持

为了增加isrShow函数需要配置INCLUDE_ISR_SHOW组件。

编写ISR

编写ISR的基本原则是仅可能短。耗时的活动不应该放在ISR中。