By 高焕堂 2011/09/09  

[ IT史上最完整、最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ] 

[ 請指教:高老師的免費on-line教學視頻 ] 

                                                                                                            

[Go Back] 

 

天字第一号框架模式与Android/Linux 驱动开发  

5.  撰写Client应用程序(App)

5.1  撰写app应用程序代码

      此应用程序代码如下:

 

/*  app应用程序  */

#include <stdio.h>

#include <fcntl.h>

#define DEVFILE "/dev/androidin"

#define BUFLEN 128

 

int main() {

    int fd = 0;

    int in[2] = {134, 2567};

    int out = 0;

    fd = open(DEVFILE, O_RDWR);

    if(fd == 0)

         printf("open '/dev/add' failed!\n");

    printf("fd:%d\n", fd);

    write(fd, in, sizeof(in));

    read(fd, &out, sizeof(out));

    close(fd);

    printf("Input:%d %d\n", in[0], in[1]);

    printf("Output:%d\n", out);

    return 0;

}

 

5.2  app透过system call呼叫add_open()函数

       执行到app应用程序里的指令:

                 fd = open(DEVFILE, O_RDWR);

 此时,呼叫到add_open()函数,执行其内含的指令:

                 filp->private_data = &adder;

                 adder.common = filp;

建立了两个对象的密切关系。

   

    图13、体现类别继承的对象间关系

     这两个对象间的结构,实际支撑了file与add_file两个类别之间的继承关系。此时,轮胎(即adder对象)已经装配完成了。 接着,继续执行到app应用程序代码:

         write(fd, in, sizeof(in));

         // ……..

就呼叫到add_file类别的add_write()函数,执行此函数内含的指令:

            retval = copy_from_user(data, buf, count); 

将app里的数据(存于buf内)考贝到add_file对象内的data变量里。接着,继续执行到app应用程序代码: 

            read(fd, &out, sizeof(out)); 

就呼叫到add_file类别的add_read()函数,执行此函数内含的指令: 

            int sum = data[0] + data[1];

            //……….

            retval = copy_to_user(buf, &sum, sizeof(int));

先进行加法运算,结果存于sum变量里。再将sum里的值考贝到app应用程序的buf里。最后,继续执行到app应用程序代码:

            printf("Input:%d %d\n", in[0], in[1]);

            printf("Output:%d\n", out); 

就将加法计算的结果打印出来了。 

                                                                                                            

[Go Back]