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嵌入式软件架构设计。谢谢!
SoC嵌入式软件架构设计之六:API设计方法的更多相关文章
- SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则
上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法.新设计的内存管理管理单元要实现虚拟内存管理还须要操作系统.代 ...
- SoC嵌入式软件架构设计之七:嵌入式文件系统设计
嵌入式的系统区(system disk,SD)包含操作系统.驱动.中间件.应用和字库.UI资源等文件,本文讲述SD区的文件系统设计.文件系统最基本的目标是为了实现单个文件的定位和读写.由于一般代码都是 ...
- 出色的 JavaScript API 设计秘诀
设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的AP ...
- Matlab 中 Data-driven 风格的 API 设计
设计 所谓 data-driven API,指的是用户可以把"操作"作为参数,传入函数,像下面这种: stream = dataStream('load', 'example.cs ...
- atitit.api设计 方法 指南 手册 v2 q929.docx
atitit.api设计 方法 指南 手册 v2 q929.docx atitit.api设计原则与方法 1. 归一化(锤子钉子理论)1 1.1. 链式方法2 1.2. 规则5:建立返回值类型2 1. ...
- RESTful API设计方法
1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...
随机推荐
- docker从零开始(一)centos获取安装docker-ce
卸载旧版本 较旧版本的Docker被称为docker或docker-engine.如果已安装这些,请卸载它们以及相关的依赖项. centos7 yum安装的docker就是docker-engine ...
- 怎么将string list 转成有特殊字符分开字符串
https://stackoverflow.com/questions/4021851/join-string-list-elements-with-a-delimiter-in-one-step Y ...
- 使用 gulp 压缩 JS
使用 gulp 压缩 JS 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 压缩 js 代码可降低 js 文件大小,提高页面打开速度.在不利用 gulp 时我们需要通过各种工具手动完成 ...
- svn泄漏敏感信息利用方式
之前仅知道svn权限配置不当,会导致敏感信息泄漏,但是一直不知道具体利用方式. 今天测试svn dig时抓包分析才知道: http://www.xxx.com/路径/.svn/text-base/文件 ...
- Nodejs Express下载文件,并保存成原文件
现时需要开发一个Excel下载功能 后台有一个API,负责接收传入的JSON文件,生成带图片的Excel文件在临时目录(生成Excel使用npm exceljs库),并将文件通过Router返回 前台 ...
- POJ 1321 棋盘问题 (DFS + 回溯)
题目链接:http://poj.org/problem?id=1321 题意:中文题目,就不多说了...... 思路: 解题方法挺多,刚开始想的是先从N行中选择出来含有“#”的K行,再在这K行中放置K ...
- Python_Tips[7] -> 偏函数
偏函数 / Partial Function 使用偏函数可以对函数的部分预先知道的参数进行冻结,从而缓存函数参数,而在运行时再释放参数进行使用.所以偏函数适用于需要多次调用同样一个函数且其中一个参数固 ...
- 第3天-DIV+CSS布局
盒子模型 margin 设置外边距宽度 有4个值的时候: maigin 10px 5px 15px 20px; (上.右.下.左)有3个值的时候: margin: 10px 5px 15px; (上. ...
- 27、Django实战第27天:全局搜索功能开发
当我们选择其中一个类别(公开课,课程讲师,授课老师),输入搜索内容,点击搜索后会跳转到相应的列表页中进行展示 我们输入的内容作为参数keyword传入后台 搜索"公开课" 当课程中 ...
- python requests的安装与简单运用(转)
http://www.cnblogs.com/fightformylife/p/4134986.html http://cn.python-requests.org/zh_CN/latest/ htt ...