• 怎样将runlmbench 获取的数值传给上层app


    前面那个随笔 , 已经成功将runlmbench 移植到了Android , 并成功的运行。

    今天就写一下将runlmbench 获取的那些性能值传给上层 App 进行人机交互。

    一开始 , 我是想直接将runlmbench 的源代码添加到jni 直接给上层App 使用 , 但是发现有些很重要的函数不能使用 , 比如 signal 函数。

    然后 , 移植源代码的方式行不通 , 我就想选择利用exec的方法 去运行runmbench 的命令 ,但是,昨天那个随笔就是发现了这个方法的不足 。

    它只能返回0 ~ 255 的值 , 而内存的测试那一块速度是不止 255MB/S 的 , 而且 , 通过Linux 提供的缓冲区的功能 , 大文件的读写速度

    也有可能超过300MB/s , 所以, 这个方法也不是很行。后来 , 我想通过进程间通信的方法 , 但是发现做起来很麻烦,修改的runmbench 

    源代码太多 , 效率不高 , 最后 , 选择一个指定的文件 , 让runlmben获取的数据写到那个文件 , 每次覆盖的写 ,然后我的上层jni 代码

    用system 函数去执行runlmben 的命令 , 然后去读那个指定文件的数据 ,这样 , 就成功的将文件系统层的命令获取的数据传到上层App , 

    这里面做了很多投机取巧的部分 , 但是这是我目前所能找到的最高效最简洁的方法。而且这里面还涉及到一些文件权限问题 , 下面就讲一下

    我是怎么解决这些问题的.

    第一步 , 修改runlmbench 源代码 , 让它将数据写到某个特定的文件中 , 我指定的文件是 /data/local/bw_file.txt

    我是针对bw_file_rd  命令进行的一个修改:有下面几个改动:

      1. 在 lib_timing.c 文件中:

      把函数bandwidth 函数改为有返回值:

    1 double bandwidth(uint64 bytes, uint64 times, int verbose) 

      返回double 型,当然这里还要在头文件中进行修改。

      在最后面 , 将速度返回出来:  

    1     return mb/secs ; 

      

      2. 在bw_file_rd.c 文件中 , 在main函数最后 ,加上这几句代码:

     1     speed = bandwidth(count, get_n() * parallel, 0);                            
     2                                                                                 
     3     printf("speed : %lf
    " , speed) ;                                           
     4                                                                                 
     5     fd = open(save_file , O_RDWR | O_TRUNC | O_CREAT , 0777) ;                  
     6     if (fd == -1)                                                               
     7     {                                                                           
     8         perror("oepn failed") ;                                                 
     9     }                                                                           
    10                                                                                 
    11     val = write(fd , (char *)&speed , sizeof(double)) ;                         
    12                                                                                 
    13     close(fd) ;                                                                 

      speed 是一个double 型, char *save_file = "/data/local/bw_file.txt" ;

      

      最后 ,重新编译把命令写到文件系统内。

      第二步 , 添加开机启动shell 命令 , 因为是在上层要去调用文件系统层的命令 , 所以,我们要在开机启动的时候做两个事情,创建两个文件,给这两个文件进行加权限

      参考http://blog.csdn.net/dashon2011/article/details/18663743

      其实我是用了以前剑锋在Android 编译环境下添加的开机启动脚本里面加了一些东西

      首先 , 添加开机启动文件: myandroid/device/fsl/imx6/etc/init.rc 

      在这个文件内 , 加了这么一段话: 这句话大概在712行

      

    1 # zengjf 2015-12-31 add for ublox                                               
    2 # Prepare u-blox RIL repository                                                 
    3 service uril-repo /system/bin/uril-repo.sh                                      
    4     class main                                                                  
    5     user root                                                                   
    6     group radio                                                                 
    7     oneshot                                     

     

      然后 , 找到文件/system/bin/uril-repo.sh

      在适当的位置加上一句话:

      

    1 #change by chen - 2016-8-10 -                                                   
    2                                                                                 
    3 touch /data/file.tmp                                                            
    4 chmod 777 /data/file.tmp                                                        
    5 touch /data/local/bw_file.txt                                                   
    6 chmod 777 /data/local/bw_file.txt                                               
    7 dd if=/dev/zero of=/data/file.tmp bs=10000 count=10000                          

      创建两个文件 , 并对bw_file.txt 进行0赋值。

      重做文件系统 ,开机 ,就有那两个文件以及runlmbench 的一系列的命令。

     

      下面是第三步 , 在jni层写代码

      代码不多 , 也就几句话:

     1 #include "bw_surface.h"
     2 
     3 #define BUFF_LEN 512
     4 
     5 double bw_surface(char *argv1 , char *argv2)
     6 {
     7     int fd, readlen ;
     8     double buffer ;
     9     int retval ;
    10 
    11     char command[BUFF_LEN] = "bw_file_rd";
    12     char *willrd_file = "/data/local/bw_file.txt";
    13     char *tmp_file = "/data/file.tmp";
    14 
    15     strcat(command, " ");
    16     strcat(command, argv1);
    17     strcat(command, " ");
    18     strcat(command, argv2);
    19     strcat(command, " ");
    20     strcat(command, tmp_file);
    21 
    22     retval = system(command) ;
    23     if (retval == -1)
    24     {
    25         return -1 ;
    26     }
    27 
    28     fd = open(willrd_file , O_RDWR);
    29     if (fd == -1)
    30     {
    31         return -2 ;
    32     }
    33 
    34     readlen = read(fd , (char *)&buffer , sizeof(double)) ;
    35     if (readlen < 0)
    36     {
    37         close(fd) ;
    38         return -3 ;
    39     }
    40 
    41     close(fd) ;
    42 
    43     return buffer ;
    44 }

    返回值为一个double ,为emmc 每秒的带宽 , 其实这也有系统缓冲区的作用 , 这只能是测一个大概的值。

      

      

  • 相关阅读:
    kettle的转换组件
    kettle的输出组件
    js的touch事件的实际引用
    touchstart,touchmove,touchend触摸事件的小小实践心得
    Android使用ViewPager实现左右循环滑动及轮播效果
    jQuery漂亮图标的垂直导航菜单
    c#使用WebClient登录网站抓取登录后的网页
    从网页抓取数据的一般方法
    c#通过oledb获取excel文件表结构信息
    c#中高效的excel导入sqlserver的方法
  • 原文地址:https://www.cnblogs.com/chenfulin5/p/5759817.html
Copyright © 2020-2023  润新知