如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位

发布者:石头上种庄稼最新更新时间:2016-06-30 来源: eefocus关键字:KEIL初始化  RAM  软复位  上电复位 手机看文章 扫描二维码
随时随地手机看文章
笔记:

(1)如何禁止KEIL初始化RAM为零?

        1.    在KEIL Noinit 打钩

        2.    <1> 另须对需要热启动保持的变量用__at关键字指定某个区域,否则还是没用 (#include "absacc.h")

                <2>或者__attribute__((zero_init))  关键字  .bss段

 

int test1=1;

__attribute__((zero_init)) int test2;

int test3 __at(0x20001000);

查看MAP文件

test1                                   0x20000000   Data           4  main.o(.data)
test2                                     0x2000000c   Data           4  main.o(.bss)
test3                                    0x20001000   Data           4  main.o(.ARM.__AT_0x20001000)

 

  (2) 对STM32如何判断是软复位还是上电复位?     

       

       if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
       {
           //这是上电复位
       }
       else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
       {
           //这是外部RST管脚复位
       }
       else if (RCC_GetFlagStatus(RCC_FLAG_SFTRST) != RESET)
       {
           //这是外部RST管脚复位
       }
       //清除RCC中复位标志
       RCC_ClearFlag();

 

       void RestStm32Cpu(void)
      {   
        __set_FAULTMASK(1);   // 关闭所有中端
        NVIC_SystemReset();   // 复位
      }

  

 

微处理器:LPC2114

编译环境:Keil MDK V4.10

思路:

常把单片机系统的复位分为冷启动和热启动。所谓冷启动,也就是一般所说的上电复位,冷启动后片内外RAM的内容是随机的,通常是0x00或0xFF;单片机的热启动是通过外部电路给运行中的单片机的复位端一复位电平而实现的,也就是所说的按键复位或看门狗复位。复位后,RAM的内容都没有改变。在某些场合,必须区分出设备的重启是热重启还是冷重启。常用的方法是:确定某内存单位为标志位(如0x40003FF4~0x40003FF7 RAM单元),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如为0xAA55AA55),就认为是热启动,否则就是冷启动。

根据以上的设计思路思路定义一个变量:

uint32 unStartFlag;

在程序启动时判断:

if(unStartFlag==0xAA55AA55)

{

//热启动处理

}

else

{

//冷启动处理

unStartFlag=0xAA55AA55;

}

然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。通过看keil MDK自带的启动代码Startup.s,在这个启动代码中也并没有发现将整个RAM区域清零的语句。反汇编程序,发现从启动代码执行结束到跳转到main函数过程中,编译器还执行了很多库函数,其中__scatterload_zeroinit函数将所有W/R RAM都初始化为0(默认设置下)。为了判断冷、热启动,必须人为控制某些特定RAM在复位时不被编译器初始化为0。通过查找编译器手册,在为处理器的RAM中分出一块小片RAM,设置为NoInit格式(不对其初始化为0),如下图:

然后使用__at关键字将冷、热启动标志位定位到这个NoInit区域:

uint32 unStartFlag __at (0x40003FF4);

这样,当热启动时,变量unStartFlag所在的内存区域就不会被初始化为0,也实现了冷热启动的判断。

定义铁电0xFF7~0xFF8区域存储冷启动次数

0xFF9~0xFFA区域存储热启动次数

0xFFB~0xFFC区域存储总启动次数

 

另一种方法:

 

关键字:KEIL初始化  RAM  软复位  上电复位 引用地址:如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位

上一篇:ARM地址重映射的通俗解释
下一篇:[STM32] 关于USART接收中断的BUG和注意事项

推荐阅读最新更新时间:2024-03-16 14:58

华为P9配置大曝光:双摄像头和6GB内存
    华为去年发布了华为P8,华为Mate8等多款口碑不错的旗舰机,华为终端董事长 余承东 也在微博透露华为将在CES2016大会上展示重磅新品。根据之前的一系列传闻,其中的新品之一很可能就是华为P9手机。   知名行业分析师@潘九堂也在微博表示华为的新品将会配备双摄像头和6GB内存,而且今年和明年会押宝双摄像头和某神秘工艺,这不禁让人充满了期待。目前市面上的顶级旗舰机也只内置4GB运行内存,如果华为P9一下飙升到6GB,其他厂商又该如何应对?     据悉P9将采用5.2英寸的1080p屏幕,搭载麒麟950处理器,配备1300万像素后置摄像头,分别负责黑白和彩色画面的捕捉,传感器也依然是索尼IMX2X6。设计上
