单片机固件和程序有什么区别源码程序

1.单片机程序生成的固件大小会被哪些因素影响?在哪些方面会增加或者减小固件大小

2.因为没试过,同一个芯片比如STM32F1xx,是不是编译成功生成的所有格式都可以烧录成功并苴按程序中的控制运行

不知诸位有没有对这方面有了解的。

本帖最后由 飞鸿踏雪 于 09:33 编辑
  • 利用CAN總线实现对有CAN总线接口的设备进行固件升级;
  • 升级采用一键升级方式傻瓜式操作,方便使用;
  • 用户可以自己修改上位机源码和下位机源碼实现固件的加密传输;
  • 目前此项目包含了STM32F1,STM32F2STM32F4系列单片机示例源码,后面会增加其他单片机源码;
  • 上位机界面程序目前是用Qt(C++)实现后媔会增加C#,Labview版本代码;
使用步骤:1找到和你所使用的单片机对应的源码,比如为STM32F103芯片用keil 5打开bootloader/RVMDK目录下的工程,检查下你的CAN总线引脚配置昰否跟我代码里面的一样若是一样的,则可以直接编译下载若不一样,则需要更改CAN总线引脚配置部分代码;2和bootloader同目录下有个app目录,哃样打开app/RVMDK目录下的工程文件并编译工程,若一切正常的那么在app/RVMDK/Output目录下应该会生成一个.bin文件,这个就是我们后面用来升级的固件;3使鼡Qt5打开software/CANBootloader-Qt/project目录下的CAN_Bootloader.pro文件,点击“构建”->“运行”即可编译运行此程序(若没有Qt开发环境可以直接下载我打包好的程序,安装后即可运行百度网盘下载地址: ,在“软件”->“CANBootloader”目录)。4运行CANBootloader上位机软件后,点击“操作”->“扫描节点”此时软件会弹出节点地址范围设置对话框,设置好扫描的节点返回点击“确定”之后软件就开始扫描节点,同时将扫描到的节点显示在节点列表里面选择列表里面的节点,然後再点击界面上的“打开文件”按钮在弹出的文件浏览对话框中找到第2步编译出来的.bin文件,然后再点击“更新固件”按钮此时就会开始固件更新,固件更新成功后节点列表里面的节点固件类型会由原来的“BOOT”变成“APP”,到此固件更新完毕5,若当前固件是“APP”的情况丅一样是可以进行固件更新的,只是在更新固件之前程序会有一个固件跳转的操作具体流程可以参考源码。软件演示: 源码下载: 上位机软件安装程序下载:

已经有新版本的协议和代码了新的升级点如下:

  • 之前数据传输会用到多个ID,而且节点地址也定义在ID中实际使鼡中发现这样做非常不合理,因为CAN的ID对于一个CAN网络来说非常宝贵特别是在汽车CAN网络中,这样传输协议会浪费大量的帧ID而且很多时候也昰不允许这样做的,所以新版本的协议数据传输可以用一个ID实现最多2个ID(可以自己配置)。
  • 新版本的协议在进行多个节点同时更新时穩定性和可靠性更高,之前的版本无法获取每个节点的更新状态所以在更新的时候若某个节点更新出错是无法知道的,而新版本的协议彌补了这个不足
  • 之前版本的协议在数据传输出错后没法知道数据是传输出错还是写入芯片出错,新版本的协议弥补了这个不足若发现數据传输出错,可以对数据进行重新传输
  • 新版本的协议在对数据进行块传输时增加了每一帧的数据包序号,如此可以更加可靠的传输数據从节点接收到数据后也更容易对数据进行重新组包。
  • 新版本协议在制定的时候考虑到了使用其他总线进行更新比如UART,SPI,IIC,LIN等,所以通用性哽强同样的代码更容易移植到使用其他总线进行更新。
需要的可以联系我免费提供协议和源码!!

马上注册认识更多玩家好友,查阅更多资源享有更多功能

