zoukankan      html  css  js  c++  java
  • SoC嵌入式软件架构设计之六:API设计方法

               在嵌入式系统中,驱动都是以API的方式提供给应用进行调用。这里介绍嵌入式系统的API设计和管理方法。

           驱动在系统中会按模块进行分类,比如按键驱动、LCD驱动、文件系统、card驱动、I2C驱动等等;每一个模块又有多个接口,比如LCD驱动有光标定位、画点、画直线等。而文件系统有fread、fwrite、fseek、fopen等接口。

    下面举例将以文件系统的fopen为例,工具链为mips。

    一、API设计方法

           1. 驱动接口声明:extern FILE * fopen(const char * path,const char * mode),位于fs.h中

           2. 驱动接口定义:FILE * open(const char * path,const char * mode){...},位于fs.c中

           3. 驱动接口API: fopen :li  v1,FILE_OPEN;

                                                      syscall;  位于api.S中。是汇编代码。

           4. 驱动接口函数指针数组:struct file_operations fs_fops {

                                                          open,read,write,seek};

           5. 文件系统被载入时,会将文件系统的接口函数指针数组fops注冊到系统的API管理数组中。

           6. 系统对驱动进行分类管理。其有一个记录各个驱动接口函数指针数组基址的数组。各个驱动事先按顺序进行约定,如数组的第一个元素就是按键驱动的key_fops。而第二个就是LCD驱动的lcd_fops,以此类推。

    某个驱动被载入时。驱动会把相应的fops通过API管理的接口记录到该数组的相应位置。

               这个约定通常会在api.h中,如#define KEY 0 //表示key驱动是约定在数组的第一个位置,  #define FS 2//表示FS是约定在数组的第三个位置            

           7. FILE_OPEN定义:#define FILE_OPEN (FS<<N)+0 。在fs.h中。表示fopen是文件系统提供的第一个接口。这个常量包括两部分信息,一是文件系统在API管理中的索引。二是该接口在自己驱动接口中的索引。

           8. 应用调用时。path和mode等形參会压入栈。然后进入fopen的API,其将FILE_OPEN常量赋值给v1,通过syscall陷入到异常,进行内核态。这时即能够进入到API管理中,API依据FILE_OPEN提供的两部分信息能够迅速找到open的地址,异常返回时即跳到open的地址运行,此即进行实际的接口调用。整个过程完毕。

     

           请关注本人原创的嵌入式架构设计专栏:SoC嵌入式软件架构设计。谢谢!

     

     

     

     

     

     

     

     

     

     

             

  • 相关阅读:
    [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串
    [LeetCode] Number of Segments in a String 字符串中的分段数量
    [LintCode] Longest Common Prefix 最长共同前缀
    [LintCode] Product of Array Except Self 除本身之外的数组之积
    [LintCode] Best Time to Buy and Sell Stock 买卖股票的最佳时间
    [LintCode] Sort List 链表排序
    [LintCode] Find Peak Element 求数组的峰值
    [LintCode] Container With Most Water 装最多水的容器
    [LintCode] Linked List Cycle 单链表中的环
    [LeetCode] 465. Optimal Account Balancing 最优账户平衡
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6815706.html
Copyright © 2011-2022 走看看