最近研究了一下VxWorks 7.0下基于vxbus的定时器子系统,方便我们在需要使用定时器中断的时候引用,开发过程中的一点体会记录下来,如果由理解不对或者不全面的望批评指正,谢谢。

开发平台为zynq7Z020,该处理器由三个全局的定时器,分别是globaltimer,ttc_0,ttc_1,其中全局定时器用作系统的脉搏,是整个操作系统的ticks定时器,其可通过内核配置完成,具体如下:

VxWorks 7.0 vxbus Timer

而ttc_0会作为系统的AUX clock在初始化的时候完成匹配,系统使用SPY命令时启用定时器,所以,如果要使用TTC0作为应用,要考虑spy调试对其影响,TTC_1可以作为用户自定义定时器使用,挂接用户中断服务例程。其设备树配置如下:

风河拥抱物联网演讲

下载地址

Files:
Date 2021-10-02
File Size 6.66 MB
Download 36

 代码供学习参考,请仔细阅读代码中的注释

 
 
#include <vxWorks.h> 
#include <spyLib.h> 
#include <stdio.h> 
#include <ioLib.h> 
#include <stdarg.h> 
#include <taskLib.h> 
#include <sysLib.h> 
#include <string.h> 
 
#define SPYTASKSMAX 100 
 
int data_ana(const char*,...); 
 
/* 函数功能: 检测CPU使用率并调用data_ana函数进行处理,最后将使用率打印在shell 上,也可通过重定向打印 
 * 在别的位置,main函数直接调用该函数即可 
 * 输入参数: 
 * 返回值: 0 
 */ 
int CPU_utilization(void) 
{ 
    spyLibInit(SPYTASKSMAX);//初始化spy,最大可spy任务数为SPYTASKSMAX 
    spyCommon(5,100,(FUNCPTR)data_ana);//此例程收集任务活动数据并定期运行spyReport()。数据每秒被收集几次,每几秒钟都会生成一个报告。如果freq为零,则默认为5秒。如果ticksPerSec被省略或为零,则默认为100s 
    return 0; 
} 
 
/* 函数功能: 可以向不同ip地址发送udp信息 
 * 输入参数: const char* fmtPtn,... 该参数为不定长参数,其所有参数类型均为const char*,通过 
 * v1指针循环赋给rbuf,从而得到spy函数在shell上输出的每行内容,从而在经过处理行内容 
 * 后得到cpu的使用率 
 * 返回值: 0 
 */ 
int data_ana(const char* fmtPtn,...) 
{ 
    char rbuf[256]; 
    const char* IDEL = "IDLE"; 
    char percent[50]; 
    int i=0; 
    int j=0; 
    int p; 
    va_list vl; 
    va_start(vl,fmtPtn); 
    vsprintf(rbuf,fmtPtn,vl); //将v1按格式fmtptn写入字符串buf中,得到一行字符串。 
 
    if(strstr(rbuf,IDEL)!= NULL) 
        /* 
         IDLE占用率表示cpu空闲占比,spy输出信息中,有一行是idel的值,得到该值后用100减去它,就得到cpu使用率 
     */ 
    { 
        printf("%s\n",rbuf); 
 
        for(i=0;(i<256)&&(rbuf[i] != '%');i++) 
        { 
     
            if(rbuf[i]>='0'&&rbuf[i]<='9') 
                { 
                    percent[j] = rbuf[i]; 
                    j++; 
                } 
        } 
        percent[j]='\0'; 
        //printf("CPU free percent= %s \n",percent); 
        p=atoi(percent); 
        printf("CPU use percent= %i%%\n",100-p); 
    } 
    va_end(vl); 
    return 0; 
} 

i 显示任务基本信息,参数为0时显示全部任务。

ti 显示任务的TCB信息。

d 显示目标地址内存内容。

devs 列出目标机系统上的全部设备。

version 显示VxWorks版本号。

memShow 显示系统内存空间中空闲和已分配空间的总数等信息。

memPartShow 显示系统内存分区块和统计信息。

moduleShow 显示已加载的所有模块

iosDevShow 显示系统设备的信息。

iosDrvShow 显示系统驱动程序的信息。

semShow 显示信号量的信息。

regsShow 显示所有寄存器信息。

taskShow 显示任务TCB信息。

taskRegsShow 显示任务寄存器的内容。

coreShow 显示CPU频率、DDR频率、system频率、一级缓存、二级缓存、MSR寄存器信息等。

coreLbcShow 显示LBC控制器寄存器详细信息。

vxBusShow 显示vxBus的详细信息。

pciConfigTopoShow 显示PCI配置信息。

pciDevShow [pci设备号] 显示指定的pci设备信息。

TempratureShow 显示当前温度。

-> cmd 进入命令模式

[ VxWorks ] C 退出命令模式

格式化并恢复文件系统:

1. [cmd] sysTffsFormat

2. [cmd] cd FlashVolume

3. [cmd] file create -d FILE_DIR

4. [cmd] cd FILE_DIR

5. [cmd] ftp ip_addr,并输入用户名和密码登录

6. ftp> cd 需要下载的文件所在目录

7. ftp> binary (下载.ini文件时切换到binary模式)

8. ftp> get FILE

9. ftp> quit

10. [cmd] ls -l (查看所下载文件大小是否和FTP Server端的文件大小一致,以防下载出错

目的:

本实验演示了如何使用VxWorks下的timex()函数来计算一个程序执行的时间。

语法:

void timex(FUNCPTR function_name, int arg1, .., int arg8)

注意: timex函数的第一是参数是指向将被计时的程序的函数指针

实验原理:

 


#include "vxworks.h" /* Always include this as the first thing in every program */
#include "timexLib.h"
#include "stdio.h"

#define ITERATIONS 200

int printit (void);

void timing ()
{

/* Function to perfrom the timing */
FUNCPTR function_ptr = print;
timex(function_ptr, NULL,NULL,NULL,NULL,NULL,NULL,NULL); /* Timing the "print" function */
}

int print(void) /* Function being timed */
{
int i;
for(i=0; i<ITERATIONS; i++) /* printing the task id number and the increment Variable "i" */
printf("Hello, I am task %d and is i = %d\n", taskIdSelf(), i);
return 0;
}