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

led_on.bin : crt0.S leds.c
 arm-linux-gcc -g -c -O2 -o crt0.o crt0.S
 arm-linux-gcc -g -c -O2 -o leds.o leds.c
 arm-linux-ld -Ttext 0x0 crt0.o leds.o  -o led_on_elf
 arm-linux-objcopy -O binary -S led_on_elf led_on.bin
 arm-linux-objdump -D -m arm  led_on_elf > led_on.dis
clean:
 rm -f led_on.dis led_on_elf *.o led_on.bin 

crt0.S如下:

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@*****************************************************************************      
.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str     r1, [r0]        @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            ldr     sp, =0x00001000     
            bl      main                @ 调用C程序中的main函数
halt_loop:
            b       halt_loop
leds.c如下所示: #define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)
/*
 * LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8
 */
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
void  wait(volatile unsigned long dly)
{
 for(; dly > ; dly--);
}
int main(void)
{
 unsigned long i = ;
 // LED1,LED2,LED4对应的4根引脚设为输出
 GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out;
 while(){
  wait();
  GPBDAT = (~(i<<));  // 根据i的值,点亮LED1,2,3,4
  if(++i == )
   i = ;
 }
 return ;
}

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

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@*****************************************************************************      
.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str     r1, [r0]        @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            ldr     sp, =0x40001000     
            bl      main                @ 调用C程序中的main函数
halt_loop:
            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. J2EE之ServletContext读取资源文件

    ServletContext读取资源文件内容的方式有两种: 方法1. public void doGet(HttpServletRequest request, HttpServletResponse ...

  2. 征服 Nginx + Tomcat【转】

    征服 Nginx + Tomcat Server Architecture/Distributed nginxtomcatsessioncluster  2年前一直折腾Apache,现如今更习惯Ngi ...

  3. redis单机及其集群的搭建

    http://www.cnblogs.com/mouseIT/p/5288204.html

  4. 【转】Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

    http://blog.csdn.net/ccf19881030/article/details/9204801 很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs20 ...

  5. Android开发之异步获取并下载网络资源-下载图片和下载文本内容

    在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图   ...

  6. Java基础知识强化之IO流笔记58:内存操作流

    1. 内存操作流: 用来操作处理临时存储的信息的. (1)操作字节数组: ByteArrayInputStream ByteArrayOutputStream 代码示例: package cn.itc ...

  7. 深入理解计算机系统第二版习题解答CSAPP 2.6

    使用打印字节的方式可以知道十进制数12345的十六进制为0x00003039,十进制浮点数12345.0的十六进制为0x4640E400. 转换为二进制为 /* 0 0 0 0 3 0 3 9 *** ...

  8. 安卓项目-利用Sqlite数据库,开发新闻发布系统

    本教程致力于程序员可以快速的学习安卓移动端手机开发. 适合于已经习得一种编程语言的同仁. 更多志同道合,想要学习更多编程技术的大神们. 小弟不才,麻烦关注一下我的今日头条号-做全栈攻城狮. 本文章是基 ...

  9. 设置repeater每行多少个的方法

    前台代码: <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">< ...

  10. NFS文件共享系统

    1.NFS介绍 NFS是Network File System的缩写,主要功能是通过网络让不同的机器系统之间可以彼此共享文件或目录.NFS服务器可以允许NFS客户端将远端NFS服务端的共享目录挂载到本 ...