0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机软件开发的分层设计思路

STM32嵌入式开发 来源:51CTO 2023-09-22 10:29 次阅读

在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用再移植到目前这个平台等。这里又涉及到如何提高嵌入式应用软件的可移植性的问题,要想开发的应用程序在不同的嵌入式平台上具有高效率的可移植性,像Android sdk一样,统一的接口规范是必须的。

本文所要提到的嵌入式,其实更偏向于单片机。因为经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作系统本身就很强大,软件设计也变得水到渠成。

单片机更多时候是没有系统软件设计之说。一般的人会说,小项目才用单片机,实现功能简单,无需太多人参与,所以无需注重软件设计。其实是很幼稚的观点(刚毕业时我也是这样认为的)。因为目前mcu的处理速度,和实现功能已经可以满足很多项目的要求了。并且这些项目的软件也是越来越复杂。因此注重单片机类嵌入式软件设计是项目前期必须考虑的工作。

下面具体讲解单片机软件开发的分层设计思路。本栗子所使用的是飞思卡尔K21 MCU,IAR编译器。本文主题是讲软件分层,也就是底层软件和应用软件分开。当然可以把底层软件生成一个静态库提供給应用。但是这样就会有一个问题,如果静态库改变了,得重新编译,然后提供給应用,应用程序也得重新编译一下,这显然是很麻烦的一种处理方式。

于是我们可以用另外一种思路去实现:底层软件和应用软件是两个独立的bin文件,姑且叫libdev.bin和app.bin。非操作系统的嵌入式是没有动态库.so这样一说的,不过底层软件这个可执行文件姑且就认为是app的.so吧。这两个bin文件通过配置icf,映射到不同的flash空间以及分配不同的RAM空间。显然,这两个bin文件的关系是app.bin会调用libdev.bin的实现。但是他们是独立的bin文件,如何关联起来呢。这事就需要一个函数表告诉app.bin到哪里去调用libdev.bin里面的函数实现。

要实现这个函数表,就需要有统一的函数接口才方便管理。这个函数表可用静态库.a实现(libdev.a)。libdev.a的功能就是要映射所有libdev的接口函数,使app调用某一接口函数时,可以跳转到libdev.bin里面执行。如何实现上述思路,下面用一个具体实例讲解:

1.函数表用结构体的方式实现,结构体元素为函数指针。

eg:


struct libdev_ops{
    int (*dev_PortOpen)(int PortNum, char *PortParm);
};
2.在libdev.bin里面,对结构体里面的函数指针赋值。 eg:

void libdev_ops_init(struct libdev_ops *ops){
    ops->dev_PortOpen = dev_PortOpen;//把函数地址赋给对应的函数指针
}
3.程序启动时,先进入libdev.bin,然后再跳转到app.bin。在此需要一个地址跳转函数。 eg:

struct libdev_ops ops;
void call_app(int addr)
{
    int (*startup)(struct libdev_ops *ops);
    startup = (int(*)(struct libdev_ops *))(addr);
    libdev_ops_init(&ops);
    startup(&ops);
}
4.重新封装所有函数,如下:

int dev_PortOpen(int PortNum, char *PortPara)
{
    return ops->dev_PortOpen(PortNum,PortPara);
}
5.实现libdev.bin需要跳转地址的函数 eg:

void common_startup(struct libdev_ops *libdev_ops)
{
    ......
    ops = libdev_ops;
    //printf为不定参函数,不能在步骤2中进行赋值,所以在静态库里进行初始化赋值。
    dev_printf = ops->printf;
    main();//跳到app的main中
}

6.app.bin程序的启动地址修改,修改 IAR配置

工程名字--options--linker--library--勾选override default program entry,在Entry symbol 后面输入common_startup。

7.因为有两个.bin程序。所以就需要配置icf文件,并且call_app(addr)这个addr为app.bin里面common_startup函数的地址。因此需要编译app.bin后在output文件里面的app.map里面查看common_startup的地址是多少(由于这个函数是程序
最先执行的函数,所以其地址为icf配置的起始地址)。

8.然后你在应用里面包含了dev_PortOpen函数的头文件就可以正常调用这个函数了。

