程序在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的日志输出程 ...
随机推荐
- 2假动作,数据缓冲,CCEaseExponential,CCEaseElastic,CCEaseBounce,CCCallFunc,funcNCallBack,funcNDCallBack,funcO
1 缓冲动作 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/4 ...
- 算法 - 求和为n的连续正整数序列(C++)
//************************************************************************************************** ...
- tomcat管理web界面
在/usr/tomcat/apache-tomcat-7.0.47/conf/tomcat-users.xml里 <?xml version='1.0' encoding='utf-8'?> ...
- linux ssh 中在window 传文件 下载文件 工具
centos 安装工具 yum install lrzsz
- Nginx/Apache图片缩略图技术
1,目的 2,使用方式 3,Nginx + Linux 缩略图实现 3.1,原理 3.2,nginx配置实现 3.3,例子 4,Apache + Windows缩略图实现 4.1,环境 4.2,原理 ...
- zoj 3672 思考题
http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4915 真是老了.脑子不会动了,可是事实上就算如今搜了题解A了,还是没总结出思 ...
- careercup-递归和动态规划 9.3
9.3 在数组A[0...n-1]中,有所谓的魔术索引,满足条件A[i]=i.给定一个有序整数数组,元素值给不相同,编写一个方法,在数组A中找出一个魔术索引,若存在的话. 进阶: 如果数组元素有重复值 ...
- 导演类(CCDirector)
- WPF在后台中写一个鼠标移入移出的操作
在这个问题上我纠结了好久就是为了一个问题就是forebackground这个属性 lblPwd.Foreground = Brushes.Black;我以前一直以为是fontground这个属性可是我 ...
- radioButton的简单使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...