程序在nor flash中真的可以运行吗?
程序在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中真的可以运行吗?的更多相关文章
- "无法启动程序,因为计算机中丢失*.dll” 运行exe错误解决方法
笔者把编译生成的win32 Release exe文件复制到另外一台电脑上,却发现程序不能运行,报错如下: 报错提示缺失动态链接库pcl_common_release.dll,那为什么在编译生成的电脑 ...
- TMS320F28335——下载程序到flash中
一.让CCS软件支持Flash烧写 添加F28335.cmd文件 如图屏蔽掉25335_RAM_lnk.cmd 2.支持从Flash中拷贝文件到RAM中 添加DSP2832x_MemCopy.c 在主 ...
- 在SRAM、FLASH中调试代码的配置方法(附详细步骤)
因为STM32的FLASH擦写次数有限(大概为1万次),所以为了延长FLASH的使用时间,我们平时调试时可以选择在SRAM中进行硬件调试.除此之外,SRAM 存储器的写入速度比在内部 FLASH 中要 ...
- 单片机程序在内存和FLASH中的空间分配
本文转载于的tietao的博客!!!http://blog.csdn.net/tietao/article/details/8172411 *******防止自己忘记,固备之. 一句话:基于速度问题, ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)
打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...
- 如何在Linux中使用Firejail运行应用程序
有时您可能希望使用在不同环境中未经过良好测试的应用程序,但您必须使用它们.在这种情况下,关注系统的安全性是正常的.在Linux中可以做的一件事是在沙箱中使用应用程序. “沙盒”是在有限环境中运行应用程 ...
- 在CentOS 6 的cron/crontab中使用wine运行exe程序
几个月前服务器的OS从Ubuntu 10.04转为CentOS 6.3,装好wine后手动运行shell脚本可以正常运行指定的exe程序(脚本和Ubuntu中的一样),于是就直接修改crontab定时 ...
- 在windows中:双击运行Python程序、后台运行Python程序
在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...
随机推荐
- 【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- List 排序
1:sort 这种实现是用朗姆达表达式实现.Comparison<T> 委托详见 http://msdn.microsoft.com/zh-cn/library/tfakywbh.aspx ...
- sqrt 源代码
stap -v -e 'probe process("/usr/local/mysql56/bin/mysqld").function("*@/usr/src/mysql ...
- crash recovery
2016-07-02 17:56:07 5772 [Note] InnoDB: Database was not shutdown normally!2016-07-02 17:56:07 5772 ...
- 彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 文件处理-Directory类 (C#)
转http://skybirdzw.blog.163.com/blog/static/7257062620099751329403/ 文件处理-Directory类 (C#) Directory.Cr ...
- 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 ...
- 利用java开发一个双击执行的小程序
之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 ...
- ACM——A + B Problem (2)
A + B Problem (2) 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:2600 测试通过:137 ...
- Object-C类目(Category)
类目是Object-C中最有用的一个特性.实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节. 这是特别有用的,因为你可以给一个内建的对象添加方法.当你想在你 ...