短期运维大数据分析运维培训那家最好

&在嵌入式系统中,驱动都是以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;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 位于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的地址执行,此即进行实际的接口调用。整个过程完成。
阅读(...) 评论()当前位置: >
以下描述中,()不是嵌入式操作系统的特点。
A.面向应用,可以进行裁剪和移植
B.用于特定领域,不需要支持多任务
C.可靠性高,无需人工干预独立运行,并处理各类事件和故障
D.要求编码体积小,能够在嵌入式系统的有效存储空间内运行
所属学科:
试题类型:客观题
所属知识点:
试题分数:1.0 分
用户编号:8294486笔记时间: 22:52
笔记内容:& & 嵌入式,无领域的,同一硬件的系统升级,都要对应修改,不同于一般的软件升级。
&&&&&&&&&&&&&&&希赛网 版权所有 & &&嵌入式软件架构设计-嵌入式系统-与非网
  模块划分的&划&是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:
  (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
  (2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
  (3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
  (4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:
/*module1.h*/
int a = 5; /* 在模块1的.h文件中定义int a */
/*module1 .c*/
#include &module1.h& /* 在模块1中包含模块1的.h文件 */
/*module2 .c*/
#include &module1.h& /* 在模块2中包含模块1的.h文件 */
/*module3 .c*/
#include &module1.h& /* 在模块3中包含模块1的.h文件 */
  以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。正确的做法是:
/*module1.h*/
/* 在模块1的.h文件中声明int a */
/*module1 .c*/
#include &module1.h& /* 在模块1中包含模块1的.h文件 */
int a = 5; /* 在模块1的.c文件中定义int a */
/*module2 .c*/
#include &module1.h& /* 在模块2中包含模块1的.h文件 */
/*module3 .c*/
#include &module1.h& /* 在模块3中包含模块1的.h文件 */
  这样如果模块1、2、3操作a的话,对应的是同一片内存单元。
  一个嵌入式系统通常包括两类模块:
  (1)硬件驱动模块,一种特定硬件对应一个模块;
  (2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
  多任务还是单任务
  所谓&单任务系统&是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地&同时&执行多个任务。
  多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB还被用来存放任务的&上下文&(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。
  嵌入式多任务OS的典型例子有Vxworks、ucLinux等。并非遥不可及的神坛之物,我们可以用不到1000行代码实现一个针对80186处理器的功能最简单的OS内核,作者正准备进行此项工作,希望能将心得贡献给大家。
  究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。
单任务程序典型架构
  (1)从CPU复位时的指定地址开始执行;
  (2)跳转至汇编代码startup处执行;
  (3)跳转至用户主程序main执行,在main中完成:
  a.初试化各硬件设备;
  b.初始化各软件模块;
  c.进入死循环(无限循环),调用各模块的处理函数
  用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循环,其首选方案是:
  有的程序员这样写:
  这个语法没有确切表达代码的含义,我们从for(;;)看不出什么,只有弄明白for(;;)在C语言中意味着无条件循环才明白其意。
  下面是几个&著名&的死循环:
  (1)操作系统是死循环;
  (2)WIN32程序是死循环;
  (3)嵌入式系统软件是死循环;
  (4)多线程程序的线程处理函数是死循环。
  你可能会辩驳,大声说:&凡事都不是绝对的,2、3、4都可以不是死循环&。Yes,you are right,但是你得不到鲜花和掌声。实际上,这是一个没有太大意义的牛角尖,因为这个世界从来不需要一个处理完几个消息就喊着要OS杀死它的WIN32程序,不需要一个刚开始RUN就自行了断的嵌入式系统,不需要莫名其妙启动一个做一点事就干掉自己的线程。有时候,过于严谨制造的不是便利而是麻烦。君不见,五层的TCP/IP协议栈超越严谨的ISO/OSI七层协议栈大行其道成为事实上的标准?
  经常有网友讨论:
printf(&%d,%d&,++i,i++); /* 输出是什么?*/
c = a+++b; /* c=? */
  等类似问题。面对这些问题,我们只能发出由衷的感慨:世界上还有很多有意义的事情等着我们去消化摄入的食物。
  实际上,嵌入式系统要运行到世界末日。
  中断服务程序
  中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
  中断服务程序需要满足如下要求:
  (1)不能返回值;
  (2)不能向ISR传递参数;
  (3) ISR应该尽可能的短小精悍;
  (4) printf(char * lpFormatString,&)函数会带来重入和性能问题,不能在ISR中采用。
  在某项目的开发中,我们设计了一个队列,在中断服务程序中,只是将中断类型添加入该队列中,在主程序的死循环中不断扫描中断队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。
/* 存放中断的队列 */
typedef struct tagIntQueue
int intT /* 中断类型 */
struct tagIntQueue *
IntQueue lpIntQueueH
__interrupt ISRexample ()
intType = GetSystemType();
QueueAddTail(lpIntQueueHead, intType);/* 在队列尾加入新的中断 */
  在主程序循环中判断是否有中断:
If( !IsIntQueueEmpty() )
intType = GetFirstInt();
switch(intType) /* 是不是很象WIN32程序的消息解析函数? */
/* 对,我们的中断类型解析很类似于消息驱动 */
case xxx: /* 我们称其为&中断驱动&吧? */
  按上述方法设计的中断服务程序很小,实际的工作都交由主程序执行了。
硬件驱动模块
  一个硬件驱动模块通常应包括如下函数:
  (1)中断服务程序ISR
  (2)硬件初始化
  a.修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);
  b.将中断服务程序入口地址写入中断向量表:
/* 设置中断向量表 */
m_myPtr = make_far_pointer(0l); /* 返回void far型指针void far * */
m_myPtr += ITYPE_UART; /* ITYPE_UART: uart中断服务程序 */
/* 相对于中断向量表首地址的偏移 */
*m_myPtr = &UART _I /* UART _Isr:UART的中断服务程序 */
  (3)设置CPU针对该硬件的控制线
  a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号;
  b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。
  (4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。
  C的面向对象化
  在面向对象的语言里面,出现了类的概念。类是对特定数据的特定操作的集合体。类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的&类&。下面的C程序模拟了一个最简单的&类&:
#ifndef C_Class
#define C_Class struct
C_Class A *A_ /* this指针 */
void (*Foo)(C_Class A *A_this); /* 行为:函数指针 */
/* 数据 */
  我们可以利用C语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。C模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用C语言编程时程序整体框架结构分散、数据和函数脱节的问题。我们在后续章节会看到这样的例子。
  本篇介绍了嵌入式系统编程方面的知识,主要包括模块划分、多任务还是单任务选取、单任务程序典型架构、中断服务程序、硬件驱动模块设计等,从宏观上给出了一个嵌入式系统软件所包含的主要元素。
  请记住:软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
在本文中,我们将讨论你在为微控制器或无线微控制器项目选择一套优秀的软件时,所需要考虑的各种要素。
发表于: 09:07:55
每年,全球有数以十亿计内置软件系统的新设备出货,而物联网技术和嵌入式操作系统则为这些设备的运行提供支持。据VDC Research公司预测,嵌入式操作系统出货量,将从2016年的133亿增加到2020年的193亿,市场竞争非常激烈。在这里,我要和大家分享一条好消息:根据VDC Research公司最新的调查结果,按照营收排名,风河在实时操
发表于: 20:16:00
在电子科技行业领域,技术进步永远是最大的推动力量,只有创新,才能真正打破格局。2016年将近尾声,这一年里,致远电子带给行业哪些革命性突破呢?来回顾一下致远电子2016年七大事件,总结过去,放眼未来!
发表于: 15:39:57
电子设计自动化技术的领导厂商 Mentor Graphics近日发布一份题为《嵌入式软件正加速当今汽车的连接和创新》的研究报告。
发表于: 20:12:00
领先的体验设计与数字产品开发公司GlobalLogic近日宣布,该公司收购深受喜爱的嵌入式软件领导者REC Global(总部位于波兰)。
发表于: 08:50:00
东芝宣称它拥有销售其存储器芯片业务的所有权利,并告诫称,如果需要,它将把西部数据的员工从现在的合资公司中赶出。
发表于: 15:41:24
有鉴于智能家居算是物联网的最佳实践场域之一,物联网把很多装置与服务链接在一起,其背后代表的也就是各自拥有的产业。
发表于: 11:14:55
关于西数上述抗议举动,东芝也正式作出回应。东芝在书信中表示,西数错误解读双方的合资契约内容,主张东芝拥有可出售其半导体事业的权力,且提出,若西数在5月15日以前没有停止妨碍招标的行为的话,就不会让西数员工再进到四日市工厂。
发表于: 11:06:25
内存是半导体的主力产品之一,目前主要由动态随机存取内存(DRAM)及具备非挥发特性的NAND闪存(Flash)为最重要的两项产品。
发表于: 09:03:01
下一代存储器大战开打,英特尔研发“3D cross point”技术,拟推“PRAM”。三星电子不甘示弱,发布“MRAM”(magnetoresistant random access memory、磁阻式随机存取存储器),号称读写速度比NAND flash快上一千倍。
发表于: 08:54:38
芯片老大位置该谁坐了……
它集“快、强、小”三大优势为一身,不分正反面的接口设计,解决了“USB永远插不准”的世界性难题,充电、数据传输、视频输出、各种扩展外设统统胜任,已然是USB接口的划时代产品。它就是随着苹果Macb
20:00:00AVX大咖来下,会给大家分享如下内容:钽电容产品技术、常见异常分析、最新的产品技术以及市场应用,AVX公司简介以及基本营业情况
今天主讲人将分享刚完成的产品级项目——家庭环境参数检测仪DIY设计。2.4寸TFT彩屏显示,其功能同时支持实时温度检测、湿度检测、PM2.5检测、甲醛检测以及当前时间显示,快来听听主讲人的设计思路
RISC-V是由U.C. Berkeley开发的自由的和模块化的RISC指令集,经过数年的发展RISC-V正变得越来越流行。第六届RISC-V Workshop将在5月8日至11日在上海交通大学举
20:00:00以前,嵌入式MCU功能简单、种类较少,软件开发起来相对容易,而今天,MCU功能强大、种类繁多,软件中实现的功能也要比以前更多更复杂。此次课程,针对基于ARM的STM32 MCU,将利用STM32cub
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号}

我要回帖

更多关于 大数据运维需要学什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信