开云-BPO行业整合方案提供者
专业化、科技化、国际化;高标准、广覆盖、全流程
了解更多不容轻忽的嵌入式软件兼容性问题 时候:2024-12-13 21:25:48 手机看文章
扫描二维码随时随地手机看文章
嵌入式项目中,软件是一个不竭迭代的进程,需要斟酌各类兼容性。之前我们的项目,由于这方面斟酌得比力少,致使项目中后期开辟起来很被动。
项目系统整体设计阶段,应尽量地斟酌到将来可以碰见的环境,笼盖到尽量多的营业扩大。项目固然分阶段开辟,各个阶段完成的功能都纷歧样,整体设计要指向终究的需求。
数据兼容性 1、和谈制订制订的和谈要知足全部项目所稀有据的交互。
好比:
这里的 ID 设置为 1 个字节,可能有必然的风险。后面功能加着加着,可能 1 个字节的 ID 知足不了,就得改和谈。虽然可能知足了某个项目标需求,但万一以后其它项目也用了这一套代码,可是 1 个字节的 ID 知足不了,又得改代码。这里设置 2 字节可能会好一点,根基上能知足绝年夜部门环境的利用。
纷歧定为了笼盖规模更广而设置 4 字节,如许可能有点冗余。良多环境都有一个均衡点,需要本身衡量。
Length字段只设置了 1 个字节,可能也有必然的奉献。后面功能中假如有发较年夜的数据,可能要分很多多少包发,本来可以发得很快,被这里限制死了。到时辰想要提速,就得改和谈。
之前项目里,几块板间的通讯都用统一套和谈。但后期发现该和谈知足不了新需求,但为了不影响到前面的数据,又弄了一套和谈。致使项目里有两套差不多一样的和谈处置代码。
和谈应当是项目一最先斟酌好、制订好,全部项目开辟时代,都不该该再做改动。
2、数据添加后面新增的数据,不该该插入现有的数据中,应当零丁增添一个数据ID。
好比:
现有的数据中,有一条数据叫做装备信息的数据,装备信息里包括了:装备IP、装备Mac。这个数据会显示在手机APP上。对应的 C 说话代码:
#define MSG_ID_DEV_INFO0x0001 typedef struct _dev_info { char dev_ip[IP_MAX_LEN]; char dev_mac[MAC_MAX_LEN];}dev_info_t;
假设后面需要再显示一个装备的sn,这个数据我们应当加在哪里?
假如是项今朝中期,这时候候仍是在开辟阶段,我们可以随便点窜。由于装备sn也是装备信息的一部门,可以直接在装备信息这个数据里添加会比力公道:
#define MSG_ID_DEV_INFO0x0001 typedef struct _dev_info { char dev_ip[IP_MAX_LEN]; char dev_mac[MAC_MAX_LEN]; char dev_sn[SN_MAX_LEN];}dev_info_t;
假如是产物已在市场上畅通,这时候候这么加的话,软件兼容性就不太好。由于假设你的手机APP版本与装备版本不匹配,原本的装备IP和装备MAC这两个装备信息可能都显示不出来,由于我们这么一改,粉碎了原本的数据布局,而手机APP依照本来的数据来做解析的,会解析不外。
这时候候可以这么来加:
#define MSG_ID_DEV_INFO0x0001 #define MSG_ID_DEV_SN0x0002 typedef struct _dev_info { char dev_ip[IP_MAX_LEN]; char dev_mac[MAC_MAX_LEN];}dev_info_t; typedef struct _dev_sn { char dev_sn[SN_MAX_LEN];}dev_sn_t;
如许,哪怕手机APP版本与装备版本没有对应上,本来的数据仍是能正常显示的。固然,最好的环境固然是在开辟阶段就公道地设计好。否则,像这类环境,只能牺牲一些法式可读性来换取法式兼容性了。这会让后面看代码的人感觉很希奇,你这个sn不也是数据装备信息吗,怎样还零丁给一个ID。后面接办这个代码的人可能就会把这一块代码给改了。
温馨提醒:在没有完全弄懂保护项目标代码为何这么实现的环境下,能正常在跑的法式仍是别乱动得好,哪怕你感觉这是屎山代码。不然可能会出年夜问题。要末比及软件重构时再点窜,要末就继续打补钉。
3、数据删除假如是删除本模块内部本身利用的数据,你想怎样删就怎样删。
假如是删除与其它模块进行交互的数据,这就不克不及这么随便了。好比,要求、应对的体例。应对端给要求端返回的数据是不克不及随便删的,假如要删,必然要确保要求端已没有要求数据的需求,而且已去失落相干代码时,这时候候应对端才去删数据,不然仍是留着吧。
4、数据点窜其实数据定了,为了包管软件兼容性,应当是要制止点窜的。
假如必然要点窜,可以先增添一条新数据,后面渐渐切为新数据、删除旧数据。
接口兼容性正在利用的接口,应当尽可能不要点窜。假如要点窜,必然不要影响之前的功能。
之前就有碰到近似的环境。举个例子:
typedef enum _sys_status{SYS_STATUS_IDLE,SYS_STATUS_RUNNING,SYS_STATUS_STOP,}sys_status_t; static sys_status_t g_sys_status; sys_status_t get_sys_status(void) { return g_sys_status;}
这里的系统状况是要显示在手机APP上的,分歧的状况显示分歧的图标。后面要新增一个状况,成果数据供给者这么改:
typedef enum _sys_status{SYS_STATUS_IDLE,SYS_STATUS_NEW_STATUS,SYS_STATUS_RUNNING,SYS_STATUS_STOP,}sys_status_t; static sys_status_t g_sys_status; sys_status_t get_sys_status(void) { return g_sys_status;}
接口供给者把新增的数据插入了中心,影响了列举原本的挨次。成果手机APP上图标显示乱了。
影响到接口的点窜,要包管原本的数据不受影响。
系统兼容性在软件进级进程中,需要斟酌软件所依靠的其他系统组件是不是产生转变,以确保进级后软件可以或许正常运行,不会影响其他系统组件的正常运行。假如其他系统组件产生转变,则需要进行相干测试和文档更新,以确保全部系统可以或许正常运行。
别的跟着项目标迭代,这一套代码有可能运行在分歧的系统分歧的芯片平台。
好比,我们嵌入式Linux项目,有些项目里会用到一些第三方库,这时候候可能会编译成动态库的情势。要斟酌进级的时辰能不克不及进级动态库。假如不克不及,就得把依靠的库一路编译到可履行法式里。
别的,假如利用动态库,以后产物软硬件迭代换了一个芯片平台的话,我们就需要从头交叉编译一次所依靠的库。假如为了包管这一块的兼容性,也能够斟酌把所依靠的库与用户代码一路编译。
固然,这个按照现实环境进行衡量弃取。假如依靠的库良多,一路编译到可履行法式里,致使可履行法式很年夜,到时辰更新也欠好更新。
功能兼容性触及到功能的添加的,尽可能不要影响到之前已开辟的功能。否则也会增添用户对产物的进修本钱。好比某些唆使灯在前一个版本的快闪、慢闪代表甚么意思,这个在以后就尽可能不要去点窜了,否则用户又得从头理解。
机能兼容性在软件进级进程中,需要斟酌软件的机能是不是产生转变,以确保进级后软件的机能依然可以或许知足用户需求。假如软件的机能产生转变,则需要进行相干测试和优化,以确保软件可以或许正常运行,而且可以或许知足用户的机能需求。
好比,本来正常进级需要3分钟,某个版本以后进级酿成了6分钟,进级效力变差了。
平安兼容性在软件进级进程中,需要斟酌软件的平安性是不是获得增强,以确保进级后软件的平安机能够获得保障,不会呈现新的平安风险。假如软件的平安性获得增强,则需要进行相干测试和文档更新,以确保软件可以或许正常运行,而且可以或许保障用户的平安。
欲知详情,请下载word文档 下载文档