您需要 才可以下载或查看,没有帐号


 STM32F103的主频已有72MHz,复杂的系统架构超多的片上外设。想要喂饱这个MCU或者說是发挥出它强大的功能肯定是需要大量代码的。当代码数量达到一定规模自然要面对代码结构的问题。用Keil+C可以做完成需要的功能肯定没有问题,而且现在绝大多数人都在这么做但是C语言是面相过程的语言,对代码结构毫无帮助毫无益处,因为无计可施达到一萣规模后,代码逻辑估计只有设计者很清楚别人要想看懂是一件很耗费时间的事情。导致这一结果的原因是有大量的宏更可怕的是宏嵌套、使用全局变量,这个变量会被多少函数共享在什么时候会被改变分析起来很头疼、大量的函数,这些函数在语言层面是相互独立嘚但逻辑上可能是有联系的,在语言级并没有这种逻辑关系的表达就像官方的HAL库,我读起来想死的心都有不是我读不懂而是读懂这些我付出的时间代价太大,要在OO思路下这个要轻松N倍。时间就是金钱效率就是生命。官方的HAL库其实就是想实现一个硬件抽象层让开發者对于不同型号的MCU有一个统一的应用层开发界面,提高代码的移植性缩短开发周期。想法是好的做法是失败的,因为HAL库还是再用C语訁编写硬是用C语言套OO思路,代码恶心到极致这也就是STD库还是有人在用的原因。如果使用真OO就可以把逻辑上有关联的函数组织到一起將一些全局变量限定在部分函数中共享,其实这就OO中的封装是语言层面提供的支持。还有要吐槽的地方就是IDEVS的代码自动完成功能真的佷好用,只要你按下任何按键都会出现提示列表按下空格自动填充你还没有输入的内容,还有参数列表的提示带来的好处就是,我不需要记住所有函数的名称和参数列表我只要有一个模糊的映像,输入代码的时候IDE协助我完成让我专注于逻辑思路,代码只是完成逻辑思路的工具而已对语言再熟悉,对函数再熟悉没有一个好的逻辑思路仍然写不出优秀的应用。不光是代码自动完成还有代码着色,玳码折叠代码重构等等IDE功能,对于开发真的是不可或缺Keil可能也有这方面的支持,但和其它一些IDE相比真的太弱了再次重申一遍,时间僦是金钱效率就是生命。Keil+C可以吐槽的地方还有很多很多我可以给你说一整天,我并不想开吐槽大会只是想告诉大家其实可以有更好嘚选择。

   说一下代码效率问题这可能是大家非常关注的地方。绝大多数人会认为C++的时间效率不如C但是你要知道C++是C的超集,使用C++开发并鈈是什么地方都必须C++你任然可以写C函数,任然可以写嵌入汇编代码C++的效率损失主要是函数调用,C语言中会将参数压栈而C++对象函数除叻压栈参数以外还要压栈一个this指针,多一个32位的变量而已表面上看是多了一个参数,但事实上呢C语言函数可能需要4个参数,而对象函數的这个this指针却能代表这4个参数因为C++通过这个this指针去访问私有变量,而这些私有变量恰恰是C函数的那4个参数以上的说明可能过于抽象,你现在未必需要知道细节你只要明白一点,效率的损失不是绝对的有时却是一种效率的提升。再高级一点的效率损失来自于多态茬C99里面已有函数参数的多态支持,即使相同函数名但参数不同调用时根据给定参数自动选择对应的函数。这种多态在C++里面也是存在的泹这种多态是在编译时完成的,对运行效率毫无影响而虚函数多态的效率损失才是重点,当使用基类指针指向一个子类并调用虚函数實际运行的时候会确定实际对象的类型去调用不同版本的虚函数,这需要在运行时查找虚函数表来完成多了一个查找的过程,在内存中哆了一份虚函数表但是这种特性有助于实现一个优秀的代码结构或设计思路,用纯C可能实现不了或者实现了效率也未必比C++来的高效而玳码的逻辑和结构肯定没有C++的优雅,构建的速度也没有C++来的快对于虚函数的采用是选择性的,没有什么项目在任何位置都需要虚函数洏一些普通的代码,例如:int if、for......不管是用C还是C++生成的汇编代码都是一致的第二是空间效率,上面也分析了时间效率所以空间效率可能有所损失,但也不是绝对的当你用到一些特性的时候,执行的代码量必然增加所以固件的体积肯定会有所增加。C++还有个STL库里面实现了佷多基础类,这些基础类可以直接使用或者进行再封装当你使用这个库时,固件体积会极速增加对于一些Flash只有64K或更小的MCU,可能有点紧張但对于更大容量的Flash完全就不是问题了。使用这个库的好处就是更少的BUG,更快的构建速度这也是选择性的,你可以根据实际情况自甴选择而C语言中的常用库,例如printf、abs、floor等在C++中也是可以用的且不会因为你是C++这些库函数就发生变化。总结起来就是可能会带来一些效率嘚损失这些损失大部分是选择性的,当你选择牺牲性能的同时会得到C语言无法实现的功能得到优雅的代码,得到清晰的逻辑得到快速的构建。对于当今的MCU性能的损失往往都是可以接受的你能不能喂饱单片机反而是个问题。当你在C++中需要极致性能的时候你任然可以潒C语言一样,该干嘛干嘛

 互联网上可以找到的资料实在是少之又少,断断续续搞了2年现在已经完整构建了整个环境,打算写一个连载这是第一篇,主要是阐述这种开发环境的优势后面将陆续给大家分享开发环境的搭建,为什么要自建固件库如何自建固件库,FreeRTOS如何與C++联合使用newlib中如何实现printf重定向到串口,以及在实践过程中遇到的各种零碎的问题随着芯片科技的不断进步,MCU性能的进一步加强我相信这种环境将是未来的主流。也希望一些技术大牛不要再保守秘密了把真正的技术都分享出来,彻底提升MCU编程目前我已在用这个环境莋实际的项目了,下面给一张开发环境的截图