因为libdev.bin和app.bin是同时运行的(app.bin调用的libdev函数的实现在libdev.bin里面),因此必须把RAM和ROM分成两份,不得重叠。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620841
  • 嵌入式
    +关注

    关注

    4982

    文章

    18281

    浏览量

    288459
  • 软件开发
    +关注

    关注

    0

    文章

    555

    浏览量

    27177
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206735

原文标题:一种适合MCU的分层软件设计方法

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机软件开发兼职

    单片机产品要开发,主要是负责软件编程,如果软硬件都熟悉更好。产品是把0-10v,4-20ma等的类似信号采集处理后和其他产品通讯。负责方案的制定,软硬件的开发。有2-3个模块要
    发表于 05-13 12:52

    昆山单片机开发

    本人单片机开发10多年,精通各种单片机硬件和软件开发。联系电话:*** QQ:2310045326对价格的单片机熟悉,目前主要
    发表于 03-26 13:47

    招募单片机软件开发工程师一枚

    职位名称:单片机软件开发工程师(嵌入式软件开发工程师) 职位描述:1、单片机软件开发任职要求:1、本科以上学历,电子工程/电气工程相关专业;
    发表于 05-10 14:51

    单片机软件开发代码大全PDF下载

    单片机必备哈单片机软件开发代码大全.pdf 2015-7-25 12:18 上传 点击文件名下载附件 9.18 MB, 下载次数: 23
    发表于 07-19 02:28

    嵌入式软件开发中的程序架构

    在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系
    发表于 02-02 06:58

    嵌入式软件开发与非嵌入式软件开发的区别?

    嵌入式软件开发与非嵌入式软件开发区别?设备驱动开发与裸机驱动开发区别?嵌入式开发与传统单片机
    发表于 04-02 06:29

    STM32单片机软件开发实践资料分享

    经过前两章节对STM32的简单介绍,在接下来的几个章节中开始进行STM32单片机软件开发实践,所使用到的工具有Keil5、STM32CubeMX以及串口软件。对于STM32F1系列的单片机
    发表于 11-22 06:01

    介绍单片机 IAP 开发的设计思路

    主要介绍单片机 IAP 开发的设计思路,如何不使用下载烧录器的方式对单片机的程序进行升级,升级区域包括 bootloader 和用户程序的升级,升级方式有 UASRT 通信、CAN 通
    发表于 11-22 07:44

    基于C语言的MCS-51系列单片机软件开发系统

    基于C语言的MCS-51系列单片机软件开发系统,超星格式电子书
    发表于 02-09 09:33 58次下载

    单片机软件开发下载程序电路

    目前为止,接触单片机已有一些,从选择元器件、原理图、PCB、电路硬件调试、软件开发也算小有心得。
    发表于 07-17 10:06 1060次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>软件开发</b>下载程序电路

    单片机程序应用、驱动分层独立开发方案

    单片机程序应用、驱动分层独立开发方案
    发表于 11-13 12:36 18次下载
    <b class='flag-5'>单片机</b>程序应用、驱动<b class='flag-5'>分层</b>独立<b class='flag-5'>开发</b>方案

    单片机软件开发神器,非常好用的文件比较工具

    单片机软件开发神器,非常好用的文件比较工具
    发表于 11-13 12:51 0次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>软件开发</b>神器,非常好用的文件比较工具

    STC15单片机实战项目 - 新建工程(软件开发)

    STC15单片机实战项目 - 新建工程(软件开发)
    发表于 11-13 16:21 20次下载
    STC15<b class='flag-5'>单片机</b>实战项目 - 新建工程(<b class='flag-5'>软件开发</b>)

    STC15单片机实战项目软件开发第三讲 - 按键检测(外部中断)

    STC15单片机实战项目软件开发第三讲 - 按键检测(外部中断)
    发表于 11-22 15:06 16次下载
    STC15<b class='flag-5'>单片机</b>实战项目<b class='flag-5'>软件开发</b>第三讲 - 按键检测(外部中断)

    Keil软件公司8051单片机软件开发工具的介绍

    电子发烧友网站提供《Keil软件公司8051单片机软件开发工具的介绍.rar》资料免费下载
    发表于 10-20 16:43 2次下载
    Keil<b class='flag-5'>软件</b>公司8051<b class='flag-5'>单片机</b><b class='flag-5'>软件开发</b>工具的介绍