找回密码
 立即注册
查看: 154|回复: 0

【PIO】使用platformIO如何设置Memory Models (2)

[复制链接]
  • TA的每日心情
    无聊
    16 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    20

    主题

    87

    回帖

    1220

    积分

    金牌会员

    积分
    1220
    发表于 2024-1-12 00:15:53 | 显示全部楼层 |阅读模式
    本帖最后由 大锤子 于 2024-1-13 00:02 编辑

    书接上文;
    keil c51中有专门设置存储模型的设置项,而我们知道页面上的设置也都是在调用编译工具进行编译时的参数。因此我们不妨先到SDCC用户手册中寻找一下model-large这个关键词,看用户手册是怎么说的:
    2024-01-12-09-08-35.png

    可以看到这个3.3.6这一章节有专门的介绍,--model-large是一个MCS51专用的命令行选项。既然提到了命令行,那为了寻找答案需要先测试以下命令行:
    下边的操作有个小前提,就是大家已经在电脑上安装了sdcc,如果没有安装也可以直接将PIO安装的sdcc配置到系统环境变量中;


    接下来进入主题,测试命令行中加入--model-large。为了凸显--model-large的作用,设置一个对比试验;
    在main函数中定义一个1024长度的char类型的数组;
    实验一:直接编译,预期会报错;
    实验二:在命令行中加上--model-large,预期成功,并且查看.mem文件的内容:


    上边的操作证明sdcc 可以通过添加命令行选项--model-large来设置存储模式,在生成的.mem文件中也能看到添加了--model-large的在外部RAM中使用了1024字节;
    到这里距离我们的答案已经进了一步,但是要跨越到下一步确实比较难的。至少需要开始了解pio的知识。因为毕竟我们是在pio中设置这个选项的。因此再次回到pio项目中。我们先尝试在pio编译的输出中找找线索:
    pio输出.png
    pio run 输出的内容中并没有sdcc 命令之类的,但是看到绿色框中的内容可以加上 -v这个参数来显示更多的内容:
    pio-v输出.png
    可以看到除了我们需要的sdcc 命令同时还有原先在.mem文件中看到的内存使用情况;
    从输出中看到,使用了两次sdcc命令,注意第一次仅仅是编译main生成main.rel. 第二次是生成了hex。注意这里的hex实际是--out-fmt-ihx 这个命令行参数的作用。这个参数同样可以在SDCC的用户手册中找到,大家可以自行了解,这里不贴图了。
    从上边构建输出的内容中可以发现pio将很多sdcc 的命令行参数设置进去了。所以需要进一步了解一下pio。
    打开pio官方网站:pio官网 看到非常醒目的图标和标题。支持1500+board。
    2024-01-12-22-53-43.png

    打开官方的文档:
    2024-01-12-22-58-42.png

    简单介绍一下:
    最上边是快速开始,讲了什么是pio,它的生态,它的目标及它所获得的荣誉;
    下边介绍的是配置,其中有个platformio.ini这个重点介绍了pio工程中配置文件的各种配置,类似keil的魔术棒;
    再下边更加深入的介绍了库管理、平台、框架的原理,之前分享的自定义board就是在这一部分了解到的;
    进一步展开platformio.ini :
    2024-01-12-23-06-35.png

    platformio.ini 目录下有4部分内容,分别是:
    1、platformio相关的设置项;
    2、工作环境设置项,每个工程可以有多个环境,各个环境之间互不影响。
    3、介绍了一种更加高级的配置项取值方式;
    4、一些示例;
    这里我们需要解决的问题重点关注第二项中的Build options:
    2024-01-12-23-13-18.png

    其中主要关注build_flags, 因为它的使用说明中这样说,通过这里设置的值可以影响预处理,汇编,连接等过程。
    因此我们尝试将--model-large 配置到这里看下是不是能达到目的:
    2024-01-12-23-22-26.png l

    很可惜失败了,那是什么原因呢,看这个报错信息
    main是model-large, 但是start_up是model-small; 如果细心的话在上一篇文章中SDCC文档中支持四种存储模型的时候应该会注意到一句话,在编译和连接的时候所有的模块必须是一样的存储模型; 接着看输出的sdcc命令,在第一句中确实添加了--model-large; 但是在第二句中却没有加那它默认的肯定就是model-small了。这就是失败的原因。
    我们依然通过一个小实验来验证一下。
    先用sdcc 带model-large 生成rel。 然后再不带这个参数执行第二句,看看结果:


    从上边的演示可以看出确实是编译和连接一个带参数一个不带导致的。
    那为什么pio没有给第二句也添加这个参数呢,有人也找到了答案,其实是pio内核的某段代码在处理LINKFLAGS参数时有个bug导致的。但是也有解决方案。要不就是改掉那个bug。要不就是使用我们上文给出的解决办法,这个办法其实涉及的内容就更深入了,PIO社区给出的解决办法就是上文中提到的model-large解决方式 。它所涉及的内容就更加深入一点。不是我们两篇文章就能讲明白的;













    不争是争
    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-30 23:17 , Processed in 0.067283 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表