【经验】使用8位MCU EFM8系列时如何避免堆栈溢出引起的程序错误?
SILICON LABS 创新型8位MCU EFM8系列提供完全集成的体验,非常适合物联网应用,提供了业界最快的速度和最低的功耗,使用增强型8051内核,集成UART、SPI、SMBUS、ADC等丰富外设。
当前单片机早已发展到了32位的时代,但是更先进更快的单片机出现并没有完全取代8位单片机,因为在很多的应用场合并不需要更快的速度、更大的存储空间,这个时候8位单片机就会在性价比上有很大的优势,但是8位机的资源往往很有限,RAM非常小,以Silicon Labs的EFM8BB2系列为例,采用了增强型的51内核,其标准的8051 RAM只有256Byte,这256个Byte有一部分还要留给堆栈空间使用。
我们在使用EFM8开发的时候,随着代码量的逐渐增加,有时候会突然发现程序不能正常运行了,给人的感觉往往是刚刚还正常,怎么突然debug就出问题了。表现形式包括但不限于
1、 循环进入后无法跳出,循环变量在几个值之间一直循环。
2、 总是出现看门狗复位。
3、 有些代码位置附近出现Flash Error Reset。
4、 有些变量的值明明没有操作却改变了。
5、 程序跑飞了。
当出现这些问题的时候,往往是由于堆栈溢出导致的。当我们把大量的全局变量、局部变量放入到RAM中的时候,堆栈能够使用的空间就会一点点被压缩,直至产生溢出,导致各种意想不到的错误。
为了避免堆栈溢出,可以将全局变量、局部变量放到XRAM中,以EFM8BB2系列为例,XRAM的空间为2048个Byte。如果工程的Memory model设置为Small,变量定义如不加特别修饰,会默认放在DATA空间中
unsigned char a; //变量a放到DATA空间中,即放到了RAM中
那如果我们这种情况下想把a变量放入到XRAM中,则要进行如下定义
unsigned char xdata a; //变量a放到XDATA中,即放到了XRAM中
如果工程的Memory model设置为Large模式,则变量定义如不加任何修饰,会默认放在XDATA空间
unsigned char a; //变量a放到XDATA中,即放到了XRAM中
这种情况下如果想把a放入到DATA空间中,则要进行如下定义
unsigned char data a; //变量a放到DATA中,即放到了RAM中
Memory model的设置位置如下图所示。
将变量放在DATA和XDATA中,会在程序运行速度上有所区别。变量放到XDATA中会使编译出来的程序略大于放到DATA中,在程序的执行速度上会稍慢于放到DATA中。变量具体放到什么位置需要根据具体的项目做综合的权衡。
在程序编写时,还要尽量减少函数的嵌套,因为函数嵌套会增大堆栈空间的开销。
笔者通过一个小程序对比了将变量放入到DATA与XDATA中程序执行时间的差别,供读者参考。程序主要是对数组Uart_Data[90]进行初始化赋值,并通过串口发送出去。在代码执行开始和结束的地方对P0.0口进行了电平翻转,以便通过逻辑分析仪抓取获得程序执行时间。
代码如下:
变量放在DATA中的程序运行时间如下:
变量放在XDATA中的程序运行时间如下:
从图中我们可以看到执行时间分别为7.676ms和8.394ms。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由黄昏提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。
相关推荐
【经验】8位单片机EFM8BB21 串口UART1的配置与调试
UART是单片机中经常要使用到的外设, Silicon Labs EFM8BB21系列8位单片机中有两个UART,分别UART0和UART1,本片文章主要介绍UART1的配置与调试。使用芯科官方推出的开发软件Simplicity Studio配置工具可以很方便的进行寄存器的初始化配置,省去了繁杂的计算。
设计经验 发布时间 : 2019-07-24
【经验】Silicon Labs 8位单片机EFM8BB21 GPIO输出配置与调试
Silicon Labs 创新型8位MCU提供完全集成的体验,非常适合物联网应用,提供了也接最快的速度和最低的功耗,同时EFM8系列车用8位MCU为当前市场上最具价值、最灵活和集成度更高的车载MCU。 GPIO为单片机中最常使用的功能,本文将以P0.0端口为例分享EFM8BB21的GPIO输出配置与调试。
设计经验 发布时间 : 2019-07-14
简单至关重要:为何8位MCU将持续发展?
几十年来,8位MCU一直是无数嵌入式应用的主力,尤其是消费产品和医疗器械中的应用。简单、有效的8位MCU在推动智能物联网产品的发展中发挥了核心作用。虽然其后代的功能(如32位和无线MCU)继续领先,但对于广泛的应用来说,8位MCU的普及和偏好没有放缓的迹象。
设计经验 发布时间 : 2023-11-22
【经验】8位单片机EFM8系列中通过官方配置工具快速进行寄存器的初始化配置并进行SPI调试的步骤说明
Silicon Labs创新型8位MCU EFM8系列提供完全集成的体验,非常适合物联网应用,提供了业界最快的速度和最低的功耗,使用增强型8051内核,集成UART、SPI、SMBUS、ADC等丰富外设。本文主要介绍通过Simplicity Studio配置工具快速进行寄存器的初始化配置并进行SPI调试的方法,方便刚刚接触到EFM8 MCU的用户快速上手。
设计经验 发布时间 : 2019-09-30
【经验】一文教你如何快速搭建8位MCU EFM8开发环境
Silicon Labs(芯科科技)在本文讲述如何快速搭建8位MCU EFM8开发环境,帮助行业人士深入掌握EFM8 8位MCU的开发及应用技巧。
设计经验 发布时间 : 2019-01-27
【IC】芯科推出新型8位MCU BB5x系列,边长范围2毫米~5毫米,高性能内核助力行业极小微型设备开发
芯科科技日前推出新型EFM8 BB50微控制器(MCU),这是专为极小型物联网(IoT)设备打造的产品,可以提高设计灵活性,同时降低成本和复杂性。全新的BB50 MCU也进一步扩展了Silicon Labs的EFM8 BB5 8位MCU产品系列,为嵌入式应用开发人员提供了更多选择。
新产品 发布时间 : 2023-03-17
【经验】8位单片机EFM8BB21 Timer0定时器配置与调试
Silicon Labs EFM8BB21系列8位MCU包含5个定时器,Timer0、Timer1、Timer2、Timer3、Timer4,Timer0和Timer1与标准的8051的计数器/定时器兼容。本文将分享Timer0的16位定时器功能的配置与调试,使用Simplicity Studio的配置工具可以方便的配置寄存器的参数,较之前需要自己手动计算相比,大大提高了便捷性和准确性。
设计经验 发布时间 : 2019-07-13
【经验】如何进行8位单片机EFM8BB21开发环境搭建与新建工程
Silicon Labs官方提供了带有集成式IDE的免费Simplicity Studio、不限代码长度的免费Keil编译器、演示、库与示例代码。本文将介绍如何进行8位MCU EFM8BB21开发环境的搭建与新建工程。
设计经验 发布时间 : 2019-07-10
【应用】找水仪项目选用芯科科技8位MCU C8051F340,带有USB控制器,开发简单,提供案例程序
找水仪项目,使用芯科C8051F340的8位MCU,带有USB控制器,专用开发环境,以及接口协议的案例,减少开发难度,降低开发成本。USB控制全速12Mbps,速率相对比较快,加快信息上传;外设接口多,便于添加外设。
应用方案 发布时间 : 2022-12-15
【经验】PCB布线技巧:8位单片机端口Crossbar功能的使用及配置
如果单片机自带Crossbar功能,只要软件配置调整一下各端口功能,PCB布线就会畅通。
设计经验 发布时间 : 2017-08-09
【经验】如何基于8位单片机EFM8SB10实现高可靠性容性触摸按键硬件电路设计?
Silicon Labs 8位单片机EFM8SB10系列,支持容性触摸功能,并以其精度高、功耗低、成本低等特点,被广泛应用在显示屏按键输入、油烟机面板、灶台面板等产品上。 然而,为了保证产品的可靠性及长久性,在硬件电路设计上,需要有多项注意事项,本文将带你详细了解这些内容。
设计经验 发布时间 : 2019-01-01
【应用】芯科科技高性能8位单片机EFM8BB31F32G用于音频放大器,集成多达四个12位DAC
本文介绍Silicon Labs 8位单片机EFM8BB31F16G-D-QFN24R用于音频放大器,优势:最高工作频率50MHz,稳定性好;集成一个12位ADC、四个具备同步和PWM功能的12位DAC;FLASH从16KB~64KB可选等。
应用方案 发布时间 : 2022-09-20
【经验】8位单片机EFM8BB21F16G在通过串口bootloader升级遇到的问题及解决方法
Silicon Labs的8位单片机EFM8系列在出厂的时候是芯片的最后一个扇区是有引导程序的,对用户的生产带来了很大便利,可以不通过调试器而是直接通过串口或IIC方式下载程序,依据出厂自带引导程序的类型。本文以EFM8BB21F16G为例进行介绍。
设计经验 发布时间 : 2019-03-25
8位单片机EFM8系列中芯片上的UID是什么?
UID是芯片中新加的全球唯一ID,即每个芯片的ID都是不一样的,EFM8系列的MCU上都包含此ID。有两类获取UID的方式,一种通过读取RAM的特定地址获得,一种通过读取Flash的特定地址获得。在早期引入此ID的MCU上(比如EFM8BB1/SB1/SB2)这个ID为32位,在芯片复位时(PC指针被复位至0之前)被复制至RAM中特定位置,用户程序可以读取其值。此位置的RAM仍然可以由用户使用。需要注意的是如果此位置被编译器分配了变量,那么当函数执行至main()时此位置的内容会被初始化代码覆盖。EFM8UB2的UID也是此类,但其位数为128位。在新的EFM8系列MCU上(比如EFM8BB3/LB1/UB1),UID位数为128位,存储在Flash上。
技术问答 发布时间 : 2017-05-05
【应用】Silicon Labs高性能8位单片机EFM8BB10适用于智能小车,主频可达25MHz
智能小车可以按照预先设定的模式在一个环境里自主的运行,不需要人为操作,具有自动循迹、避障、转弯等功能。本文将详细介绍Silicon Labs 8位单片机EFM8BB10在智能小车上的应用优势。
应用方案 发布时间 : 2020-11-29
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论