一种基于建立索引查询方式实现层次化嵌入式软件设计的方法
2018-02-03张伟张建霍亮高岩孙天澳李旭升王云亮
张伟++张建++霍亮++高岩++孙天澳++李旭升++王云亮
摘 要:本文介绍一种基于建立索引查询方式实现层次化的嵌入式软件设计方法,本方法具有可移植性、可重构性等特点,特别适合在控制器嵌入式软件实现层次化查询方式的多级调用的软件结构。
关键词:嵌入式软件 可移植性 可重构性 层次化
中图分类号: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.endprint