一种基于建立索引查询方式实现层次化嵌入式软件设计的方法

来源 :科技创新导报 | 被引量 : 0次 | 上传用户:jjaijjai
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:本文介绍一种基于建立索引查询方式实现层次化的嵌入式软件设计方法,本方法具有可移植性、可重构性等特点,特别适合在控制器嵌入式软件实现层次化查询方式的多级调用的软件结构。
  关键词:嵌入式软件 可移植性 可重构性 层次化
  中图分类号:TP311 文献标识码:A 文章编号:1674-098X(2017)11(a)-0157-02
  在嵌入式软件系统设计中,C或C++软件结构设计是一种过程设计,对于软件设计中存在的事件调用,一般都使用硬件或软件中断调用方式,但由于子函数在调用过程中体量的大小不同,容易导致中断,在设计中往往对于程序存在隐患。而查询方式又过多地占用CPU的运行时间。
  本文介绍一种基于建立索引查询方式的层次化的嵌入式软件设计应用,通过结合硬件或软件中断产生信号量,通过查询方式来实现多层次函数的调用,既避免了过程设计中重复调用子函数导致的代码冗余,也避免了中断调用子函数导致的程序隐患。本方法已经成功运用到固态物料铁品位检测仪的产品中。
  1 应用介绍
  目前较为流行的控制器包括单片机、ARM、DSP等,利用有限的存储空间和设计资源,提高嵌入式软件的设计方法,减少数据结构冗余,提高程序效率是提高软件设计稳定性的重要方法。
  本文利用一个简单的硬件环境实现静态物料移动平台的功能。包括利用电机控制、显示、按键控制、I/O等硬件外设,实现电机轨迹的返回原点、方向控制、功能控制、菜单显示、I/O检测等功能。其基本功能如下。
  (1)功能介绍。
  “X轴正”:通过查询X轴正索引值,找到需要操作的函数指针,并执行相应移动。
  “X轴负”:通过查询X轴负索引值,找到需要操作的函数指针,并执行相应移动。
  “Y轴正”:通过查询Y轴正索引值,找到需要操作的函数指针,并执行相应移动。
  “Y轴负”:通过查询Y轴负索引值,找到需要操作的函数指针,并执行相应移动。
  “复位”:通过查询复位索引值,找到需要操作的函数指针,并执行相应移动。
  “停止”:通过查询停止索引值,找到需要操作的函数指针,并执行相应移动。
  (2)液晶显示。
  执行相应操作后,在液晶显示屏中,显示对应的操作。
  (3)I/O检测。
  检测接近开关状态,实现原点复位操作。
  本系统相关底层驱动程序,包括I/O检测、显示屏显示、电机控制等程序已经测试完成。
  2 软件结构设计
  索引查询方式的层次化软件设计结构是根据结构体加函数指针实现的。结构体变量IndexlistStruct,并在结构体中的定义不同功能下的索引号IndexState,并建立对于电机运行轨迹的索引号,以及函数指针变量,指向需下一步操作所需执行的函数。
  底层驱动函数名如下所示:
  void I_Ocheck(void); //采样函数 void XPosMove(void); //左移函数
  void XNegMove(void); //右移函数 void YPosMove(void); //加法函数
  void YNegMove(void); //减法函数 void ResetMove(void); //菜单函数
  void StopMove(void); //返回函数
  结构体定义根据需要对数据类型进行定义,本文使用无符号整形变量。结构体所示如下:
  typedef struct
  {uint8 IndexState; //当前状态索引 uint8 XPosState;//按“向左”键时转向的索引
  uint8 XNegState;//按“向右”键时转向的索引uint8 YPosState; //按“向上”键时转向的索引 uint8 YNegState;//按“向下”键时转向的索引 uint8 ResetState; //按“菜单”键时转向的索引 uint8 StopMoveState; //按“退出”键时转向的索引 void (*DealOperate);//当前状态应该执行的功能操作} IndexlistStruct; IndexlistStruct结构体需要建立一个数组构成菜单索引号,包括同一驱动函数不同层次下的下一級指向的索引号和每个独立操作的底层驱动函数的函数指针,共同组成了一个“标签”,通过同层次上的索引号,电机控制的X轴正、X轴负、Y轴正、Y轴负4个方向的运动轨迹就可以依据同级菜单的索引号找到下一级next_index索引号,并通过更新next_index索引号,并根据next_index对应的*DealOperate()函数的操作号,执行DealOperate()函数。不同功能函数对应的索引号和层数数通过Sizeofmenu的具体操作值来定义。如下所示为具体的设计方法:
  IndexlistStruct code IndexTab[Sizeofmenu]=
  {{0,0,1,2,3,4,5,(*XPosMove)},//X轴正 {1,0,1,2,3,4,5,(*XNegMove)}, //X轴负
  {2,0,1,2,3,4,5,(*YPosMove)}, //Y轴正 {3,0,1,2,3,4,5,(*YNegMove)},//Y轴负
  {4,0,1,2,3,4,5,(*ResetMove)}, //复位 {5,0,1,2,3,4,5,(*StopMove)} //停止
  ……}
  在设计过程中可以把结构体数组放在程序代码的code区,这样在建立大体量的多层次结构索引时可以减少了内存的使用。另外可根据需要优化菜单的层数。如下是通过查询方式更新索引号并执行相应函数指针的操作:
  //错误处理返回主菜单 break; }
  DealOperateFunc=IndexTab[next_index].DealOperate; (*DealOperateFunc)(); //执行需要处理的操作 }综上所述,通过建立结构体变量实现对驱动函数的说明,构建包括索引号及函数指针的数组菜单,通过查询方式,更新不同操作的索引号,可以通过预先设计的功能顺序,实现不同函数功能,不同函数调用的交叉设计。在软件设计上,减少了多次调用函数的冗余设计,减少了C语言执行过程中的逻辑错误,提高了设计的重构性,方便地实现了在函数调用上的复杂性。
  3 结语
  产品设计中针对硬件系统和嵌入式软件系统的设计体量平衡是提高产品性能的重要指标,应避免“头大脚轻”。本文介绍的基于建立索引查询方式实现层次化的嵌入式软件设计方法,能够更好地平衡软件设计结构,提高软件设计效率,其可移植性和可重构性,也给在不同硬件系统平台上查询带来了方便。
  参考文献
  [1] 杨智明.C语言指针使用分析[J].保山学院学报,2012,31 (2):67-70.
  [2] 夏伟伟.C语言指针用法的探讨[J].电脑编程技巧与维护, 2014(21):12-13.
  [3] 华玉明.51单片机C语言模块化多文件编程方法探讨[J].吉林广播电视大学学报,2014(10):11-12.
其他文献
研究司法与民主的关联,就应以司法的运作过程为框架,论述民主如何体现在此过程中。在司法的运作过程中,法官的选任制度最能体现司法的民主性。因为,法官作为维护司法正义的最后一
英国和中国历史、文化、习俗、传统以及地理位置等等的不同,导致了英语习语与汉语习语在许多方面都存在着不同。文章通过对英汉习语的结构、来源、意义等方面的比较,对英汉习
摘 要:配电变压器的正常运行,对人们的日常生活以及生产活动都具有直接而严重的影响。在这种情况下,新时期我国在积极进行配电变压器维护和管理的过程中,必须对日常检查工作、维护工作的重点进行明确,并对配电变压器运行过程中的常见故障进行了解,当配电变压器发生故障时,做到第一时间判断故障原因,并有针对性地采取相应措施对配电变压器进行修复,将配电变压器故障所造成的经济损失降到最低。  关键词:变压器 故障分析
摘 要:节能环保是当今世界两大经济与社会发展议题,节约资源已上升为我国的基本国策。为深入扎实的落实好上级关于节能减排、勤俭节约的各项通知精神,我院为进一步做好“两型校园”建设,从降低消耗、减少损失和制止浪费入手,有效、合理地利用能源,推进我院科学发展和精细化管理。文章分析了当前我院用能用水的基本情况,指出了节能节水的重要意义,提出了节能降耗总体思路及具体措施。  关键词:节能 改造措施 存在问题