在嵌入式系统中,驱动都是以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嵌入式软件架构设计。谢谢!

SoC嵌入式软件架构设计之六:API设计方法的更多相关文章

  1. SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...

  2. SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...

  3. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  4. SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则

    上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法.新设计的内存管理管理单元要实现虚拟内存管理还须要操作系统.代 ...

  5. SoC嵌入式软件架构设计之七:嵌入式文件系统设计

    嵌入式的系统区(system disk,SD)包含操作系统.驱动.中间件.应用和字库.UI资源等文件,本文讲述SD区的文件系统设计.文件系统最基本的目标是为了实现单个文件的定位和读写.由于一般代码都是 ...

  6. 出色的 JavaScript API 设计秘诀

    设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的AP ...

  7. Matlab 中 Data-driven 风格的 API 设计

    设计 所谓 data-driven API,指的是用户可以把"操作"作为参数,传入函数,像下面这种: stream = dataStream('load', 'example.cs ...

  8. atitit.api设计 方法 指南 手册 v2 q929.docx

    atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...

  9. RESTful API设计方法

    1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...

随机推荐

  1. 安装Team Services Agent Win7

    现状:项目现时使用的是Team Services,使用Team Services可以控制其中的一台Build Server,从Github提取代码,并在Build Server进入编译打包处理(son ...

  2. C指针详解

    前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其 ...

  3. CF 999B. Reversing Encryption【模拟/string reverse】

    [链接]:CF [代码]: #include<bits/stdc++.h> #define PI acos(-1.0) #define pb push_back #define F fir ...

  4. 9、Django实战第9天:用户注册功能

    今天完成的是用户注册功能... 首先把注册页面的前端文件register.html复制到templates目录下 编辑users.views.py,创建一个注册的类 class RegisterVie ...

  5. Struts2遇到Caused by Action class not found这类问题怎么解决

    刚才碰到个小坑,显示的错误是struts.xml找不到Action,明显不会有错的因为之前还是正常跑起来的,然后百度google搜了一通没解决,maven clean用了没反应还是照样报错. 最后在百 ...

  6. 表(Table)

    虽然我们已经将不同用途的物品保存在不同的仓库中了,但是在同一个仓库中数据的保存仍然存在问题.比如食品分为熟食.生肉.大米等,如果把他们随意的堆放在一起,就会造成我们无法很容易的对这些食品进行管理,当要 ...

  7. [APIO2015]巴厘岛的雕塑

    题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 Y ...

  8. 解决ubuntu系统中wireshark:Couldn't run /usr/bin/dumpcap in child process: Permission denied的问题

    ubuntu系统运行WIreshark的时候,出现如下错误: Couldn't run /usr/bin/dumpcap in child process: Permission denied 解决办 ...

  9. python基础-协程函数、递归、模块、包等内容

    1. 协程函数 1.1 yield基本用法 yield作用 1.把函数的执行结果封装好,即封装__iter__和__next__,即得到一个迭代器 2.与return功能类似,都可以返回值,但不同的是 ...

  10. 在energia中添加新的库

    很多时候energia提供的库不能够满足我们的需要,这个时候我们就要自己添加库到energia中.方法如下: 在energia目录下找到hardware目录 选择对应的单片机型号文件夹进入 进入lib ...