写在最后
姗姗来迟的第五期(天太冷了,搭模型、写文章也需要毅力)。
本期将是2021年的收官,也将是MBD实战之电机控制系列的最后一期。这一期将介绍如何将模型生成的代码集成到已有的代码中去——把算法模型嵌入你的代码之中去。
1 集成式的MBD开发方式
这个话题这前面的文章中提过了很多次,之所以频繁的提及这种集成的方法,是因为这是目前MBD(Model-Based Design,基于模型的设计)的主流开发方式。
具体而言,集成式MBD的开发方法是:软件代码手写一部分,模型生成一部分,然后再将两部分集成在一起,从而实现完整的软件开发。
手写代码和模型生成有着不同的分工:
手写代码:适用于底层驱动、外设初始化、内存管理、中断管理、OS、Bootloader、协议栈等,还包括片外扩展IC的初始化,以及其他数学特征不明显的功能;
模型生成:适用于数学算法、状态机、数据处理等。
Tips:为了便于区分,本文将手写的代码称为底层代码,而模型生成的代码称为模型代码。底层代码负责的模块并不一定全部都是必须的,例如OS(嵌入式中一般使用实时 *** 作系统,比如FreeRTOS),很多控制可能不需要OS,只需要中断管理即可。
可以看出,底层代码负责的功能,并不适合使用模型来实现。上一期给出的完全由模型实现的电机控制框架,虽然实现了电机控制,但实际上忽略了很多实际项目中必须的模块晌腊,例如OS、Bootloader等,还有很多安全机制也没有考虑。
底层代码功能理论上也能通过模型来实现,但没必要、也不需要用模型的方式来实现。MathWorks官方也一直推荐仅使用Simulink/MATLAB搭建算法模型,像底层驱动、内存管理、OS、Bootloader、协议栈等等,还是通过手写闹租代码液谨兆的方式更为高效。
这一点我有直接咨询过MathWorks的工程师,他告诉我底层代码要通过模型来实现,其难点在于TLC语言的复杂性和硬件芯片的多样性(市面上的芯片太多,每一个都需要适配),这两点没有专业的团队,很难实现模型的高效性。
Tips:我有了解到,有的公司利用StateFlow实现了类似于OS的Task Manager,用于管理模型中的不同任务。其构成也是相当复杂,没有专门的团队是没办法开发和维护的。但也仅限于任务调度——我感觉像复杂的状态机,OS的很多功能是没办法用StateFlow实现的。
对于有复杂算法的软件,MBD代码生成就可以大显身手了,算法越复杂,优势就越显著。举一些例子,如:电机控制、电池管理系统(BMS)、路径规划、紧急制动(AEB)、自动泊车(APS)等算法,其算法实现都可以通过MBD的方式来开发。
用MBD来开发算法,简单总结有如下优势:
便于算法实现和调整:这里指的并不是找Bug,算法的数学表达可能是固定的,但在特定的应用场景下,算法的局部需要特定调整,例如添加状态机实现不同状态的切换。借助模型的图形化,以及MATLAB/Simulink上的各种工具箱,这种调整是很直观,并且很容易实现。
专注算法且算法独立:使用模型搭建算法,我们只需要专注算法实现的本身,不需要考虑底层驱动等因素;由于不考虑底层驱动,算法模型可以方便地实现移植。有人说算法的核心是数学,写代码往往并不太容易兼顾数学,但搭建模型可以。
便利的仿真测试:算法的测试对于优化算法是非常强有力的途径,通过MBD,可以方便的实现MIL、SIL、PIL和HIL,根据测试结果,反馈到模型中,再对模型进行调整,这其中的效率是手写代码无法比拟的。
我自己是有完全手写代码实现电机控制软件所有环节的经验的,对比搭建MBD电机控制框架的开发过程,上述优点是非常明显的,我深有体会。这些优点对新手入门也是非常友好,特别是对非电子、计算机专业的人来说。
在使用集成式MBD开发项目时,软件实现一般需要两个角色:
底层工程师:底层工程师需要对MCU和硬件电路设计很熟悉,他负责实现底层驱动、MCU初始化、OS、Bootloader、协议栈等。他使用手写代码的方式进行开发,在底层代码中给算法预留好接口,以供算法集成。
算法模型工程师:算法模型工程师则负责搭建模型、测试算法,测试通过后就可以生成代码,然后集成到底层代码中去。
Tips:软件实现还可以有一个统筹底层代码和模型代码的架构工程师,给底层和模型设计需求;非软件的部分,一般有一位硬件工程师。
集成好了之后可能还需要进行测试,因为仿真毕竟和实际情况有差异。这时候再调整模型,或者调整底层代码,就可以做到彼此独立、互不干扰了。这一点在传统的开发中往往是一大痛点,而MBD可以很好的解决这个问题。
2 把FOC算法模型嵌入代码
依然以PMSM无感电机控制软件开发为例来介绍如何实现模型代码的集成,硬件平台是NXP的电机开发套件MCSPTE1AK144。
电机开发套件MCSPTE1AK144 - From NXP
后文中提到的最新的模型和代码已经更新到了我的GitHub仓库中,下载模型可以访问下面这个链接:
GitHub仓库:autoMBD电机控制项目
https://github.com/TkungAI/autoMBD_Motor_Control
也可以在私信作者发送关键词“MBD电机控制”,作者还有其他资源,发送关键词“资源”可以收到下载链接。
回到正题,如何开展集成式MBD开发,有以下三个工作环节:
1. 实现算法模型
首先要明确算法模型的需求,可以简单地概括为:
算法的输入和输出是什么?
算法的内部变量有哪些?
算法要处理什么任务(状态机)?
这三个问题的解答也需要和底层工程师和硬件工程师一起协商、相互约束、相互补充,共同明确需求。下图是本次实现的电机控制算法模型(文件名FOC_Ctrl_CodeModel.slx):
PMSM无感电机控制算法模型 - From autoMBD
PMSM无感电机控制算法模型
-
From autoMBD
这里给出我在本次的PMSM无感电机控制软件开发中,对上述三个问题的回答:
输入和输出
输入为5个ADC采样信号和2个电机控制信号,ADC采用数据用于FOC算法、目标转速的输入,电机控制信号用于控制电机的启停;输出为三相占空比Duty Cycle和LED信号,分别用来执行控制和显示控制状态(参见上图)。
中间变量
中间量不会输出,是在算法处理数据过程中产生的,可以体系算法的特征,比如处理后的电压信号、电流信号、无感算法估计的速度和位置、控制信号等。这部分通过Bus数据对象实现对数据结构体的定义。下图中的varFOC即包含了所有的中间量。
中间变量和StateFlow Chart - From autoMBD
状态机设计
这部分也就是明确电机控制软件具有的功能、任务。在不同的阶段,算法执行的内容是不一样的,例如关闭电机的状态下,不需要跑FOC算法。本次项目中,只实现了简单启动、关闭和故障清楚的功能,状态相对简单,如下图所示:
算法模型状态机 - From autoMBD
Tips:如果有看之前提出的电机控制框架模型,应该就能发现这里的状态机与之非常相似。实际上这里的状态机是对原版的更新和优化,把函数调用方式从Function Call换成了Simulink Function,在Chart内部即可调用函数,不需要把调用的函数模型建立在Chart外面了。具体状态机的讲解可以参考电机实战的03期和04期的内容。
要注意的是,在Run状态下,调用的FOC核心算法模型,其包含了独属于FOC算法的子状态机和中间变量FocInternalPara。这里将FOC算法部分和与非FOC算法部分进行了分别设计,增加算法的灵活性和移植性。
FOC核心数学算法 - From autoMBD
FOC核心算法模型子状态机 - From autoMBD
Tips:该状态机只负责FOC算法的状态控制,包括对齐、开环、追踪和无感闭环四个状态,具体内容可以参考电机实战的04期的内容。
算法模型的内容就介绍到这里,其他的细节还请下载模型后打开查看。模型创建好了就可以生成代码了:
算法模型生成代码 - From autoMBD
这里生成的代码即集成时需要用到的代码。生成代码文件很多,其实是可以优化减少的,后续再开新的文章来讲解如何优化生成的代码。
2. 实现底层代码
Tips:底层代码的实现本质上就是手写代码的开发方式,只不过不做算法部分而已,所以需要有一定的编程基础。网络上有很多嵌入式开发的文章和案例,autoMBD的目标也不是介绍手写代码的开发,所以这里不会很细致的讲如何实现底层代码,仅从方法论的角度简单介绍一下。
可以发现,上述的算法模型中已经没有任何的硬件支持包的模块了,即已经不包含任何的底层驱动、外设初始化等等的功能,这部分由底层代码来实现。
要开发底层代码,需要用到集成开发环境IDE。对于S32K1系列芯片,NXP公司提供了一套免费的、专用于NXP汽车芯片的IDE工具——面向Arm®的S32 Design Studio(简称S32DS)。
面向Arm®的S32 Design Studio - From NXP
打开S32DS后,窗口如下图所示:
S32DS窗口 - From NXP
要配置底层驱动,需要用到S32K1专用图形配置工具——Processor Expert(上图中红色方框中的部分)。该工具能够实现对S32K1系列芯片的灵活配置。而底层驱动则需要使用S32K1 SDK,该SDK具有丰富的API供开发者使用,功能完善且强大。
关于Processor Expert和S32K1 SDK的使用,更多请参考NXP的技术文档。
本次项目中我也实现了一个基本的PMSM无感电机控制的底层代码,包括外设配置、MCU初始化和中断管理的内容,该DS工程位于仓库的这个位置:
S32DS_Prjct ->FOC_Ctrl_MBD_Integration。
该底层代码实现的功能与上一期中的电机控制框架基本一致。
3. 模型代码的集成
到这里,模型代码和底层代码都已经实现,如何集成呢?实际上生成的代码中有一个ert_main.c的文件就给出了集成的实例,读者可以参考该文件。
模型代码集成的过程是比较简单的,主要分为以下几步:
模型初始化:FOC_Ctrl_CodeModel_initialize()
周期性运算Step函数:FOC_Ctrl_CodeModel_step()或rt_OneStep()
终止(如果需要):FOC_Ctrl_CodeModel_terminate()
Tips:调用并运行模型算法的是Step函数,即计算模型的一个步长。两个Step函数功能是一样的,rt_OneStep()在”模型Step“的基础上封装了一层错误检查,但该错误检查基本上起不了什么作用。
特别要注意的是周期性调用Step函数的周期,需要和算法的运算周期保持一致,不然可能会出现错误结果。
本次项目中,模型初始化在MCU初始化完成后调用;Step函数的调用在Motor_ISR中;模型算法不会终止,所以不需要Terminate函数。
初始化的具体代码如下:
/* Low level driver initialization */ MCU_Init()GD3000_Init()FMSTR_Init()/* Initialize model */ FOC_Ctrl_CodeModel_initialize()MCU_Start()/* Forever loop */ while(1) { FMSTR_Poll()mainCnt++}
Motor_ISR:
void Motor_ISR (void) { /* Read ADC*/ ADC_DRV_GetChanResult(INST_ADCONV1, 0, &adcResult[0][0])/* V_REFSH */ ADC_DRV_GetChanResult(INST_ADCONV1, 1, &adcResult[0][1])/* Pot */ ADC_DRV_GetChanResult(INST_ADCONV1, 2, &adcResult[0][2])/* iA */ ADC_DRV_GetChanResult(INST_ADCONV1, 3, &adcResult[0][3])/* Temp */ ADC_DRV_GetChanResult(INST_ADCONV2, 0, &adcResult[1][0])/* V_REFSL */ ADC_DRV_GetChanResult(INST_ADCONV2, 1, &adcResult[1][1])/* uDC */ ADC_DRV_GetChanResult(INST_ADCONV2, 2, &adcResult[1][2])/* iB */ ADC_DRV_GetChanResult(INST_ADCONV2, 3, &adcResult[1][3])/* iDC */ /* Set model inputs here */ FOC_Ctrl_CodeModel_U.ADCinput[0] = adcResult[0][2]FOC_Ctrl_CodeModel_U.ADCinput[1] = adcResult[1][2]FOC_Ctrl_CodeModel_U.ADCinput[2] = adcResult[1][3]FOC_Ctrl_CodeModel_U.ADCinput[3] = adcResult[1][1]FOC_Ctrl_CodeModel_U.ADCinput[4] = adcResult[0][1]FOC_Ctrl_CodeModel_U.FaultSwitch = faultSwitchFOC_Ctrl_CodeModel_U.MotorSwitch = motorSwitch/* Calculate one-step for the modle */ rt_OneStep()/* Get model output here */ pwmDuty[0] = (uint16_t)(FULL_DUTY * FOC_Ctrl_CodeModel_Y.DUTY[0])pwmDuty[1] = (uint16_t)(FULL_DUTY * FOC_Ctrl_CodeModel_Y.DUTY[1])pwmDuty[2] = (uint16_t)(FULL_DUTY * FOC_Ctrl_CodeModel_Y.DUTY[2])/* Set PWM duty */ FTM_DRV_FastUpdatePwmChannels(INST_FLEXTIMER_PWM1, 3, pwmChannels, pwmDuty, true)/* Clear FTM flag */ FTM_DRV_ClearStatusFlags(3, FTM_TIME_OVER_FLOW_FLAG|FTM_RELOAD_FLAG)}
可以看到模型的传参和返回结果是通过全局变量的方式实现的:
输入全局变量:FOC_Ctrl_CodeModel_U
输出全局变量:FOC_Ctrl_CodeModel_Y
这里是可以通过对算法模型进行设置的,可以改成传参的方式,本次项目使用的是默认方式。
前文中的算法模型的中间变量也是一个全局变量:
模型中间变量:FOC_Ctrl_CodeModel_DW.varFOC
到这里模型代码的集成就算完成了,可以像手写代码的方式调试和下载代码了。
其实还有很多关于代码集成的细节和技巧没有提到,本次项目实现的模型代码完全是在默认设置下生成的。
Simulink是可以对生成的代码进行很细致的控制的,例如控制代码生成的位置、函数传参的方式、函数的复用等,还有代码如何优化,如何创建数据字典来管理模型数据。关于这些技巧和实践,我会在后续的文章中进行介绍,欢迎持续关注作者。
3 写在最后
先说一点题外话,我最近才了解到NXP新发布的S32K3系列芯片,其最新的硬件支持包MBDT有了一个较大的升级,它的底层模块已经实现了完全等同于S32K3专用底层配置工具的功能。这一升级使得底层驱动这一功能也可以在Simulink模型中实现。
现在的S32K1的MBDT底层模块由于功能很有限,很多情况下底层驱动的配置必须使用专用配置工具Processor Expert来配置才能满足需求。而S32K3的更新有望改变这一现状,有兴趣的可以了解一下S32K3芯片和它最新的硬件支持包MBDT。
S32K3X4EVB-Q172 - From NXP
到本篇文章为止,我认为关于MBD的基础部分,应该已经写得差不多了,如果看完我的全部文章,应该能有所收获。
下一期我将对所有发布的文章,和GitHub仓库进行一次清理和总结。
明年autoMBD将会进入到下一个阶段,会尝试更有挑战的内容,例如TLC语言、MBD实现通信、MBD与OS的结合等。所以请持续关注autoMBD,更多技术分享不容错过。
2021年还剩下最后一周,在这里提前祝大家2022年新年快乐,希望各位读者能在2022年收获更多!
嵌入式系统的应用和开发
基于嵌入式系统的具体产品应用是计算机工程史上的里程碑。深入到了各行各业,其已成为高科技领域中必不可少的工具。 我下面为你整理了关于嵌入式系统的应用和开发的文章,希望对你有所帮助。
1嵌入式系统简介
嵌入式系统可以抽象出一个典型的组成模型,其可划分为硬件层、软件层及功能层。
1.1嵌入式系统定义
嵌入式系统最通用的定义是以应用为中心,以计算机技术为基础,软硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机[1]。
根据IEEE9(国际电气和电子工程师协会)的定义,嵌入式系统也可定义为控制监视或辅助设备机器和车间运行装置。
嵌入式系统的定义很多,统一起来很难。对于其定义有疑问的部分研究人员将嵌入式系统定义为:“嵌入式系统是以嵌入式微处理器为内核,以微电子技裂租或术,计算机技术,电子技术、对象技术为基础,软硬件可根据对象需要所设置,并且嵌入到对象器件内,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用智能化的控制系统。”[2]
1.2嵌入式系统的特点
嵌入式系统是面向专业应用领域的,从其应用角度分析,具有以下特点:
(1)硬件层,是所有软件的运行基础,嵌入式系统至少拥有一个高性能处理器为硬件平台。如ARM处理器。
(2)软件层,其能扩充和充分发挥硬件层功能。嵌入式系统需有一个多任务 *** 作系统的软件平台,来控制管理计算机硬件和软件资源以及合理的组织计算机工作流程。如Liunx,UC/OSⅡ等 *** 作系统。
(3)嵌入式系统是先进的技术及资金密集、知识产业化不断创新的集成系统。其将先进的电子科学技术与各行各业的具体应用相结合。
(4)是面向用户、产品及特定应用的。
(5)具有较长的生命周期。与实际产品相结合,并与产品升级同步进行。
(6)对程序质量要求较高。一般都将系统中的软件固化在存储器中,大部分都具有较高的实时性。
(7)嵌入式系统不具备在其上进行进一步开发的能力。需要借助专门的开发工具和环境来满足产品设计完成后的程序功能修改工作。
2基于ARM的嵌入式系统技术应用及开发方法
2.1ARM的技术应用特点
ARM(Advanced RISC Machines)是一种嵌入式微处理器,它具有低功耗、低成本、高性能的特点,采用RISC体系结构,大量使用寄存器,具有高效的指令系统,在实际嵌入式应用中,只保留和嵌入式应用紧密相关的功能硬件,去除其他的冗余功能部分,来实现嵌入式应用的特殊要求[3]。基于ARM微处理器的嵌入式系统不同于单片机、DSP系统,其高性能的特点,在硬件部分的电路板设计方面是比较困难的,绝大多数的ARM板都要在4层以上。其实ARM最关键的是软件部分的 *** 型汪作系统,系统开发应更侧重于软件方面,包括系统裁减,底层驱动肆伍和应用程序等。
2.2ARM嵌入式系统的开发流程
基于ARM的嵌入式系统设计的开发流程如图1所示。
2.3ARM嵌入式系统的开发方法
(1)建立系统的开发环境
嵌入式系统资源受限制,如果在其硬件平台上直接编写软件,比较困难。因此根据其特点须在特定的开发环境下进行。搭建相应的软硬件平台:在宿主机(HOST)也就是PC机上安装开发工具,并将编写好的软件程序进行交叉编译生成二进制代码,最后将其移植到目标板的特定位置运行。这种在宿主机(HOST)环境下开发,在目标板(TARGET)上运行的开发模式叫交叉开发模式,交叉开发模型如图2所示。
(2)Boot Loader引导程序开发
Boot loader是在嵌入式 *** 作系统内核运行前运行的一段程序,与我们经常提到的BIOS功能相近,每种体系结构都有与其相匹配的Boot Loader。通过Boot loader程序的运行,可以初始化硬件设备,建立系统的内存空间映射图,这样就可以将系统的软、硬件环境设定在一个合适的状态,方便于最终调用 *** 作系统内核,并且为运行用户应用程序准备好正确的环境。
Boot loader程序由汇编和C程序两部分组成,程序执行过程也分为汇编和C程序代码部分两个阶段。汇编程序与硬件设备相关,不便移植,第一阶段需要完成初始化看门狗、设置中断异常向量表、堆栈、配置存储器等,之后再跳转到第二阶段的C语言程序入口处。C程序代码部分主要完成初始化本阶段所需要的外部设备,调用NANDFLASH的API函数,配置SDRAM空间,并将用户的`程序代码从NANDFLASH存储器中复制到SDRAM中,最后再跳转到用户程序的入口[4]。
3嵌入式技术的应用领域
嵌入式技术无处不在,已经深入到了生活的各个领域,为我们的生活带来了很大的方便。
(1)无线通讯领域。特别是智能手机,全球95%的手机采用了ARM芯片,随着手机功能愈像电脑,手机更需要功能强大的嵌入式芯片。现在,全球售出的每一部手机中平均就有2.4块ARM芯片。
(2)工业控制领域。基于ARM核的32位微控制器芯片逐渐向低端微控制器应用领域扩展,在工业控制领域发挥了很大的作用。
(3)网络应用。网络宽带技术不断发展,基于ARM技术的ADSL芯片也逐步进入竞争范围,并取得一定优势。而且,语音及视频处理也应用了ARM技术,同时对DSP的应用领域提出了新的挑战。
(4)仪器仪表方面。有智能仪器、智能仪表、医疗器械、色谱仪、示波器等。
(5)民用方面。如电子玩具、电子字典、游戏机、录像机、复读机、投影仪、照相机、空调、冰箱、洗衣机、调制解调器、防盗控制器、激光驱动器、变速控制器、汽车点火控制器、避雷控制、农业节水控制系统、保安控制系统等方面。
(6)导航控制方面。如导d控制、航天导航系统、电子干扰系统等。
(7)数据处理方面。如图文图表终端、复印机、硬盘驱动器等。
(8)农业交通方面。智能公路(汽车导航、流量控制、信息监测与汽车服务)、植物工厂(特种植物工厂、无土栽培技术、智能种子工程)、虚拟显示VR机器人、信息家电(家用电器的网络化)等等。
除此以外,众多领域都用到了基于ARM微处理器的嵌入式技术,在生活的各个领域得到了广泛的应用。
作者:匿名用户链接:https://www.zhihu.com/question/19688487/answer/32217959
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
学习嵌入式系统,首先应该明确什么是嵌入式系统,否则费力去学,却不知所学为何物,岂不惘然?嵌入式系统的定义很多,这也是困扰嵌入式系统学习的一个因素。笔者根据自己开发和教学过程中的理解,以及对各种嵌入式系统的应用进行总结,提出了嵌入式系统的简单定义:嵌入式系统是嵌入式计算机系统的简称,这个定义突出嵌入式计算机系统和普通计算机系统的共性。下表列出了嵌入式系统的一些典型的应用:
智能机器人(S D R 4,火星登陆车)
娱乐和消费电子(Gameboy Advance,SonyPSP)
网络通信产品(Smartphone)
军用设备(军用PDA )
汽车(车载导航,自动驾驶,娱乐系统)
智能仪器(虚拟仪器)
安全防护(防火,防盗)
环境保护(行李探空气球)
银行和商业消费(ATM)
以火星登陆车为例来分析一下嵌入式系统的定义。火星登陆车虽然听起来感觉在技术上有些高不可测,但是本质就是嵌入式计算机系统的应用,其核心就是一个计算机系统,而这个计算机系统的组成同传统的计算机系统在本质上没有什么差别。两者的显著不同之处就在于,用于火星登陆车的计算机系统被安装到了火星登陆车上。当然,一个计算机系统能够被安装在火星登陆车上,是需要进行很多特殊设计的。但是从本质上讲,嵌入式系统的核心概念还在计算机系统。嵌入式系统学习的重点也在计算机系统上。一方面,学习者需要牢固掌握计算机系统本身的概念,更重要的是学习嵌入系统的开发过程同传统计算机系统开发过程的差别。这里需要指出的是,很多学习者本来就没有从事过完整计算机系统的开发,高校的教学是以程序设计为中心的,计算机系统的构成, *** 作系统的原理,编程语言等课程都是为了能够让学念带吵生更好的使用计算机系统进行程序设计,在现有的计算平台上来设计实现各种应用,学生一般没有机会学习一个完整的计算机系统是如何构建,并亲身参与到构建的每一个过程。而对于嵌入式系统而言,从事平台开发的人就是要亲自去开发出一个完整的计算机系统,这个过程包括
1. 需求分析
2 硬件设计
3 驱动程序
4 Bootloader &BSP (板级支持包)
5 *** 作系统的移植
6 应用程序的开发
7 性能检查
嵌入式系统教学的目的就是教会学生如何根据需求去建立满足某种特殊行业需求的嵌入式计算机系统。让学生学会如何构件硬件平台,进行硬件设计,选择能够满足应用要求的最佳的嵌入式 *** 作系统,并完成Bootloader,BSP和驱动程序的编写,移植,调试等过程。为了满足行业需求,最终要在所建立的系统上编写调试相应的应用程序,并进行性能的测试和检查。
你是谁,你需要学习哪些东西?
如果你的工作只是需要在PC 机上编写一个图片浏览程序,那么你就没有必要去了解当系统收到一个ARP请求包后应该如何回应。同样的道理,嵌入式系统的学习也是有很多方面的。就嵌入式系统的设计和实现而言,基本上需要四种不同的工作:系统设计工作,硬件设计工作,驱动程序和 *** 作系统移植工作和应用程序设计开发工作。
1.系统设计工作
在系统的设计阶段,系统分析师将根据需求确定系统的硬件的基本构成,根据系统的需求选择使用那种处理器,使用哪种 *** 作系统,使用那些软件开发工具。系统分析师往往是较为完整的参与过嵌入式系统设计的全过程,对于系统应用的行业较为了解,对于嵌入式系统本身的开发流程十分清楚的人。
2.硬件设计工作
系统硬件设计人员需要根据系统分析师的设计结果,进行硬件原理图的设计。通常需要硬件设计人员熟悉嵌入式系统的硬件构成。硬件设计人员需要了解常用的嵌入式系统处理器,存储器(Flash,SDRAM),以太网MAC芯片,音频/视频编解码芯片,电源管理芯片,总线接口电路 (USB,PCI),液晶显示模块,可编程逻辑器件(FPGA/CPLD),无线网络通信模块(Bluetooth,WLAN,GPRS)等硬件电路构仔侍成元素的基本工作原理,连接使用方法,使用注意事项,基本调试方法等内容。在网络上能找到很多公司的评估板的原理图,对于这些原理图要仔细研究,摸清处理器同存储器,网卡,液晶模块等器件的连接方法和原因。通过对这些电路的研究,能够较快地了解整个嵌入式系统的构成,这些电路同实际产品中的电路虽有一定差别的,特别是对于手持设备,但这些差别不影响初学者学习嵌入式系统的硬件设计基本构成。
以上这些知识,往往需要较长时间的学习和积累,需要亲自参与实践的机会。对于刚刚接触嵌入式系统硬件开发的学生来讲,一般不可能全部了解这些知识,但也不会是通通一无所知。笔者结合自己开发和教学的经验认为:首先应该选定一款主流且较为简单的嵌入式系统处理器,比如基于ARM7TDMI 内核的AT91M40800,S3C44B0 等嵌入式系统处理器,学习32 位RISC处理器的编程模型,指令集。高校教学中,单片计算机课程一般以8051系列单片为核心讲解,由于现代32位处理器的结构和开发方式同8位单片机有着较大的差别,学习者还是需要花一点力气来研究以下32位处理器的。以ARM处理器为例,学习者就需要理解处理器的多种工作模式,备份寄存器,RISC 指令集的特点,MMU 和虚拟地址,中断处理过程等内容。在学习指令集的过程中,最好能够每学习几条指令,就使用这几条指令在模拟器上实验以下,观察处理器执行的结果。这个过程一方面是学习者对于指令本身的学习能够取得一个比较好的效果,另外也是对开发工具本身的一种学习。接着,就可以开始学习片上资源的使用和配置方法。这时就需要一个方便使用的开发板,学习者能够通过JTAG仿真器将开发板同调试PC机相连,进行程序的下载,调试。特别是要仔细研究系统的初始化过程和中断处理的过程。在开发过程中如果遇到问题,应自己分析问题产生的原因,通过分析缩小问题可能产生的范围,最终找到问题的所在。最重要的就是要保持一种解决问题的信心,面对困难如何处理,往往能够决定最终系统是否能够调试成功。然后,学习者可以开始仔细学习处理器同存储器的连接,存储空间的配置,各种外扩器件,如网卡,AC97声卡的工作原理和使用方法。嵌入式系统硬件设计中往往需要使用可编程器件,学习者还需要一定的时间来学习使用常用的可编程器件(CP L D / F P G A),常用的有Xilinx和Altera公司的产品。进行系统硬件原理图设计,就需要使用原理图设计的EDA工具,常用的EDA 原理图设计工具主要包括Cadence公司的Capture,Protel公司的Protel99SE等。接下来就可以参照评估板的电路图,根据系统的设计要求,开始进行原理图的绘制了。在原理图绘制过程中,一定要搞清评估板电路连接的原因,对于一时没有搞清楚的问题切不可蒙混过关。例如,有些处理器的地址线是以字节位单位的,而另一些处理器的地址线则是以两个字节为单位的,当连接16位的存储器的时候,切不可想当然的把处理器的A 0 直接连接到存储器的A 0 上面。另外,学生还应具有一定的PCB板图绘制能力,因为在现阶段,很多公司还不能完全把原理图的设计工作和PCB 的绘制工作分开,往往要求硬件设计人员既能进行原理图设计又能进行板图设计。即使是PCB设计和原理图设计分开的公司,也需要原理图设计者能为PCB 的设计者对于不同的信号提出布板要求。
3.驱动程序和 *** 作系统移植工作
现代嵌入式系统的开发同传统8位单片机系统的开发相比,一个显著的区别就是嵌入式 *** 作系统的广泛使用。在拿到焊接完毕的电路板,并进行基本的测试后,就要进行驱动程序和 *** 作系统的移植工作了。首先要进行的Bootloader的编写和移植工作。Bootloader相当于PC系统的BIOS。对于有些嵌入式 *** 作系统,如uc/OSII没有bootloader同样可以开发调试。但是对于WindowsCE和嵌入式linux系统而言Bootloader就是必须的了。本文以Windows CE 为例,做一个简要的说明。
Windows CE 系统的移植工作主要就是BSP(板级支持包)的开发过程。BSP将具体的硬件差异同 *** 作系统的核心隔离开来,主要由Bootloaer ,OAL(OEMAbstraction Layer)和设备驱动程序三部分组成。WindowsCE系统中Bootloader叫做Eboot。Eboot被写入系统的引导Flash。系统启动时运行Eboot,完成通过网卡将调试PC 机中WindowsCE *** 作系统映像下载到目标系统的SDRAM中并开始执行的功能。对于一个系统移植人员,首先需要阅读文档,了解WindowsCE系统Bootloader和BSP的基本概念和开发过程。(呵,还要做这工作啊,我还没想到(初学^_^))Windows CE的开发系统Platform Builder提供了详细的文档和例程,开发人员需要仔细的阅读文档和例程。搞清楚各个函数之间的调用关系。在开发过程中的一个重要的步骤就是打通串口,使得目标板能够通过PC机串口向调试PC 机发送数据。由于ARM系统的仿真器比较昂贵,而且 *** 作系统的调试往往不使用JTAG调试器进行单步调试。所以能从串口观察程序的执行过程和结果对于调试就显得十分重要了。串口打通之后一个比较棘手的问题就是网卡芯片的调试。刚刚接触嵌入式系统开发的人往往没有直接在寄存器级上使用网卡芯片的经验,而网卡芯片的说明一般都较为简短,这就要求开发者学习一些以太网的基础知识,对以太网的MAC 层有一个基本的认识。另外,各种网络调试(抓包)工具的使用也能大大降低系统调试的难度。系统的OAL需要根据具体硬件的不同做出相应的修改,这个部分可参照文档进行,在调试过程中根据串口的信息分析出错的地方。要充分发挥跨文件字符串搜索工具的功能,在浩如烟海的源文件中找到出错的位置。当然,随着开发者对系统文件目录结构的熟悉和了解,错误定位的速度会不断加快。WindowsCE 的驱动程序相对而言是比较好写的。
4.应用程序的开发
嵌入式系统的应用程序开发同在PC 机上开发应用程序的区别不是很大。对于Windows CE系统而言,Microsoft已经提供了较为完善的开发工具。特别是.NET Compact work的使用,使得基于Windows CE.NETCompactwork的应用程序有了跨平台性。开发人员可以使用Windows 的C# 语言直接在PC 上进行http://CE.NET应用程序的开发和模拟调试,也可将目标系统同PC 机相连,进行联机调试。现在有很多系统支持J2ME(JAVA的嵌入式系统版本) ,这使得JAVA 在嵌入式系统应用开发中占有较大的优势。另外,作为专业的嵌入式系统软件开发人员,还需要充分了解面向对象技术和设计模式等方面的知识,当然作为初学者可以先不深入研究这方面的内容。
常用嵌入式系统处理器和 *** 作系统
处理器
常用嵌入式系统处理器主要包括ARM 处理器,Power PC 处理器,基于MIPS 内核的嵌入式处理器,软核处理器(如Altera 的Nios和Xilinx的MicroBlaze等)和DSP(数字信号处理器)等。
ARM 处理器的主要特点是具有较高的性能功耗比。ARM处理器被广泛的应用在手机,PDA等领域,其中较为著名的有Intel 公司生产的基于ARM 内核的XScale系列处理器。由于所有公司生产的基于ARM内核的处理器具有相同的编程模型,在手持和电池供电的系统中,基于ARM的嵌入式系统处理器往往被首先选用。PowerPC(简称PPC)处理器具有较强的运算性能和数据吞吐能力,在网络和数据通信领域基于PPC的嵌入式系统处理器有着广泛的应用。其中Motorola公司生产的MPC860/MPC8260被大量地应用在嵌入式网络产品中。MIPS 处理器的特点表现在十分强大的处理能力上。作为高性能处理器,MIPS处理器适用于网络、企业及高级消费类电子应用,特别是在机顶盒系统中,MIPS处理器具有较高的市场占有率。随着可编程器件的规模不断扩大,使得人们能够根据需要定制处理器,并方便的将针对某种特殊应用定制的处理器方便的在可编程器件内部实现。除了处理器外,计算机系统还需要许多其他构成部分,比如在多通道媒体数据处理系统中,经常需要使用可编程器件来实现高速的数据处理功能,使用软核DSP来实现复杂的数字信号处理算法,同时还需要处理器进行事务处理,软核处理器将可编程器件,DSP同处理器结合在一起,为系统级设计提供了极大的灵活性。DSP(数字信号处理器)有别于通用处理器,集中表现在其强大的数字信号处理能力上。在DSP 内部提供了硬件乘累加器,处理器在设计上对于特殊的寻址方式做了优化,一些DSP 还支持零耗循环(Zero OverheadLoop)。为了方便嵌入式系统设计,主流DSP 一般也都提供了丰富的外设。特别值得一提的是ADI 公司的Blackfin 系列DSP和TI 公司的DM64X系列DSP,两种处理器都提供了丰富的片上外设,非常适用嵌入式系统应用。
*** 作系统
http://WindowCE.NET/5.0
作为Microsoft的产品,WindowCE.NE/5.0提供了功能完备的平台开发工具Platform Builder和应用开发工具Embedded Visual C++/Visual Studio 2003。WindowsCE由于拥有广大使用者所熟悉的windows界面,系统提供了众多驱动程序,并且有完备的文档支持。对于应用开发而言,熟悉Windows系统开发的程序员很容易转到WindowsCE 应用程序的开发。Windows CE将会是一个非常有前途的嵌入式 *** 作系统。
VxWorks
VxWorks是由Windriver(风河)公司出品的嵌入式实时 *** 作系统,大名鼎鼎的火星登陆车就是使用了VxWorks。Windriver为VxWorks提供了集成开发环境tornado。
υC/OSII
υC/OS是由Jean Labrosse设计编写的开放源代码的嵌入式实时 *** 作系统,笔者最早接触的嵌入式 *** 作系统就是它。阅读并深入理解υC/OS的源代码对于理解实时系统是大有裨益的。
ARM Linux
ARM linux是由Russell King和其他开发者开发移植的用于ARM 处理器的linux *** 作系统。ARM Linux系统在GNU GPL下发布。
υCLinux
υClinux 是适用于没有MMU 的嵌入式处理的LinuxOS 版本。υ Clinux 同样在GNU GPL发布。
嵌入式系统开发过程中的常见问题和解决方法
Bootloader如何写入Flash ?
初学者一般都会遇到如何将程序写入处理器的问题。对于不同的处理器,可以采用不同的方法。例如Intel的Xscale处理器可以使用Intel公司提供的JFlash工具烧写。对于具有JTAG调试工具软件的处理器,可以使用如下思路:编写一段程序,这段程序能将位于SDRAM/SRAM 固定地址中的数据写入Flash中。烧写时,首先,将这段软件下载到SDRAM 中,然后通过调试软件将要写入Flash的数据下载到SDRAM/SRAM的某个固定地址开始的缓冲区,然后通过调试器开始执行程序,将数据写入Flash。除此以外,网络上还提供了很多专用的写Flash的工具,开发者可以根据自己的需要选用。(现在明白了我在学的那个BF533为什么先下个flashProgramer.dxe先了)
什么是arm-elf-gcc?
arm-elf-gcc是一个交叉C语言编译器。我们在PC平台下编译程序,编译器运行的处理器同生成的代码将要运行的处理器相同。但是,在PC
机上编译ARM程序时,编译器运行的处理器同生成的代码运行的处理器不同,这种编译器叫做交叉编译器。其中的elf是指编译器生成的目标文件格式。(其实我们平时用的单片机编译器如GCC—AVR等已是交叉编译器了,我到现在才弄清楚什么是交叉编译器)
走了哪条编译路径?
系统程序和驱动程序往往包含很多的编译选项,很多选项都是在编译时通过命令行定义的,如果想知道编译的是那一段程序可以使用如下的方法:
#ifdef PLAT_AAA
#error Code for Platform AAA
#else
#error Code NOT for Platform AAA
#endif
这样在编译的时候就知道,编译的是哪一条路经了。对于支持#pragma message( “I am here”)的编译器也可使用#pragma message预编译指令。
我怎么知道那段代码在那个文件中?
系统编程中经常需要使用在多个文件中搜索字符串,在windows平台下可以使用平台提供的多文件字符串搜索工具。在linux平台下,可以使用grep来搜索字符串。Grep的搜索功能十分强大,支持正则表达式搜索,熟练使用grep对于阅读系统和驱动程序代码是很有帮助的。
系统是从那个文件开始运行的?
对于Windows CE系统,一般从WINCE420\PLATFORM\YourPlatform\KERNEL\HAL目录的某个汇编文件中。对于Linux系统版本不同会存在一定差异,以arm处理器为例,一般会在linux2.4.x\arch\arm\kernel的head-armv.S中。
程序执行到了那里?
可以在程序中插入如下代码来实现
printf( “I am here %s, %d\n”,__FILE__,__LINE__)
代码将打出printf语句所在的文件名和行号。
推荐书目
Jean J.Labrosse MicroC/OS-II The Real-TimeKernel,Second Edition这本书是笔者接触嵌入式实时系统的入门书,在国内能够买到中文版。这本书较为清楚地讲述了实时系统的概念,各个组成部分的工作原理,特别是公开了实时系统内核的源代码,仔细研究定会受益匪浅。有个小的提示,对于初学者,这本书可以先不看第一章,直接从第二章看起。
Abraham Silberschatz, Peter Baer Galvin,GregGagne Operating System Concepts笔者在教学过程中发现,无论是计算机还是电子工程专业都有很多学生对于 *** 作系统的基本概念都没有搞清,很少有学生有完整的系统编程经验。Operating System Concepts这本书对 *** 作系统的概念讲述只能用经典来形容。对于嵌入式系统有兴趣深入研究的同学,首先要把基础打好,这本书就成了必读之物了。
Andrew S. Tanenbaum Computer Networks 提起Andrew S. Tanenbaum 学习计算机的同学一定都知道OPERATINGSYSTEMs:Designand
Implementation这本书,笔者对于Tanenbaum这样的教授由衷佩服。网络协议栈是嵌入式系统中的支柱性组成部分。愿意致力于网络深层技术研究的同学,这本书将为你们建立一个坚实的网络基础。
Karim Yaghmour Building Embedded Linux Systems本书详尽的介绍了嵌入式linux系统的组成,基本概念和如何去建立各个部分。全书篇幅较小,可谓短小精悍。即可以作为嵌入式linux系统的入门读物,又是开发过程各个部分的指南。
Advanced RISC Machines Ltd (ARM) ARM7 TDMI DataSheet Advanced RISC Machines Ltd (ARM) ARM920TTechnical Reference Manual学习嵌入式系统不了解当前应用最广泛的嵌入式处理器怎么行?ARM7 TDMI 的 data sheet是学习ARM编程模型,指令集的好东西。在嵌入式系统中,MMU(内存管理单元)是很重要的部分,又是较难理解和掌握的部分。ARM920TTechnical Reference Manual 正好可以帮你讲解这方面的内容。
Perter Van Der LinDen Expert C Programming嵌入式系统级编程最常用的语言还是C 。很多同学都自认为自己的C语言学的很好,那好,就看看这本书吧,找找自己和Experts差距。
嵌入式开发与桌面开发既有不同,又有非常大的联系,而且十分注重实际 *** 作能力。搞桌面开发的人在一开始接触嵌入式的时候,通常转换不过来,这主要体现在定位上。如文中所说,你是谁,你要做什么?我对硬件的了解仅限于编程领域,PCB设计一窍不通,但并不能说你不懂硬件就不能从事嵌入式开发。一个系统的开发设计方方面面,在自己感兴趣和熟悉的领域做出自己的贡献才是最主要的。
1。硬件设计: 需要有硬件设计的经验,对各种嵌入式器件有很好的了解。
2。系统移植:需要汇编经验, *** 作系统原理以及底层驱动的了解
3。应用程序:需要桌面编程经验
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)