1第六章嵌入式系统开发实例1.数控系统设计实例2.MP3设计实例3.烟气排放在线监测系统26.1数控系统设计实例需求分析架构设计详细设计系统测试开发工作的步骤3数控系统是自动阅读输入载体上事先给定的数据、译码、控制机床移动和加工零件的系统通过各种输入方式,接受加工零件的各种数据信息,经过译码、处理、插补,生成各坐标轴的参考位置把各轴的参考位置送到轴控制器中,驱动轴的运动,使各个坐标轴能精确地运动到所要求的位置1.需求分析——功能需求4功能需求—数控系统控制装置PLC人机界面轴冷却主轴….反馈速度位置输入输出速度位置指令状态反馈开/关CNC机床M功能PLC功能机床控制器CNC机床控制模型需求分析5输入输出输入/输出/通讯功能字符图形显示功能程序编制功能数据处理插补功能进给功能主轴速度功能刀具功能补偿功能辅助功能报警自诊断功能需求分析-数控系统的功能6非功能需求物理环境-车间,工作环境恶劣用户-一般是车间操作员,操作水平有高有低质量保证--用在工业控制环境质量要求高,同时现在市场竞争激烈,如果质量不好很难在市场上站住脚需求分析-非功能需求7QOS——QualityofService响应快速性:主要是对突发事件的反应(如撞刀、急停)响应的确定性:确保条件/事件出现和由此引起的动作开始/结束的时间在准确的时间间隔内。满足时间约束主要是和系统安全(如对突发事件的反应等)以及切削精度(更高的精度影响插补周期)有关,数控系统具有硬实时任务高性能:需要复杂的运算高可靠性:在加工过程中不出现问题,至少一个月之内不能死机,出现故障,高安全程度非功能需求-QOS8若现有系统实现了相似功能,重用该结构是较好的选择对于全新的项目,考虑这些功能是否能用一个处理器实现.单个处理器最容易实现和调试的必须使用多个处理器时,尽量使用少的处理器数量多处理器方案中,各模块(处理器)的独立性尽量高,减少数据通讯量及相互的依赖性多处理器系统,通过增加处理器将小系统扩充为大系统,客户可以从简单的处理器入手,随着系统负载的增加而增加需求分析——选择处理器91.技术平台的特殊需求(RTOS、CPU的相互支持)2.该平台是否成熟、完善?3.预留的性能(CPU资源使用不能到70%)4.平台的设备驱动程序(是否能够提供?)5.平台支持的通讯协议(是否支持TCP/IP,HTTP,UDP等)6.该平台是否有合适的开发工具7.硬件和软件平台公司的状况(技术支持、财务)8.开发人员对该硬件和软件平台的熟悉程度?9.有几个开发人员可以使用该平台?开发人员培训的费用?2.架构设计——挑选操作系统和硬件11当前的数控系统中的CPU个数:1、2、3高档数控一般采用两个CPU实现,更有甚者采用三个CPU,本项目的市场定位为中低档,使用单个CPUArm7的性能满足系统的需要,同时由于需要IO的实现,以及伺服电机的控制,所以采用ARM7+FPGA的结构ARM芯片价格低廉选择处理器—数控系统处理器12操作系统平台的选取通用操作系统--(windowunix/linux)本质上是不可预测的实时操作系统专用实时系统VxWorks,WindowCEQNX,REAL/IX等。费用高开放源码的实时系统rtai,rtlinuxucosDOS,单任务系统使用ucosII的理由多任务操作系统是个开放源码--降低开发费用有强有力的支持(这是选择该系统很重要的原因)133.系统设计数控系统设计与开发定义系统总体结构定义软件总体结构软硬件协同设计定义软件模块任务设计14系统设计-定义系统结构数控系统总体结构采用处理器设计模式系统采用单一处理器结构ARM系统ARM+FPGA实现整个硬件系统15系统设计-定义软件总体结构数控系统软件总体结构软件采用任务设计模式和功能协调模式相结合的软件结构任务内部采用有限状态机的设计模式16系统设计-软硬件协同设计软硬件协同设计一旦软件结构确定了,硬件和软件工作组在一起工作确定软件和相关的功能。这个过程是指软件和硬件工作组一起工作定义最终系统结构.这是一个迭代的过程,系统结构的改变有时会改变软件和硬件的结构.17系统设计-定义软件模块定义软件模块确定系统需要支持的所有功能.基于实现的工作类型分组.把执行同一功能的模块归为一个任务.例如人机界面,译码,插补,伺服等.18系统设计-数控系统任务模块数控系统任务模块人机界面-显示,操作,控制功能译码模块-把数控代码翻译成可识别的结构插补模块-把数据点细化伺服模块-生成脉冲指令控制电机总控模块-协调各个模块之间的关系逻辑模块-处理IO口19系统设计-数控系统任务模块OSTaskCreate(Frame_Task,(void*)0,(OS_STK*)&Frame_Task_Stack[STACKSIZE-1],CNC_Frame_Task_Pri);//1OSTaskCreate(Interp_Task,(void*)0,(OS_STK*)&Interp_Task_Stack[STACKSIZE-1],CNC_Interp_Task_Pri);//1OSTaskCreate(Decode_Task,(void*)0,(OS_STK*)&Decode_Task_Stack[STACKSIZE-1],CNC_Decode_Task_Pri);//1OSTaskCreate(Display_Task,(void*)0,(OS_STK*)&Display_Task_Stack[STACKSIZE-1],CNC_Display_Task_Pri);//1OSTaskCreate(Logic_Task,(void*)0,(OS_STK*)&Logic_Task_Stack[STACKSIZE-1],CNC_Logic_Task_Pri);//120系统设计-任务设计数控系统任务设计指南不要引入很多状态使设计复杂化.不要使用太少的状态使设计复杂化.使数据结构定义简单.处理存储越界的情况.考虑所有定义的场景.确保所有分配的资源在结束时释放.考虑使用层次状态机简化状态机设计21系统设计-任务设计选择任务类型单个状态机多个任务选择状态机简单状态机22系统设计-任务设计分配优先级,由于采用ucos操作系统,操作系统采用基于优先权可抢占的调度方式采用静态固定分配,优先级与周期成反比,周期越短优先级越高。非周期性任务则按照重要性分配,重要性越高优先级越高系统的优先级分配情况如下:伺服最高,插补次之,逻辑处理次之,译码次之,人机界面最低23系统设计-任务之间通讯任务间通讯ucos-II提供邮箱,消息队列,全局变量,共享内存的方式提供任务间通讯各种通讯方式的比较邮箱消息队列全局变量共享内存共享内存是最快的通讯方式24系统设计-共享内存OSMemCreate()创建内存voidinitCNCMem(void){INT8Uerr;pCNCMem=OSMemCreate(CNCMemPart,CNCMemSize,CNCblkSize,&err);if(pCNCMem==NULL){Uart_Printf(FailedtoCreateCNCMessagequote);}}OSMemGet()获得内存voidinitManual_data(void){INT8Uerr;manual_data=(MANUALDATA*)OSMemGet(pCNCMem,&err);}//endinitManual_data25系统设计-共享内存26系统设计-共享内存局部变量表数据结构全局变量表数据结构GIFitem1nameGIF_nvarGIF_sizeGIF_timeGIF_lockGIF_dirtGIF_firstGIF_lastGIFitem3GIFitem2GIFitemnnextGIF_typeGIF_tsGIF_nextGIF_spot到下一个元素gdata_spotqdata_spotldata_typeditem2ditemn…..ldata_typegdata_spotditem1litemnitemVarCopyToGsizetimegptrliterm1litem2…..itemPCopyToGqitem[n]itemVarCopyFromGitemPCopyFromG存放数据的内存区数据项nvarname28数控系统设计-同步优先级逆转一般是在两个任务访问共享数据时出现,为了保证数据的一致性,这两个访问必须串行,如果优先级高的任务首先获得访问权,则优先级的顺序保持一致,如果优先级低的任务首先获得访问权,这时优先级高的任务请求访问,则优先级高的任务必须等到优先级低的任务完成访问为止解决方法优先级继承优先级上界29数控系统设计-执行时间的测量时间测量主要目的是测量单个任务的执行时间评估系统的整个实时性能精确的实时调度分析优化代码调试时间错误30数控系统设计-执行时间的测量方法:秒表DateTimeprof和gprof软件分析仪定时器/定时器时间片逻辑分析仪31数控系统设计-执行时间的测量方法分辨率精度粒度使用难度秒表0.01sec0.5sec程序容易date0.02sec0.2sec程序容易time0.02sec0.2sec程序容易Prof和gprof10msec10msec函数中等clock15-30msec15-30msec行中等软件分析仪10usec20usec函数中等定时器/时间片0.5-4usec1-8usec行难逻辑分析仪/ICE50nsec半秒行难33数控系统开发-周期任务的实现ucos-II的任务是个无限循环不是周期任务Voidtask(void*prio){for(;;){Dostuff}}利用OSTimeTickHook()函数实现周期性函数,不过只能实现ticks整数倍的周期任务34数控系统开发-周期任务的实现voidtask(void*prio){for(;;){OSTaskSuspend(pri);Dostuff;}}intperiodic=0;OSTimeTickHook(){periodic++;if(periodic=n){//任务周期=n*ticksOSTaskResume(pri)}}35设计原则--越简单越好系统详细设计指南使用查找表和指针函数而不是ifelseorswitch使用固定大小的数组避免动态分配内存降低系统中的任务数避免任务互相依赖避免多线程设计避免一个大的循环对经常执行的部分进行优化使用状态机简化设计在开始对软件进行优化对时间进行测量使用时间标记,避免运行定时器36设计原则--越简单越好系统设计指南在设计时要注意内存分析避免使用循环延时而用系统提供的延时机制降低消息握手次数简化硬件结构优先选用通用的计算平台而不是特殊的平台不要使用具有所有权的协议和操作系统优先购买硬件平台而不是设计优先考虑重用设计避免使用异类的硬件和软件环境考虑硬件升级降低软件的努力把配置系统参数减小到最小38设计原则--不使用大循环任务2任务3任务1使用适当的并行设计方法非抢占-周期或多速率执行抢占-实时操作系统不用中断模拟多任务40数控系统开发-导致系统崩溃的问题下面的软件问题导致软件崩溃:无效的数组索引没有初始化的指针操作没有授权的buffer操作非法的栈操作无效的处理器操作无限循环41嵌入式数控系统原型样机42系统应力测试功能干涉测试干涉负载测试应力负载测试系统应力测试43系统测试-功能干涉测试功能自动手动MDI回零自动测试1-1自动运行测试1-2证明自动运行情况下进入手动系统减速到零进入暂停测试1-3证明自动运行情况下进入MDI系统执行完当前程序段停止测试1-4证明自动运行情况下进入回零系统减速到零进入暂停手动测试2-1证明手动运行情况下进