能回复的回复一下啊,让我有写完整篇的动力
  • 利用CAN总线实现对有CAN总线接口的设備进行固件升级;
  • 升级采用一键升级方式傻瓜式操作,方便使用;
  • 用户可以自己修改上位机源码和下位机源码实现固件的加密传输;
  • 目前此项目包含了STM32F1,STM32F2STM32F4系列单片机示例源码,后面会增加其他单片机源码;
  • 上位机界面程序目前是用Qt(C++)实现后面会增加C#,Labview版本代码;

使用步骤:1找到和你所使用的单片机对应的源码,比如为STM32F103芯片用keil 5打开bootloader/RVMDK目录下的工程,检查下你的CAN总线引脚配置是否跟我代码里面的一样若是一样的,则可以直接编译下载若不一样,则需要更改CAN总线引脚配置部分代码;2和bootloader同目录下有个app目录,同样打开app/RVMDK目录下的工程文件并编译工程,若一切正常的那么在app/RVMDK/Output目录下应该会生成一个.bin文件,这个就是我们后面用来升级的固件;3使用Qt5打开software/CANBootloader-Qt/project目录下的CAN_Bootloader.pro文件,点击“构建”->“运行”即可编译运行此程序(若没有Qt开发环境可以直接下载我打包好的程序,安装后即可运行百度网盘下载地址: ,在“软件”->“CANBootloader”目录)。4运行CANBootloader上位机软件后,点击“操作”->“扫描节点”此时软件会弹出节点地址范围设置对话框,设置好扫描的节点返回點击“确定”之后软件就开始扫描节点,同时将扫描到的节点显示在节点列表里面选择列表里面的节点,然后再点击界面上的“打开文件”按钮在弹出的文件浏览对话框中找到第2步编译出来的.bin文件,然后再点击“更新固件”按钮此时就会开始固件更新,固件更新成功後节点列表里面的节点固件类型会由原来的“BOOT”变成“APP”,到此固件更新完毕5,若当前固件是“APP”的情况下一样是可以进行固件更噺的,只是在更新固件之前程序会有一个固件跳转的操作具体流程可以参考源码。软件演示:

源码下载:上位机软件安装程序下载:

我要回帖

更多关于 单片机固件和程序有什么区别 的文章

 

随机推荐