程序在nor flash中可以运行,但是是有限制的,它不能像RAM那样随意的写(尽管它可以随意的读)。在norflash上,不能运行写存储器的指令,不过排除写的地方是RAM类。实验中的三个文件如下所示:
Makefile如下:

  1. led_on.bin : crt0.S leds.c
  2.  arm-linux-gcc ---O2 -o crt0.o crt0.S
  3.  arm-linux-gcc ---O2 -o leds.o leds.c
  4.  arm-linux-ld -Ttext 0x0 crt0.o leds.o  -o led_on_elf
  5.  arm-linux-objcopy -O binary -S led_on_elf led_on.bin
  6.  arm-linux-objdump --m arm  led_on_elf > led_on.dis
  7. clean:
  8.  rm -f led_on.dis led_on_elf *.o led_on.bin 

crt0.S如下:

  1. @******************************************************************************
  2. @ Filecrt0.S
  3. @ 功能:通过它转入C程序
  4. @*****************************************************************************      
  5. .text
  6. .global _start
  7. _start:
  8.             ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
  9.             mov     r1, #0x0                     
  10.             str     r1, [r0]        @ 写入0,禁止WATCHDOG,否则CPU会不断重启
  11.             ldr     sp, =0x00001000     
  12.             bl      main                @ 调用C程序中的main函数
  13. halt_loop:
  14.             b       halt_loop
  15. leds.c如下所示:
  16.  
  17. #define GPBCON      (*(volatile unsigned long *)0x56000010)
  18. #define GPBDAT      (*(volatile unsigned long *)0x56000014)
  19. /*
  20.  * LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8
  21.  */
  22. #define GPB5_out (1<<(5*2))
  23. #define GPB6_out (1<<(6*2))
  24. #define GPB7_out (1<<(7*2))
  25. #define GPB8_out (1<<(8*2))
  26. void  wait(volatile unsigned long dly)
  27. {
  28.  for(; dly > ; dly--);
  29. }
  30. int main(void)
  31. {
  32.  unsigned long i = ;
  33.  // LED1,LED2,LED4对应的4根引脚设为输出
  34.  GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;
  35.  while(){
  36.   wait();
  37.   GPBDAT = (~(i<<));  // 根据i的值,点亮LED1,2,3,4
  38.   if(++== )
  39.    i = ;
  40.  }
  41.  return ;
  42. }

实验结果:这样的代码编译出来的程序在steppingstone(SRAM)中可以运行,但是下载到norflash中不能运行。
    修改代码:
crt0.S如下:

  1. @******************************************************************************
  2. @ Filecrt0.S
  3. @ 功能:通过它转入C程序
  4. @*****************************************************************************      
  5. .text
  6. .global _start
  7. _start:
  8.             ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
  9.             mov     r1, #0x0                     
  10.             str     r1, [r0]        @ 写入0,禁止WATCHDOG,否则CPU会不断重启
  11.             ldr     sp, =0x40001000     
  12.             bl      main                @ 调用C程序中的main函数
  13. halt_loop:
  14.             b       halt_loop

实验结果:这样的代码编译出来的程序在norflash中可以运行。

原因分析:
由于要跳转到main()函数中去执行,即C函数中去,就需要使用堆栈。代码“ldr     sp, =0x00001000”由于使用堆栈的地址位于norflash中,而当跳转到main()函数中去执行时,就会写norflash,而norflash不能像RAM那样随意写,所以不能成功执行。代码“ldr     sp, =0x40001000”由于使用堆栈的地址是0x40001000,使用的是(0x40000000—0x40001000),即是S3C2440的片内SRAM。这样跳转到main()函数时,用到的     就是片内SRAM,所以能够成功执行。

写内存的时机:
程序在运行过程中大多时候是在读内存,例如取指令、加载数据等等,写内存的时机大概这么几种情况:
1.写特殊功能寄存器(其实这个可以排除出去)
2.修改全局变量的值
3.讲数据压入堆栈保存。

程序在nor flash中真的可以运行吗?的更多相关文章

  1. "无法启动程序,因为计算机中丢失*.dll” 运行exe错误解决方法

    笔者把编译生成的win32 Release exe文件复制到另外一台电脑上,却发现程序不能运行,报错如下: 报错提示缺失动态链接库pcl_common_release.dll,那为什么在编译生成的电脑 ...

  2. TMS320F28335——下载程序到flash中

    一.让CCS软件支持Flash烧写 添加F28335.cmd文件 如图屏蔽掉25335_RAM_lnk.cmd 2.支持从Flash中拷贝文件到RAM中 添加DSP2832x_MemCopy.c 在主 ...

  3. 在SRAM、FLASH中调试代码的配置方法(附详细步骤)

    因为STM32的FLASH擦写次数有限(大概为1万次),所以为了延长FLASH的使用时间,我们平时调试时可以选择在SRAM中进行硬件调试.除此之外,SRAM 存储器的写入速度比在内部 FLASH 中要 ...

  4. 单片机程序在内存和FLASH中的空间分配

    本文转载于的tietao的博客!!!http://blog.csdn.net/tietao/article/details/8172411 *******防止自己忘记,固备之. 一句话:基于速度问题, ...

  5. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  6. vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)

    打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...

  7. 如何在Linux中使用Firejail运行应用程序

    有时您可能希望使用在不同环境中未经过良好测试的应用程序,但您必须使用它们.在这种情况下,关注系统的安全性是正常的.在Linux中可以做的一件事是在沙箱中使用应用程序. “沙盒”是在有限环境中运行应用程 ...

  8. 在CentOS 6 的cron/crontab中使用wine运行exe程序

    几个月前服务器的OS从Ubuntu 10.04转为CentOS 6.3,装好wine后手动运行shell脚本可以正常运行指定的exe程序(脚本和Ubuntu中的一样),于是就直接修改crontab定时 ...

  9. 在windows中:双击运行Python程序、后台运行Python程序

    在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...

随机推荐

  1. 【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型

    本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...

  2. List 排序

    1:sort 这种实现是用朗姆达表达式实现.Comparison<T> 委托详见 http://msdn.microsoft.com/zh-cn/library/tfakywbh.aspx ...

  3. sqrt 源代码

    stap -v -e 'probe process("/usr/local/mysql56/bin/mysqld").function("*@/usr/src/mysql ...

  4. crash recovery

    2016-07-02 17:56:07 5772 [Note] InnoDB: Database was not shutdown normally!2016-07-02 17:56:07 5772 ...

  5. 彻底理解android中的内部存储与外部存储

    我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...

  6. 文件处理-Directory类 (C#)

    转http://skybirdzw.blog.163.com/blog/static/7257062620099751329403/ 文件处理-Directory类 (C#) Directory.Cr ...

  7. 100 high quality blogs from java developers

    This list collects 100 high quality blogs from Java developers from all over the world. Some of thes ...

  8. 利用java开发一个双击执行的小程序

    之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 ...

  9. ACM——A + B Problem (2)

    A + B Problem (2) 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:2600            测试通过:137 ...

  10. Object-C类目(Category)

    类目是Object-C中最有用的一个特性.实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节. 这是特别有用的,因为你可以给一个内建的对象添加方法.当你想在你 ...