联系我们贴片高压电阻圆柱晶圆高压电阻插件金属膜高压电阻FAE

品质诚信服务

当前位置:首页 >> 产品和行业资讯 >> 嵌入式软件体系结构设计的分层设计

嵌入式软件体系结构设计的分层设计

在实际的项目开发中,项目通常是并行开发的,这意味着硬件设计,底层软件设计和应用程序软件设计是同时进行的。

例如,在开发板上调试模块驱动程序,在其他平台上调试应用程序,然后移植到当前平台等。

这是如何提高嵌入式应用程序软件的可移植性的问题。

这个问题将在下一篇博客文章中进行具体说明,敬请期待。

如果要在不同的嵌入式平台(例如Android SDK)上开发具有高效率可移植性的应用程序,则需要统一的接口规范。

本文提到的嵌入式系统实际上更偏向于单片机。

因为经典的linux + arm配置是具有丰富资源和高配置的嵌入式系统,所以操作系统本身非常强大,因此软件设计成为理所当然的事情。

通常,单片机中没有系统软件设计。

普通人会说单片机是用于小型项目的,这些项目易于实现且不需要太多人参与,因此无需关注软件设计。

这实际上是一个幼稚的观点(我刚毕业时也这么认为)。

因为当前的MCU处理速度和实现功能已经可以满足许多项目的要求。

这些项目的软件越来越复杂。

因此,在项目的早期阶段就必须注意单芯片嵌入式软件的设计。

以下是对单片机软件开发的分层设计思想的详细说明。

该板栗使用飞思卡尔K21 MCU,IAR编译器。

本文的主题是关于软件分层的,即底层软件和应用程序软件的分离。

当然,可以从底层软件生成静态库并将其提供给应用程序。

但这会有问题。

如果静态库发生更改,则必须对其进行重新编译,然后将其提供给应用程序,并且必须重新编译该应用程序。

这显然是一种非常麻烦的处理方式。

因此,我们可以使用另一种思路:底层软件和应用程序软件是两个独立的bin文件,我们将它们称为libdev.bin和app.bin。

没有用于非操作系统嵌入式的动态库.so,但是暂时将底层软件的可执行文件视为app.so。

通过配置icf,这两个bin文件被映射到不同的闪存空间并分配了不同的RAM空间。

显然,这两个bin文件之间的关系是app.bin将调用libdev.bin的实现。

但是它们是独立的bin文件,如何连接它们。

这需要一个函数表来告诉app.bin在哪里调用libdev.bin中的函数。

要实现此功能表,需要一个统一的功能接口以方便管理。

可以使用静态库.a(libdev.a)来实现此功能表。

libdev.a的功能是映射libdev的所有接口函数,以便当应用程序调用接口函数时,它可以跳转到libdev.bin以执行。

如何实现上述思想,以下是一个具体的例子进行说明:1.功能表是在一个结构中实现的,而结构元素是功能指针。

例如:struct libdev_ops {int(* dev_PortOpen)(intPortNum,char * PortParm);}; 2.在libdev.bin中,为结构中的函数指针分配值。

例如:void libdev_ops_init(struct libdev_ops * ops){ops-> dev_PortOpen = dev_PortOpen; //将函数地址分配给相应的函数指针} 3.程序启动时,请首先输入libdev.bin,然后跳至app。

bin这里需要地址跳转功能。

例如:struct libdev_ops ops;无效的call_app(int addr){int(* startup)(struct libdev_ops * ops); startup =(int(*)(struct libdev_ops *))(addr); libdev_ops_init(& op);}在libdev.a中4.重新打包所有功能,如下所示:int dev_PortOpen(int PortNum,char * PortPara){return ops-> dev_PortOpen(PortNum,PortPara);} 5. libdev的实现.bin需要一个跳转地址,例如:void common_startup(struct libdev_ops * libdev_ops){ops = libdev_ops; // printf是一个不确定的参数函数,无法在步骤2中进行分配,因此初始分配在静态库中执行。

dev_printf = ops-> printf; main(); ///跳到应用程序的主体}在app.bin 6.中,修改app.bin程序的启动地址,修改IAR配置项目名称-选项-链接器-库--检查覆盖默认程序条目,然后在Entry符号后输入common_startup。

7.因为有两个.bin程序。

因此,您需要配置icf文件和call_app(addr)

打开客服菜单