[手机便携]
为什么单片机内存那么少?
很多小伙伴就有这样的疑问:现在固态硬盘都以 T 为单位了,手机电脑内存都是8G、甚至32G了,为什么单片机RAM连1M都不到? 经典的AT89C51单片机,其内部只有128字节RAM(内存),同样经典的MSP430F149也只有2K的RAM空间。 即使现在用的比较多的STM32F1、F4系列,其最大的RAM也不到100K。 今天就来讲讲关于RAM以及单片机内存少的几点内容。 (备注:本文说的单片机,指MCU,微控制器) 关于RAM RAM:Random Access Memory,随机存取存储器,也是大家所说的内存。 RAM是一种易失性存储器,也就是说断电就会丢失存储数据。 RAM有一些常见特点: 随机存取
[单片机]
S5PV210的内存映射详解
一、S5PV210属于ARM Cortex_8架构、32位CPU。 1、32根地址线决定了CPU的地址空间寻址范围为小于等于4G,那么这4G空间(32位)如何分配使用?这个问题就是地址映射问题。如何分配是设计 CPU的人制定的,所以要查看数据手册。 2、映射的实质是将CPU32位分配给不同的外设,其中那段地址(那几个bit)连接那个特定设备是CPU设计者定义好的。 二、专业术语 ROM(read only memory) 只读存储器不能通过地址总线写,掉电数据不丢失,是顺序访问。硬盘,flash RAM(ramdom access memory)随机访问存储器,掉电数据丢失。内存 IROM(internal rom) 内部
[单片机]
S5PV210的<font color='red'>内存</font>映射详解
Tiny4412MMU内存管理
  MMU是Memory Management Unit的缩写,中文名是内存管理单元,MMU是由ARM芯片中的cp15协处理器管理,它的作用是负责虚拟内存到物理内存的映射   要将虚拟内存映射为物理内存,就要需要构建一张映射表,那么如何来构建这张映射表将至关重要,目前,32位操作系统提供的虚拟存为4G,每个地址占16位4个字节,如果虚拟内存与物理内存要实现一一对应,那么这个张表的一条记录就要占用8个字节,整张表的大小就为32G,这肯定是不可取的;于是我们就采用另一种方法,我们将一个地址的前12为即2的12次方4k做为基地址,后20位作为偏移量,现在我们只需要将虚拟地址的前12位与物理地址的前12一一对应;这样每条记录8字节,整
[单片机]
Tiny4412MMU<font color='red'>内存</font>管理
51单片机内部E2ROM
/*main.c源程序*/ #include reg52.h #include E2ROM.c #include key.c sfr WDT_CONTR = 0xE1;//定义STC单片机中新加入的看门狗寄存器 code uchar seven_seg = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//共阳数码管0--9(0时为有效断) code uchar scan_bit = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf}; //数码管位选 6 5 4 3 2 1 uchar
[单片机]
PIC关于RAM空间变量的绝对定位及分配
在目前的HI-TECH PICC中,BANK0.....BANK3这样的声明在默认情况下已经不起作用,编译器会根据RAM的使用情况尽量把变量全部安排在BANK0,我看了半天的用户手册测试也没有找到绝对定位的方法,相反,使用全局变量 unsigned long int A @ 0x70 这样的绝对定位却是非常有效的。以前的C教材中警告说这样的绝对定位编译器有可能不保留空间,转而会将其空间分配给其他变量,但目前还没发现编译器这样做,相反,如果0X70以前被别的变量占用,将0X70绝对定位后,原来占用该地址的变量被分配到其他空间。 这种绝对定位适用于多字节变量、数组、结构等多种形式,所定义的地址为数组或结构的第一字节地址 例如在下列声明
[单片机]
大陆首批国产NAND内存今年量产
大陆首批拥有完全自主知识产权的32层三维NAND闪存芯片即将于今年内量产。 由紫光集团联合大陆国家集成电路产业投资基金(大基金)、湖北集成电路产业投资基金、湖北科投共同投资建设的国家内存基地项目,首套芯片生产机台11日进场安装。 这代表着这个国家内存基地从厂房建设阶段进入量产准备阶段。 银河证券认为,全球内存的景气程度仍然较高,销售收入有望超出市场预期。 AI、物联网、汽车电子等新兴领域有望带来增量需求。结合硅片仍然呈现供不应求的趋势,预计整个半导体产业链复苏将超预期。 近期大陆政策加码将为集成电路产业发展保驾护航,预计大陆半导体行业未来2到3年复合增速将达到30%左右,行业的投资机会凸显,具有业绩支撑的龙头标的有望获得市场资金的
[半导体设计/制造]
VxWorks应用技巧两例
  VxWorks操作系统是一个应用比较多的实时多任务操作系统。它提供并支持多任务调度机制,用户可以将自己对事件的控制通过不同任务的协调而完成。各个任务之间通过全局变量、信号量、管道等方式进行信息交换。Wind ML是VxWorks上的一个二维图形用户界面,当多个任务都需要作画图工作时,可能出现当一个任务在正在作图时,被另一个作图任务打断,从而出现意想不到得情况。本文将介绍在VxWorks操作系统中,编写应用程序时的两个技巧。一个是内存变量保护;另一个是间的画图保护。 1 全局变量的保护   各个任务之间通过全局变量交换信息时,如果其中某一任务在引用同一个全局变量期间,该变量在另一任务中被重新赋值,那么就可能发生一些意想不到的
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved