《AVR单片机原理与GCC编程实践》P117讲到AVR代码段时,提到了.bss段中包含了一个很有意思的.noinit段。
.noinit段描述:
.bss段的变量在芯片启动的 .init4阶段会被清0,但是定义在 .bss的 .noinit段中的变量在 .init4阶段不会被清0。
单片机不掉电复位后, .noinit段的这些变量的值依然存在,可以继续使用。
.noinit段的定义方法:int bar __attribute__ ((section (".noinit")));
不能指定初值,因为这些变量是在 .bss段。
.noinit段变量的复位测试:
也就是说、如果我在.noinit段定义一个变量,按下开发板的复位键(单片机不掉电复位),这个变量的值不会被清0。
下面是测试代码,我在.noinit段定义了变量bar,初值未知。
8bit的bar正好可以用连接在PORTB的8个LED灯来显示它的数值。
每次进入程序后、bar++,所以每按一次复位键,bar对应的8个LED灯的二进制数值就加1(二进制计数器)。
测试代码:
#include uint8_t bar __attribute__ ((section(".noinit"))); int main(void) { bar++; DDRB = 0xFF; PORTB = 0xFF; PORTB = bar; while(1) { } return 0; } 测试结果: 我的8个LED是低推的,所以点亮的LED对应的引脚逻辑值是0,熄灭的LED对应的引脚逻辑值是1。 于是得到下面的结果: 程序下载到开发板后,这一次bar的初值是00000001(这次比较巧),每按一次复位键,bar的值都加1了。 重新下载程序后,bar的初值也会自己加1,也相当于单片机不掉电复位。 ------------------------------------------------------------------------------------------------------------------------ 使用.noinit特性测试BOD掉电: 2016.05.30 今天发现.noinit的特性还可以测试BOD掉电。 依然是使用上面的代码中的.noinit,加上PA0输出脉冲,同时查看PORTB的二进制计数器来得知复位次数。 代码如下: int main(void) { // PA0为输出口 DDRA = (IO_OUTPUT << DDA0); // 记录复位次数 _noinit_using(); while(1) { // PA0拉高 PORTA = (1 << PA0); // 维持0.5秒 delay_ms(500); // PA0拉低 PORTA &= ~(1 << PA0); // 维持0.5秒 delay_ms(500); } return 0; } 其中的_noinit_using()如下: volatile uint8_t v_noinit __attribute__ ((section(".noinit"))); // ========================================================================================================== // 通过观察PORTB上的8位LED的状态得知复位次数 // ========================================================================================================== void _noinit_using(void) { v_noinit++; // 8位LED,低推 DDRB = 0xFF; PORTB = 0xFF; PORTB = v_noinit; } 测试结果: 1、当前芯片BOD监测的电压是4.0V 2、使用.noinit可以测试复位次数(二进制计数器) 3、每次将电压源电压低到<3.7V,就会引发复位,而PORTB的二进制计数器就会加1 4、而且低到1V以下,复位后依然可以记住上一次的.noinit变量的值,大概是没有完全掉电的缘故 5、正常工作时可以看到PA0的脉冲,复位时中断。 ------------------------------------------------------------------------------------------------------------------------ 使用.noinit特性测试看门狗WDT: 在另一篇测试WDT效果的文章中,还是用这个.noinit+二进制计数器的方法测试了WDT的复位: http://blog.csdn.net/manon_des_source/article/details/51540217
上一篇:B001-Atmega16-中断(GCC-AVR)-(ques=3)
下一篇:B001-Atmega16-PORTA的定义-(ques=1)
推荐阅读





推荐帖子
- 基于Windows CE的嵌入式导航软件设计与实现.pdf
- 基于WindowsCE的嵌入式导航软件设计与实现.pdf基于WindowsCE的嵌入式导航软件设计与实现.pdf
-
yuandayuan6999
单片机
- 一名博士的文章(转)
- 我出生的时候是一个下雪的深夜,我的父亲在床边生了一堆柴火,我的母亲躺在四周漏风 的那间破屋角落的床上,咬紧牙关,生下了我。27年后,也是在一个下雪的深夜,我完成 了我的博士论文。当我打完最后一个字的时候,我站起来,拉开窗帘,打开窗户,白天还 吵吵闹闹、喧嚣的世界变成一片洁白,让人顿感清净。我从进入大学到博士毕业整整十年。在这十年中,我过得浑浑愕额。十年前,我身高170c m,十年后,我身高还是170cm;十年前,我体重60kg,十年后,我体重还是60kg;十年前 ,我一无所有,十年
-
呱呱
嵌入式系统
- USB转R232线的使用问题
- 装上驱动了,但是用超级终端和2440板连通信不了 不知道是驱动的问题还是其它问题,请教一下大家? 新买的帝特DT5002线USB转R232线的使用问题
-
zkissinger
嵌入式系统
- 用CCS汇编语言编一个基于DSPTMSC5509的自相关程序。
- 用c编一下main() { inta[L]={1,2,3}; intb[L]={1,2,3}; unsignedinti,j; for(i=0;i<=L;i++) { for(j=0;j<=i;j++) { out[i]+=a[j]*b[i-j]; } } 用CCS汇编语言编一个基于DSPTMSC5509的自相关程序。
-
zealjolly
DSP 与 ARM 处理器
- 51 UART的问题急求大神帮忙
- 我的单片机用usb转串口供电,另买了一个gsm模块,当单片机的UART收发端和gsm的相连后程序无法下载到单片机里,为什么?51UART的问题急求大神帮忙
-
wszrx1234
51单片机
- 氮化镓电子产品会改变世界吗?
- [localvideo]ffb7bb0c65a82fe852d5764c1887834b[/localvideo] 氮化镓电子产品会改变世界吗?
-
btty038
RF/无线