开发板(demoboard)是用来进行嵌入式系统开发的电路板,包括中央处理器、存储器、输入设备、输出设备、数据通路/总线和外部资源接口等一系列硬件组件。开发板一般由嵌入式系统开发者根据开发需求自己订制,也可由
用户自行研究设计。开发板是为初学者了解和学习系统的硬件和软件,同时部分开发板也提供的基础集成开发环境和软件源代码和硬件原理图等。常见的开发板有51、ARM、FPGA、DSP开发板。
这里我们先来说说ARM开发板:
ARM开发板,即以英国ARM(Advanced RISC Machines)公司的内核芯片作为CPU,同时附加其他外围功能的嵌入式开发板,用以评估内核芯片的功能和研发各科技类企业的产品。
ARM开发板根据ARM内核可以分为ARM7、ARM9、ARM11、 Cortex-M系列、Cortex-R系列、Cortex-A系列。其中Cortex-M3系列又可分为Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4;Cortex-R系列分为Cortex-R4、Cortex-R5、Cortex-R7;Cortex-A系列分为Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A50等,同样也就有了对应内核的Cortex-M0开发板、Cortex-A5开发板、Cortex-A8开发板、Cortex-A9开发板、Cortex-R4开发板等等。由于ARM公司只对外提供ARM内核,各大厂商在授权付费使用ARM内核的基础上研发生产各自的芯片,形成了嵌入式ARM CPU的大家庭,提供这些内核芯片的厂商有提供这些内核芯片的厂商有Freescale/NXP、TI、Atmel/Microchip、ST、Samsung等。
做ARM系列开发板知名的公司有保定飞淩、友善、天嵌、天漠、优龙、博创、扬创、seeed studio、精仪达盛科技、米尔科技、创龙等。
下面图例是飞淩公司出的OKT507开发板,具体资料见 www.forlinx.com
嵌入式之ARM开发板经典问答100问
第 1问:
Q:请问在初始化 CPU堆栈的时候一开始在执行mov r0, LR这句指令时处理器是什么模式?
A:复位后的模式,即管理模式.
第 2问:
Q:请教:MOV中的 8位图立即数,是怎么一回事 0xF0000001是怎么来的A:是循环右移,就是一个 0—255 之间的数左移或右移偶数位的来的,也就是这个数除以 4一直除, 直到在 0-255的范围内它是整数就说明是可以的!
A:8位数(0-255)循环左移或循环右移偶数位得到的,F0000001既是 0x1F循环右移4位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把 32位立即数放在32位的指令中.移位偶数也是这个原因.可以看一看ARM体系结构(ADS自带的英文文档)的相关部分.
第 3问:
Q:请教:《ARM微控制器基础与实战》2.2.1节关于第 2个操作数的描述中有这么一段:
#inmed_8r常数表达式.该常数必须对应8位位图,即常熟是由一个 8位的常数循环移位偶数位得到.
合法常量:0x3FC,0,0xF0000000,200,0xF0000001.
非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.
常数表达式应用举例:
...
...
LDR R0,[R1],#-4 ;读取 R1 地址上的存储器单元内容,且 R1 = R1-4针对这一段,我的疑问:
1. 即常数是由一个 8位的常数循环移位偶数位得到,这句话如何理解2. 该常数必须对应 8位位图,既然是8位位图,那么取值为 0-255,怎么 0x3FC这种超出 255的数是合法常量呢3. 所举例子中,合法常量和非法常量是怎么区分的 如 0x3FC 合法,而 0x1FE却非法0xF0000000,0xF0000001都合法,而0xF0000010又变成了非法4. 对于汇编语句 LDR R0,[R1],#-4,是先将 R1的值减 4结果存入 R1,然后读取 R1所指单元的 值到 R0,还是先读取 R1到R0,然后再将 R1减 4结果存入R1
A:提示,任何常数都可用底数*2的 n次幂 来表示.
1. ARM结构中,只有 8bits 用来表示底数,因此底数必须是8位位图.
2. 8位位图循环之后得到常数,并非只能是8位.
3. 0xF0000010底数是 9位,不能表示.
4. LDR R0, [R1], #-4 是后索引,即先读,再减.
可以看一看 ARM 体系结构对相关寻址方式的说明.
第 4问:
Q:在程序移植的过程中,什么代码段处于什么样的模式,这可真是一个困扰人的大难题,有没有一种标志或办法能够识别"代码段处于什么样的模式"
A:读取 CPSR ,任何时候都是可以读.
第 5问:
Q:为什么保护现场时,总是保护 R0-R3,R12,为什么不保护R4-R11
A:请看一看"ARM-thumb 过程调用标准"这个文档.
第 6问:
Q:请问 mov R1,#0x00003DD0 错误:out of the range of operation是怎么回事情我就是想IODIR=0x00003dd0,汇编就是LDR R0,=IODIRMOV R1,#0x00003dd0STR R1,[R0]
编译时候说是超出操作范围
A:使用 ldr,mov的操作数为 8位位图数.
第 7问:
Q:"在ARM7TDMI(-S)处理器内部有 37个用户可见的寄存器:"问题:"用户可见"应该怎样理解 这 37个寄存器是否是 37个不同的物理寄存器,例如R8与 R8_fiq 应该是两个不同的物理寄存器吧。
A:用户可见是指用户可以通过程序操作的.R8与R8_fiq是两个不同的寄存器.
第 8问:
Q:USR模式,SVC模式,IRQ模式分别有哪些限制
A:对于外设操作限制与芯片设计有关.USR 模式不能设置CPSR 寄存器.
用户模式下无SPSR 寄存器,代码可以为 ARM,Thumb.
第 9问:
Q:请问"在初始化堆栈时就决定了工作模式"是什么意思 如何决定工作模式的
A:设置 CPSR 寄存器.
第 10问:
Q:请问:ARM汇编程序设计中所谓的"文字池"作何理解
A:可以理解为常量数组,文字池中保存的是常量,这些常量可以是正常的常量,也可以是地址.
第 11问:
Q:为什么在中断向量表中不直接 LDR PC,"异常地址".而是使用一个标号,然有再在后面使用DCD定义这个标号
A:因为 LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到 32MB 范围,而现在这样在 LDR PC, "xxxx"这条指令不远处用"xxxx"DCD定义一个字,而这个字里面存放最终异常服务程序的地址,这样可以实现 4GB 全范围跳转.
第 12问:
Q:ARM7TDMI-S和 ARM7TDMI有何区别
A:ARM7TDMI-S是 ARM7TDMI的可综合(synthesizable)版本(软核).
对应用工程师来说,除非芯片生产厂商对 ARM7TDMI-S进行了裁减,否则ARM7TDMI-S与 ARM7TDMI没有太大的区别,其编程模型与ARM7TDMI 一致.
第 13问:
Q:DCD 伪指令的疑惑.
"StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4"这句话是什么意思 DCD 后面的程序标号或数字表达式是何意
A:它的内容是初始化递减堆栈的最高地址,看《ARM 微控制器基础与实战》2.3.2节.
第 14问:
Q:00254: Unimplemented RDI message是什么错误提示 我的设置连接都正常,是不是芯片烧了
A:是 JTAG的问题.可以先使用ISP 操作试试就知道了,如果能ISP,说明 LPC2104没有损坏,还能正常运行程序.
第 15问:
Q:请教:我在调试程序的时候在 AXD中出现这样的提示信息:
RDI Warning 00159:could not open specified device port.
我是根据配套教程的步骤设置的.
A:请按照光盘easyarm_drivereadme.txt 安装驱动程序.
第 16问:
Q:我用实验程序运行经常出现下列信息! 程序不能下载到目标板.
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
A:1.仿真器配置一定要正确,即"EasyARM Configuration"设置窗口中的"FLASH"项中选择"Erase Flash when need";2.向量表累加和要为 0;3.可以先在RAM调试一个程序(运行),然后STOP,再使用 File->Load Image...加载要下载到 FLASH的调试文件.
第 17问:
Q:在 ADS中是否可以进行软件调试基于 UCOS-II的程序
A:ADS软件调试只能调试ARM的内核,不能调试外设.但是取消 PLL 锁定检测后,可以调试任务切换,最终到空闲任务上.开始移植时软件仿真是最好的工具.
第 18问:
Q:ARMulate软件是干什么的 2104不是用 EasyJTAG.dll来仿真吗?
A:软件仿真只能仿真 ARM 核.
第 19问:
Q:有关 LPC2106.INC的问题.我无法在 project引用 lpc2106.inc 文件,只能引用 lpc2106.h文件, 这是什么原因 且当我的主程序用汇编编写时,不能引用 lpc2106.h,用lpc2106.inc 则无法加入project,请问汇编器应如何设置
A:不用加 2106.inc只要该文件在你的工程文件夹中,就可以直接在汇编程序的开始处加6"include 2106.inc".
注意:该文件是汇编文件定义的头文件,定义内部寄存器.
第 20问:
Q:入口点是什么意思 我在使用 LPC2106上移植 UCOS-II,每次MAKE时总是提示我Image does not have an entry point,可是我是把光盘的vetctors.s 复制过来的,而且仔细看了看,已经声明了 ENTERY,这是怎么回事
A:需要在ADS 中设置入口.
第 21问:
Q:请教:如何定义不被初始化变量A:让编译器不知道有这个内存地址即可.
A:如用分散加载文件分配 RAM故意预留一部分 RAM 不分配,用它来存您不需要初始化的东西.或者不调用编译器提供的启动代码,不过这样可能编程会麻烦一些.
第 22问:
Q:我直接通过 JTAG 口下载 EasyArm板带的 Ext1_test程序到ARM中,出现中断向量的告警:
interrupt vector is not correct arm is not running freely.
果然复位后芯片不能运行.但是我用串口下载后芯片能正常工作,中断也行的.
并且我用 JTAG 仿真的话,芯片能正常工作,中断也行的,唯独 JTAG口下载不行.
不知道是什么原因?
A:仿真器配置中要设置 Erase Flash when need.也可以这样试试:
1.可以先打开一个工程在 RAM中调试运行;2.stop程序;3.使用File->Load Image…重新加载Ext1_test 生成的*.axf 文件.
第 24问:
Q:我在仿真时遇到这样的提示:
Error, Flash is protected by user configation!
怎么写到 flash 里面呢?
A:看配套《ARM微控制器基础与实战》附录一.
第 25问:
Q:我在移植实验中想到了两个问题,如下:
1. Debug和 Release 以及DebugR
el有什么不同,为什么在作 2104移植实验时,要用 Release2.在 Release 中为什么要将 RW Base设置为 0x40000040 我将其设置为 0x40003000,为什么不能工作
A:都只是一个问题,内存空间的使用,因为跑OS要比较大的内存空间,所以要腾出点地方.
第 26问:
Q:请问没有MMU的 ARM 芯片是否支持使用 malloc()函数动态分配内存
A:是否支持 malloc()函数与芯片没有多大关系,主要与编译器有关.
Q:再问:如果没有操作系统支持呢
A:也支持.
第 27问:
Q:在 I2C 实验程序中,我想查看数据缓冲区 DataBuf的值,怎么查看
A:watch 窗口或鼠标停留在要查看的变量名上.
Q:我查询的是写入 DataBuf缓冲区的值,鼠标在上面根本就不会出现他的值,即使在 watch中加入,结果也是"name not found".
A:变量被优化,调试时可以把该变量定义为全局变量查看.
第 28问:
Q:仿真软件和 2104开发板连接不上DBE Warning 00041:
!An unspecified Debug Toolbox call failed电源和开发板都连好,错误和没接开发板一样,驱动也安装了,安装时按确定键时,软件很长时间才有如上反应,请帮忙
A:1.并口是否正常2.在其它操作系统(如 98)下或其它台式 PC下试试.
第 29问:
Q:如何生成 32位 hex 文件8我在Release Setting->ARM fromELF->Output Format 中设置为Intel 32bit HEX,可是好像没有生成 hex 文件
A:试试这种方法:
Target-->Target Setting-->Post Link中选择"ARM fromELF"加上你上面设的应该不成问题.
第 30问:
Q:请问关于 settings中 r0 base rw base 的意思
A:ro:read only,rw:read and write.
第 31问:
Q:编译成功后的信息第一行,code,R0 data,RW data,ZI data,debug分别代表什么
A:R0 只读段,即程序代码空间;RW 可读/写段,即数据变量空间;ZI 清零变量段,即需要清零初始化的数据变量空间.
第 32问:
Q:如何在 ADS里面看任务执行的一些情况 比如堆栈.
A:多任务环境下的堆栈,内存等信息需要调试软件的支持才可以实现.
ucos 下有一个统计功能的模块可以间接实现部分功能.
第 33问:
Q:请问向 flash烧数据时出现:exceeds flash limitation 请予赐教!
A:要写入的 flash地址超过了范围.如果不是代码太大的问题,可以检查 scf文件是否正确.
第 34问:
Q:在 LPC2214之类的芯片中如何实现数组的绝对地址定位,比如 51的_at_的用法.
A:*((char*)0x40000300)类似访问Q:谢谢,但这样做就无须定义数组变量,访问也不便,还有高招吗A:可以使用分散加载.
第 35问:
Q:请问 ADS编译错误"L6221E:Execution region ER_RO overlays with Execution regionER_ZI" 该如何解决?
A:请用我们网站上的工程模板试一试,最大的可能是因为你的RELEASE或者 DEBUG选项里面没有正确设置,按照参考《ARM 微控制器基础与实战》上面的设置,是不会有这个问题的.
第 36问:
Q:请教一下:将程序写入flash,再用从JTAG方式调试写入之后再复位程序没什么反映.
看了很多以前的帖子,说memmap寄存器要为 1,我用的是一个很简单的控制 led 的例子,改动了参数之后写入 flash的.在这个程序的 vectors 中找不到关于 memmap寄存器操作 的部分啊,这是怎么回事,该怎么办呢?
A:《ARM 微控制器基础与实战》上附录有"常见问题",列举了几点程序写到FLASH不能运行的原因. memmap操作可以在 target.c 中的TargetResetInit()函数内添加.
第 37问:
Q:HEX文件.EASY2100配套《ARM微控制器基础与实战》上讲:把项目编译成HEX文件,我不会呀,咋办
A:Target-〉target settings设置Post-linker 并且设置 Linker-〉fromELF.
Q:再问:我用的是光盘里的例子,打开工程项目里是DebugInARM.DebugInFlash.
RelInFlash.不是《ARM微控制器基础与实战》上的DebugRel呀,我都照《ARM 微控制器基础与实战》上设置的,可用ISP 下载,提示无法找到HEX 文件.
A:光盘上的例子是用专用工程模板建立,已经设置好参数,与默认模板不同.
第 38问:
Q:EasyARM2100开发板如何通过 JTAG 接口下载到 Flash我在用 EasyARM2100开发板时 JTAG 接口不能进行 Flash 中的调试(DebugInFlash),但是可以在RAM中调试(DebugInRAM),且通过ISP 编程可以写入 Flash.
通过 JTAG 接口进行 DebugInFlash 调试时,总是出现如下提示:
Flash Sector 0 write failed!
Warnning interrupt vectors data is not correct!
Program you downloaded can not run freely!
请问是什么原因 我该如何办?
A:仿真器设置选项有一个允许擦除 FLASH 的选项,选择它.
第 39问:
Q:我发现程序在 RAM 调试时(RO=0X40000000) OK,但是 JTAG下载到 FLASH(RO=0X00000000),显示如下:
The session file 'c:Documents and Settingsjandefault-1-2-0-0.ses'
could not be loaded.
A:这是 ADS自身的问题,请不要通过IDE运行AXD,而是通过开始菜单运行,然后 Load调试文件调试.
第 40问:
Q:我有几个问题想问问大家.
调试主机负责对 ARM 源程序进行编译链接,最好用什么样的高级语言对 ARM源程序进行编译链接 使用调试程序(如 AXD)进行 JTAG调试,AXD是什么调试程序,是否是类似什么软件之类的 到哪能下载 AXD的调试程序呢 怎么样进行 AXD 程序进行 JTAG 调试 如何通过 JTAG 仿真器发送到目标机上呢对于单片机的调试,都用到了什么软件都个有什么作用呢?
A:可以使用 ADS1.2,Keil C也支持.AXD是 ADS 的一个组件.
您可以在本公司网站下载 EasyARM2100开发套件快速入门看一看.
第 41问:
Q:EasyARM2100AXD调试时出错,故障现象:
按照光盘上的方法设置好 ADS1.2后打开光盘上的 expamplesgpiocLedDisp的工程文件(从光盘上拷贝到硬盘,已去处只读属性).
编译通过后,按Debug 按键运行调试,进入AXD.按 Go按键,EasyARM没有反应.再按Stop按键.
AXD弹出两个确认框窗口:
"No disassembly could be read at the requested address".
如果进入AXD 直接按Step 按键,也是会弹出同样的两个确认框.
软件是光盘上的,没有经过任何改动.光盘上的程序试过 4,5个都是这种情况.
AXD的设置是按照光盘上的说明设置的.
EasyARM上的 JP8 是断开的.ADS在出现这种问题后重新安装过,故障依旧.
出现这个问题前,可以调试.只是单步的时候感觉比较慢.差不多 1-2秒钟才能单步一次.
A:原因找到了,是芯片被加密了,无法写入新的程序,用 FLASH ISP清除后解决.
加密后 JTAG完全不能控制芯片,否则可能被解密.
第 44问:
Q:请问,我的 2104板子,通过 EasyJTAG 仿真时,在AXD上没有文件,而且出现这样"Error, Flash is protected by user configation!"的提示,这是怎么回事啊 在 AXD 应该打开什么类型的文件啊 谢谢啦!!!!
A:在仿真器的配置窗口设置仿真器允许擦除 FALSH.
AXD->Options->configure target->configure->erase……
第 45问:
Q:关于 arm 汇编语言跳转指令的特殊用法.有如下两条跳转指令:
beq lablefbeq lableb其中 lable 为某段程序的标号,beq lablef 表示向前跳转到与当前指令最接近的标号lable 处执行,而 beq lableb表示向后跳转到与当前指令最接近的标号 lable 处执行.
在 arm汇编中有定义这样的用法吗?
A:没有.
第 46问:
Q:我想详细的了解一下 ADS开发工具中的 stack.s ,heap.s和 startup.s中代码的含义,各位高手推荐本书或给解释一下
A:开发套件用户指南的第 3.1.3节有说明.
stack.s 定义了系统模式堆栈的起始地址.
heap.s 为初始化库函数的堆,是按 ADS 的编译器要求编写的.
startup.s 向量表及初始化代码,是根据 CPU来编写的.
第 47问:
Q:我不知道所选择的C 文件到底是用 ARM 还是THUMB 编译的,请大侠指点!
A:看配套《ARM微控制器基础与实战》7.1,7.2,7.3节.
第 48问:
Q:我重新建立了一个工程,没有用模板,TEST.C 程序在编译的时候提示OS_EVENT 没有申明,但是我看了代码,TEST.C 中包含了CONFIG_EX.H,而 congif_ex.h中又包含了include_ex.h, include_ex.h,这两个头文件又包 含了 ucos_ii.h,而OS_EVENT 是在ucos_ii.h 中申明的,不知道为什么会出现这种错误,能不能给我一个比较合理的目录结构
A:请参考我们光盘的目录结构.最好使用我们的工程模板.
第 49问:
Q:请问,我现在做 2114的产品开发.出现以下问题,特向您请教! 问题:
我们开发的产品要采样,采用周期固定.于是我们采用timer0进行时钟触发,利用触发中断程序 每隔 10毫秒采样一次并显示波形.这都能很好的进行.但是在中断程序里面对几个全局变量赋值, 跳出中断后却不能使用该全局变量.很是头疼!请赐教!!
14框架如下:
uint8 a; //全局变量void __irq funtimer0(){...
a=0; //在中断函数里面对全局变量赋值...
}
void fun1(){uint8 i;i=0;.......
i=a; // 出错位置,在调试过程中运行到当前位置,鼠标移动到变量a 上// 显示数值是 0,但是不能传给 i,i的值不会随该命令改变.
...... }
因此,我在中断函数中采集到的数据放到全局数组中.采集完成关中断后在用户模式下的程序中来处理该数组,但是该数组中的数据也不能使用!全局数组变量占 1000个字节,IRQ堆栈长度是 256.
A:全局变量用volatile 声明.
第 50问:
Q:在 AXD 里打开 Debuger Internals,在 Variable Name里为什么没有 PINSEL2,ADDR,ADCR等寄存器 要在哪里设置?
A:有些片内外设寄存器是不能读出,《ARM 微控制器基础与实战》上的P33页有说明及处理方法(在Memory窗口写入相应寄存器地址).
第 51问:
Q:请问不连 easyArm板可不可以直接软件调试程序我是指如果想直接调软件部分,能不能在 ads或 axd里直接调试
A:这和板子没关系啊,你直接选 ARMulate 不就行了,注意把等待 PLL配置完那条语句屏蔽就可以啦!
第 52问:
Q:AXD 里面出现 "RDI Warning 00159: Could not open specified device port"谁能告诉我这个是问题啊我一直搞不懂啊,全部是按照《ARM 微控制器基础与实战》第 4章上配的图做的啊,但是就是不能仿真啊.
A:请先按照光盘的 easyarm_drivereadme.txt 安装驱动程序.
第 53问:
Q:1.在《ARM微控制器基础与实战》的 2.6.3节有说到"浮点数寄存器(F0-F7...)",2104是否具有这些寄存器2.如果 EasyArm不支持浮点运算,而我的程序需要用到浮点运算,请问可以实现吗
A:没有.
第 54问:
Q:EASYARM2104的例子程序怎么都是调用C 写的程序,汇编那个怎么没用的啊?
A:按如下步骤进行处理:
1. 在
项目管理窗口中删除原来的所有文件;2.在项目管理窗口中增加汇编文件*.S; 3.编译链接,调试.
第 55问:
Q:请问版主:在AXD 调试软件中,我单步运行到一定时候,我想让自己编的软件从复位处重新运行, 在 AXD 软件中,EXECUTE栏目中有单步,连续,运行到光标处等功能,但无复位功能,如果要实现此功能,如何操作?
A:我也没有发现,目前只能用重新装载的操作实现.
第 56问:
Q:在 AXD 调试中,通过从jtag 接口,连接上 lpc2106,出现如下信息:
TKSimulator for ADS, V1.2, 2003/08Software Supplied by: ZLGMCUARM7TDMI-S, Little Endian在从file|load imgage...文件,出现两种情况:
1.正常,完全能调试;2.出现问题,如下:
RDI Warning 00254: Unimplemented RDI message请问,这是错在哪里 如何解决 谢谢!
A:可能是电源或其他接插件接触不良引起.
第 57问:
Q:请教几个问题:
1.移植中底层接口里的__swi关键字在 SDT 中能用吗2.为什么在勘误文档中时钟节拍服务子程序里去掉了开中断及关中断的宏3.时钟节拍中断的优先级应该设为最高吗?
A:1.不知,请自己看一看软件自带文档.
2.因为中断服务程序中肯定是关中断的.
3.不必.
第 58问:
Q:arm汇编中的中括号是什么意思 比如下面的例子中括号是什么作用呀[ PLLONSTARTldr r0,=PLLCONldr r1,=((0xe8<<12)+(0x4<<4)+0x2)str r1,[r0]
]
A:等效于: IF PLLONSTARTldr r0,=PLLCONldr r1,=((0xe8<<12)+(0x4<上电->启动AXD.现象:数码管能显示不断变化的数字 0--F,但是 AXD的连接失败,提示"DBE Warning 00041: ....".
重复试了几遍,现象相同.
请教原因以及对策.
A:刚才把我机器的Win2K系统的用户属性从"PowerUser"修改为"Administrator"就没问题了.可能是ADS/AXD安装的时候用了Administrator权限,在"PowerUser"下工作有问题吧.
如果哪位老兄有类似问题,不妨试一下这个方法.
第 59问:
Q:在Init.s 中有这样一段:
ResetBL InitStack ;初始化堆栈BL TargetResetInit ;目标板基本初始化B __main ;跳转到c 语言入口谁知道__main()函数的具体内容假如我不需要调用库函数的话,是否可以改为 B main
A:看调试是汇编代码里有__main(),组成成分与一些链接选项有关.
可以.但是全局变量初始化不了.
第 60问:
Q:我在C 中嵌入这样一条语句__asm{MRS R4,CPSR;STMFD SP!,{R4};ORR R4,R4,0x80;MSR CPSR_cxsf,R4}
会出新报错"illegal write to sp"版主和各位大侠有什么办法解决阿
A:嵌入汇编不能使用 SP.
第 61问:
Q:请问 ADS如下的编译错误是什么意思L6221E:Execution region ER_RO overlays with Execution region ER_ZIA:程序段内存分配可能有问题,RO(只读),ZI(0初始化)第 70问:
Q:在 axd 中有没有运行程序的时间计算器 keil中就有那样的东西.
A:有的,不过不是时间而是执行周期,可以换算成时间.在debugger internals 中,具体可以参考帮助文档.
第 62问:
Q:我最初的 init.s中没有加入 heap的分配和__user_initial_stackheap 函数,结果程序跳到SWI中死循环.我把他们加入后就好了.或者不加入他们,把 B __main改为B main也可以.请问何解 另外,就算目标板会陷入死循环,但是用软件仿真却可以正常运行.何解
A:堆的位置没有分配到有效的 RAM中.
第 63问:
Q:在 ARM汇编语言中,对立即数的有要求,我记得原来没有这样一说了.现在反而糊涂了,用立即数时候,很小心很忌讳,不回象51下随心所欲的使用了,有对立即数熟悉的朋友站出来给大家释疑.
A:如使用"非法数据可以使用 lrd送到寄存器"的方法.
首先在存储器中定义一个常量,再 ldr进去,编译器是这样弄的.可以看下面语句反汇编的区别;int z=0x101;int z=0Xff;18
第 65问:
Q:既然 option 页中的Image entry Point 填入的是调试入口地址,那么在实际的程序运行当中它是不会 覆盖代码中的 ENTRY入口声明的,对吗 仅仅是为了调试的方便.
A:Image entry Point 优先.其实代码中的 ENTRY是为了确保代码不被优化掉.
第 66问:
Q:我想使用标准C 语言的库函数,比如 memset 在 string.h中有定义,可是我直接包含#include , 但是编译没错误,运行确有错误,应当怎么设置
A:请使用最新的工程模板.
第 67问:
Q:软件中断是不是必须由 SWI 指令触发
A:可以直接用你定义成软中断的函数名啊.比如:
19__SWI(0x12) void myswi(void); // 声明函数__asm // 调用方式 1{swi 0x12}
myswi(); // 调用方式 2
第 68问:
Q:《ARM微控制器基础与实战》程序清单 6.9的程序是在哪里被调用的_user_initial_stackheapLDR r0,=bottom_of_heapMOV pc,lr
A:__main.千万别删哟, 否则出大事的.
第 69问:
Q:"LDR R0, =PINSEL0" 中"="是什么意思 这语句是取地址还是取地址中的内容呢
A:这是 LDR 伪指令,可用来加载 32位立即数或地址,LDR R0,=PINSEL0是将 PINSEL0的地址加载到R0中.
第 70问:
Q:我不明白"SWI 0"和"SWI 0X123456"这两条指令中的 0和 0X123456中有何用.
有没有应用 SWI 的具体例子让我看看
A:那是特定的中断入口地址,见 ADS_DeveloperGuide_D.pdf下的swi.
第 71问:
Q:SWI的功能表吗?
A:SWI的功能表由 swi异常服务程序决定.很多时候由编程者自己决定.
第 72问:
Q:请问:我在实验您的原代码进行ucos 移植时用的是例 1,但是在按照图 7.17设置处理器的仿真器模式时 enable comms channel view 和 semihostin 项为不可激活状态.为什么,能否给一点提示?
A:在一些仿真器上使能了它们会影响swi异常处理程序.
第 73问:
Q:请问"Unimplemented RDI message"这个出错提示是什么意思啊20还有,有的时候当我用 axd load一个.axf 文件时,常常 loading 的没完没了,这是怎么回事啊?
A:Unimplemented RDI message:为命令操作失败,需要重新连接.
下载不结束为出现不正常现象,请重新连接并下载.如果每次都出现该现象请联系我们的技术支持.
第 74问:
Q:各位高手好,我是 ARM初学者我在程序调试中"LDR PC,[PC,R2]"命令执行后PC 为什么=0x0000000c, 在这条命令执行前 PC+R2地址上的值是 0x0000000c 吗?
A:要使用软件仿真.0x0000000C 是预取中止了.
第 75问:
Q:软中断 SWI作底层接口的问题.以下函数为啥要通过软中断调用,可以直接调用吗OS_TASK_SW(),_OSStartHighTdy(),OS_ENTER_CRITICAL),OS_EXIT_CRITICAL(),
A:在用户模式或 Thumb 状态不能直接调用.
第 76问:
Q:ARM的一条指令是 32bit长, 但有时一个立即数也是 32bit, 这是如何解释的
A:指令中使用的立即数需要时 8位数移位获得,并非所有数都可以.
第 77问:
Q:请教:全局变量的值在复位(不断电)后会不会自动清零 (用光盘自带的启动代码)
A:在C语言中一般会会初始化0或用户指定的值,但这不是硬件自动的.
第 78问:
Q:the setting files for *.mcp is locked!是什么问题?
A:文件属性只读.
第 79问:
Q:请问,关于printf() 在 ads 中怎么用不了 谢谢!
A:请用我们我们网站上下载 2104的工程模板,它解决了这个问题.
即使这样,也不能真正使用 prinf.您还需要自己编写一些底层函数才能使用,详细参考 ads 自带的 ADS_CompilerGuide_D.pdf.
第 81问:
Q:请问在 TargetInit()中函数开始会执行 srand((INT32U)TargetInit),它是做什么用的
A:ex1用它来产生随机数种子的.
第 82问:
Q:请问:vectors.s中"DCD 0xb9205f80" 的 0xb9205f80在实际运用中需要改动吗?
A:不需要更改,除非改动了向量表中的指令代码.
第 83问:
Q:请问,为什么 queue 数据队列,《ARM微控制器基础与实战》上给画成了环形
A:因为头跟尾的指针指向一个地址,队列逻辑上是环状的.
第 84问:
Q:有没有人成功的把一个数据定义到程序空间里 各种方法我都试了,是不是有什么编译开关
A:使用 const 修饰,定义变量时带初始化值,要定义为全局的变量.
第 85问:
Q:ads 里没有 CODE关键词,怎样使定义的字符串数组不占用RAM空间22
A:const unsigned char string[]
第 86问:
Q:在例程中TIME_test 中的 TIMEOUT 当写入时提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
我不知怎样改设置,哪位提醒一下
A:中断向量表的校验和不为 0,用AXD看 0地址的数据(32位方式),自己加一下.注意把 高于 32位的部分去掉.
第 87问:
Q:请教各位:我做 TIMEOUT 实验(2104板),Make 通过,Debug时出现了如下错误提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
设置 Link:ARM Linkr0 base:0x00000000rw base:0x40003000image entry point:0x00000000 其它的没变!!
而我使用ISP完全可以下载而且可以运行!这可以说是设置问题,但是我实在找不到!
怎么办
A:请看一看配套《ARM 微控制器基础与实战》附录 1,ISP软件可能对它进行了处理,而 JTAG没有特殊处理
第 88问:
Q:*(volatile unsigned int *)是什么意思 例如*(volatile unsigned int *)addr 具体是什么意思
A:分开来看,(volatile unsigned int *)就是定义一个可变的无符号整形指针,前面的那个*就是取起内容.
第 89问:
Q:如何理解#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
A:宏定义,参考C语言的书籍.
(volatile unsigned long *) 0xFFFFF000 将 0xFFFFF000强行转换为指针,然后 *(指针) 即可对此地址进行访问.
第 90问:
Q:在异常处理向量表的设置中,为什么不直接将异常向量的入口地址写入 PC 中呢,为什么非要用什么 DCD 这些伪指令,到底有什么用啊
A:为了保证任何时候其累加和为零,不然改一次程序就要计算一次。
第 92问:
Q:请教:如何修改 ADS 的启动代码,从__main到 main,按道理应该有一个文件,修改这个小文件, 就可以修改 启动代码.
A:__main是ADS 运行库,最好不要修改,要是不使用库就不要用 main()函数,起个别的名字.直接跳转过去就行了.
详见:《ARM体系结构与编程》P328.
第 93问:
Q:我在 JTAG仿真时出现的对话框,提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
A:参见《ARM 微控制器基础与实战》附录一第一个问题的第二部分,选择源代码的启动代码文件夹下的vectors.s,并参照《ARM微控制器基础与实战》图 7.11设置.
第 94问:
Q:初始化代码中分配堆栈的问题MSR CPSR_c, #0xd3 ;进入特定的处理器模式LDR SP, StackSvc ;给当前处理器模式的堆栈指针赋值,这只是一个值而已,;他在接下去的DCD语句赋值SvcStackSpace SPACE SVC_STACK_LEGTH * 4这个语句开辟一个SVC_STACK_LEGTH * 4大小的内存,SvcStackSpace是这块内存的标号,我想应该就是内存的首地址,这样应该好理解了.
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4这个语句就是把这个首地址加上堆栈大小值.
A:计算出堆栈指针来,我想这个堆栈是向下生长的,所以 SP赋值的是堆栈地址最高的那个.
第 95问:
Q:请问启动代码中这句是什么意思24__user_initial_stackheapLDR r0,=bottom_of_heapMOV pc,lr;/* 分配堆空间 */AREA Myheap, DATA, NOINIT, ALIGN=2 bottom_of_heap SPACE 256 ;库函数的堆空间我的问题是:
1. 这
个函数在哪里被调用2.赋值给 r0以后就完事了 r0起什么作用
A:堆和栈的分配函数,由ADS提供的初始化代码调用,具体参考配套《ARM微控制器基础与实战》的相关部分.
第 96问:
Q:2104的启动代码是否适用 2124呢网站上下载的那个 easyarm2104工程模版里面写着 arm executable imag for lpc21**,是否说也适用 2124呢 如果不行,哪些地方需要修改 希望能够指点一下!
A:您可以下载 2100的工程模板.
第 97问:
Q:我在用 ARM的IAP功能,要把已经烧到 flash 中的数据写到RAM中,我是这么写的:
uint32 *q,data;q = 0x00006000;data = *q;这是要读的 flash的起始地址,但是第二句编译出错,我想应该是C 编译器不许给指针直接赋值, 我用汇编解决了这个简单的问题,但是怎么用C来解决呢
A:q = (uint32 *)0x00006000;
第 98问:
Q:问一个有关汇编的基础问题.
例程: ANDS R1,R1,#0x0400BEQ WAITOK请问 ANDS 是如何影响标志位的,而BEQ 判断的是那两个操作数相等时执行
A:R1&0x0400 => R1,若结果为 0(即R1为 0),则标志位 Z=1.
当 Z=1时,BEQ WAITOK有效执行.
第 99问:
Q:请教:在ADS中怎么给某个变量确定固定物理地址就是类似KEIL中的 XDATA xxx _AT_ 0x4456 的功能.
A:使用分散加载机制,mem_c.scf等就是例子.
第 100问:
Q:哪里有介绍 ARM的C语言编程的
A:其实大多数嵌入式系统的C语言都差不多,可找一本写嵌入式C 语言的书即可.
第 101问:
Q:请问在系统复位后首先执行的是否为 Boot Block的中断向量然后由 boot block里面的程序决定是执行用户程序还是ISP程序.
那么这时启动的 boot block里的中断向量表和用户程序里的中断向量表是如何在 flash里安排的在《ARM 微控制器基础与实战》上看到的是复位后boot扇区的最低 64字节出现在0x00000000区域,那用户的中断向量表应该在哪个区域产品中一般为 0x00000000,在开发板中重启后实际为 boot block的中断向量地址,对吗
A:看一看 3.3.6节.产品中一般为物理0地址处.
第 102问:
Q:《ARM微控制器基础与实战》上有一段程序:
uint32 i;i = VICIRQStatus;i = IOSET;请问:为何先要读取VICIRQStatus 的值,才能读IOSET 的值
A:读出 VICIRQStatus只是为了方便观察当前VICIRQStatus的值,没其它用途.
第 103问:
Q:请问处理器在什么情况下处于用户模式 多谢!
A:需要你去设置 CPSR 寄存器.
用户程序前台程序一般在用户模式/系统模式下运行.
第 104问:
Q:在 EINT1_LED.S中的倒数第二行有一个单独的B 指令,它是什么含义 多谢!
A:是"B .",跳转到当前地址,即死循环,与以下代码等效:
HALT B HALT
第 105问:
Q:模板里到底有些什么
A:起动代码,相关编译链接设置.
起动代码是用来初始化系统的程序,如 Startup.s,target.c,stack.s等等.
第 106问:
Q:今天试用了工程模板.使用了ARM Executable Image for lpc21xx建了个项目,看了下启动文件与原来的不同了,用了个《ARM微控制器基础与实战》上的例程来作试验,用的是 time0定时中断来亮灯的程序,用的例程的TargetInit()和 int main(void);修改了用户堆栈和bottom_of_heap的长度,程序能运行,但不能产生中断,time0和VIC初始化的是正确的,是什么原因用工程模板建立的项目文件夹的 src中多了几个文件,其中的mem_a.scf,mem_b.scf,mem_c.scf,怎样才能导入到项目中来 谢谢!
转载:https://blog.csdn.net/mainmaster/article/details/117221997