原创 (转)ARM经典300问--3

2008-11-23 22:49 2808 5 4 分类: MCU/ 嵌入式
 第 81 问:  

Q:SWI 的功能表吗


A:SWI 的功能表由 swi 异常服务程序决定.很多时候由编程者自己决定.    


第 82 问:  


Q:请问:我在实验您的原代码进行 ucos 移植时用的是例 1,但是在按照图 7.17 设置处理器的仿真器模式时 enable comms channel view  和 semihostin 项为不可激活状态.为什么,能否给一点提示


A:在一些仿真器上使能了它们会影响 swi 异常处理程序.  


  


第 83 问:  


Q:请问"Unimplemented RDI message"这个出错提示是什么意思啊


还有,有的时候当我用 axd load 一个.axf 文件时,常常 loading 的没完没了,这是怎么回事啊


A:Unimplemented RDI message:为命令操作失败,需要重新连接.  


下载不结束为出现不正常现象,请重新连接并下载.如果每次都出现该现象请联系我们的技术支持.  


 第 84 问:  


Q:各位高手好,我是 ARM 初学者我在程序调试中"LDR PC,[PC,R2]"命令执行后 PC 为什么=0x0000000c,  在这条命令执行前 PC+R2 地址上的值是 0x0000000c 吗


A:要使用软件仿真.0x0000000C 是预取中止了.    


Q:请问:ARM7 在初始化 CPU 堆栈时,寄存器 CPSR 和 CPSR_c 有什么关系  CPSR_c 是在那里定义的


A:这是 MSR 指令的语法,"_"后部分指定 CPSR 的域,请参考《ARM 微控制器基础与实战》上关于这条指令的说明.  


 第 85 问:  


Q:软中断 SWI 作底层接口的问题.以下函数为啥要通过软中断调用,可以直接调用吗


OS_TASK_SW(),  


_OSStartHighTdy(),  


OS_ENTER_CRITICAL),  


OS_EXIT_CRITICAL(),  


A:在用户模式或 Thumb 状态不能直接调用.  


 第 86 问:  


Q:ARM 的一条指令是 32bit 长,  但有时一个立即数也是 32bit,  这是如何解释的


A:指令中使用的立即数需要时 8 位数移位获得,并非所有数都可以.  


 第 87 问:  


Q:请教:全局变量的值在复位(不断电)后会不会自动清零  (用光盘自带的启动代码)  


A:在 C 语言中一般会会初始化 0 或用户指定的值,但这不是硬件自动的.  


 第 88 问:  


Q:the setting files for *.mcp is locked!是什么问题


A:文件属性只读.  


 第 89 问:  


Q:请问,关于 printf()  在 ads 中怎么用不了  谢谢!  


A:请用我们我们网站上下载 2104 的工程模板,它解决了这个问题.  


即使这样,也不能真正使用 prinf.您还需要自己编写一些底层函数才能使用,详细参考 ads 自带的 ADS_CompilerGuide_D.pdf.  


 第 90 问:  


Q:swi 的功能号是如何来的  它和 LR 寄存器的值是何关系


如《ARM 微控制器基础与实战》程序清单 6.13  


LDREQ R0,[LR,#-4] ;BICEQ R0,R0,0xff000000  


A:LDREQ R0,[LR,#-4] ;用来读 SWI 的代码


BICEQ R0,R0,0xff000000 ;是 ARM  方式进入,取低 24bit  


 第 91 问:  


Q:请问在 TargetInit()中函数开始会执行 srand((INT32U)TargetInit),它是做什么用的


A:ex1 用它来产生随机数种子的.  


 Q:请问:我建立的工程中,所有源文件与 2104 附带的光盘例子源文件相同,编译链接也一切正常,  可就是不能到板子上跑!  


提示错误是:向量中断有错误,无法自由运行!!  


这是怎么回事相同的源文件,加在你的工程里,正常;加到我的工程中就出错!   我创建的是 ARM 可执行映象.  


A:vector.s 你自己的吗如果是要计算向量去的累加和了.  


 第 92 问:  


Q:请问:vectors.s 中"DCD 0xb9205f80"  的 0xb9205f80 在实际运用中需要改动吗


A:不需要更改,除非改动了向量表中的指令代码.  


 第 93 问:  


Q:请问,为什么 queue 数据队列,《ARM 微控制器基础与实战》上给画成了环形


A:因为头跟尾的指针指向一个地址,队列逻辑上是环状的.  


  


第 94 问:  


Q:有没有人成功的把一个数据定义到程序空间里各种方法我都试了,是不是有什么编译开关


A:使用 const 修饰,定义变量时带初始化值,要定义为全局的变量.  


 


第 95 问:  


Q:ads 里没有 CODE 关键词,怎样使定义的字符串数组不占用 RAM 空间


A:const unsigned char string[]  


 第 96 问:  


Q:在例程中 TIME_test 中的 TIMEOUT 当写入时提示:  


Warnning! interrupt vectors data is not correct!  


Program you downloaded can not run freely!  


我不知怎样改设置,哪位提醒一下


A:中断向量表的校验和不为 0,用 AXD 看 0 地址的数据(32 位方式),自己加一下.注意把高于 32 位的部分去掉.  


第 97 问:  


Q:请教各位:我做 TIMEOUT 实验(2104 板),Make 通过,Debug 时出现了如下错误提示:  


Warnning! interrupt vectors data is not correct!  


Program you downloaded can not run freely!  


设置 Link:ARM Link  


r0 base:0x00000000  


rw base:0x40003000  


image entry point:0x00000000  其它的没变!!  


而我使用 ISP 完全可以下载而且可以运行!这可以说是设置问题,但是我实在找不到! 怎么办


A:请看一看配套《ARM 微控制器基础与实战》附录 1,ISP 软件可能对它进行了处理,而 JTAG 没有特殊处理


 第 98 问:  


Q:*(volatile unsigned int *)是什么意思  例如*(volatile unsigned int *)addr 具体是什么意思


A:分开来看,(volatile unsigned int *)就是定义一个可变的无符号整形指针,前面的那个*就是取起内容.  


 第 99 问:  


Q:如何理解#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))  


A:宏定义,参考 C 语言的书籍.  


(volatile unsigned long *) 0xFFFFF000  将 0xFFFFF000 强行转换为指针,然后  *(指针)  即可对此地址进行访问.  


 第 100 问:  


Q:在异常处理向量表的设置中,为什么不直接将异常向量的入口地址写入 PC 中呢,为什么


非要用什么 DCD 这些伪指令,到底有什么用啊


A:为了保证任何时候其累加和为零,不然改一次程序就要计算一次.  


第 101 问:  


Q:单步调试 i2cINT.C 在 ISendStr 中启动总线后,程序怎么又跑到 vectors.o 中,进行初始化了呢


A:由于 VIC 的限制,程序不能在 0x18 停下来,否则执行非向量中断.如果没有设置,则非向量中断为 0,将从 0 地址执行.  


建议:有中断时不要单步执行程序,可以手动暂时关中断或设置断点代替单步.   (编者注:下载最新的驱动可以解决这个问题)  


 


第 102 问:  


Q:请教:如何修改  ADS 的启动代码,从__main 到 main,按道理应该有一个文件,修改这个小文件,  就可以修改 启动代码.  


A:__main 是 ADS 运行库,最好不要修改,要是不使用库就不要用 main()函数,起个别的名字.直接跳转过去就行了.  详见:《ARM 体系结构与编程》P328.  


 第 103 问:  


Q:我在 JTAG 仿真时出现的对话框,提示:  


Warnning! interrupt vectors data is not correct!  


Program you downloaded can not run freely!  


A:参见《ARM 微控制器基础与实战》附录一第一个问题的第二部分,选择源代码的启动代码文件夹下的 vectors.s,并参照《ARM 微控制器基础与实战》图 7.11 设置.    


第 104 问:  


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 赋值的是堆栈地址最高的那个.  


第 105 问:  


Q:请问启动代码中这句是什么意思


__user_initial_stackheap  


LDR r0,=bottom_of_heap  


MOV pc,lr  


;  


AREA Myheap, DATA, NOINIT, ALIGN="2"    


bottom_of_heap SPACE 256 ;库函数的堆空间


我的问题是:  


1.这个函数在哪里被调用


2.赋值给 r0 以后就完事了  r0 起什么作用


A:堆和栈的分配函数,由 ADS 提供的初始化代码调用,具体参考配套《ARM 微控制器基础与实战》的相关部分.  


 第 106 问:  


Q:2104 的启动代码是否适用 2124 呢


网站上下载的那个 easyarm2104 工程模版里面写着 arm executable imag for lpc21**, 是否说也适用 2124 呢         如果不行,哪些地方需要修改   希望能够指点一下! 


A:您可以下载 2100 的工程模板.  


 第 107 问:  


Q:我在用 ARM 的 IAP 功能,要把已经烧到 flash 中的数据写到 RAM 中,我是这么写的:  


uint32 *q,data;  


q = 0x00006000;  


data = *q;  


这是要读的 flash 的起始地址,但是第二句编译出错,我想应该是 C 编译器不许给指针直接赋值,  我用汇编解决了这个简单的问题,但是怎么用 C 来解决呢


A:q = (uint32 *)0x00006000;  


  


第 108 问:  


Q:问一个有关汇编的基础问题.  


例程: ANDS R1,R1,#0x0400  


BEQ WAITOK  


请问  ANDS  是如何影响标志位的,而 BEQ  判断的是那两个操作数相等时执行


A:R1&0x0400 => R1,若结果为 0(即 R1 为 0),则标志位 Z="1".  


当 Z="1" 时,BEQ WAITOK 有效执行.  


 第 109 问:  


Q:请教:在 ADS 中怎么给某个变量确定固定物理地址


就是类似 KEIL 中的  XDATA xxx _AT_ 0x4456  的功能.  


A:使用分散加载机制,mem_c.scf 等就是例子.  


 第 110 问:  


Q:哪里有介绍 ARM 的 C 语言编程的


A:其实大多数嵌入式系统的 C 语言都差不多,可找一本写嵌入式 C 语言的书即可.  


第 111 问:  


Q:请问在系统复位后首先执行的是否为 Boot Block 的中断向量


然后由 boot block 里面的程序决定是执行用户程序还是 ISP 程序.  


那么这时启动的 boot block 里的中断向量表和用户程序里的中断向量表是如何在 flash 里安排的在《ARM 微控制器基础与实战》上看到的是复位后 boot 扇区的最低 64 字节出现在0x00000000 区域,那用户的中断向量表应该在哪个区域


产品中一般为 0x00000000,在开发板中重启后实际为 boot block 的中断向量地址,对吗


A:看一看 3.3.6 节.产品中一般为物理 0 地址处.  


  


第 112 问:  


Q:《ARM 微控制器基础与实战》上有一段程序:  


uint32 i;  


i = VICIRQStatus;  


i = IOSET;  


请问:为何先要读取 VICIRQStatus 的值,才能读 IOSET 的值


A:读出 VICIRQStatus 只是为了方便观察当前 VICIRQStatus 的值,没其它用途.  


  


第 113 问:  


Q:请问处理器在什么情况下处于用户模式    多谢!  


A:需要你去设置 CPSR 寄存器.  


用户程序前台程序一般在用户模式/系统模式下运行.  


 第 114 问:  


Q:在 EINT1_LED.S 中的倒数第二行有一个单独的 B 指令,它是什么含义多谢!  


A:是"B .",跳转到当前地址,即死循环,与以下代码等效:  


HALT B HALT  


第 115 问:  


Q:模板里到底有些什么


A:起动代码,相关编译链接设置.  


起动代码是用来初始化系统的程序,如 Startup.s,target.c,stack.s 等等.   


 第 116 问:  


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,怎样才能导入到项目中来谢谢!  


A:原来 startup.s 默认是关了中断的!  


  


第 117 问:  


Q:在 easyarm 2104 的配套光盘中的 IAP 例子中,定义了一个函数指针


void (*IAP_Entry)(uint32 param_tab[], uint32 result_tab[]);  


我看不懂,这个函数和普通的函数定义方法不一样,尤其是(*IAP_Entry),大家教教我.  


A:这是一个指向函数的指针!!  


  


第 118 问:  


Q:变量定义中 volatile 是什么意思请大侠告诉我一下《ARM 微控制器基础与实战》上 c 语言定义变量时出现了 volatile,不知道是做什么用的.C 语言里好像没有这个语法阿!  


A:告诉编译器不要优化掉,volatile  是易变的意思.  


  


第 119 问:  


Q:请问 ARM 中的一个编译方面碰到的问题.  


在 ARM 地汇编语言中,有条件编译伪指令 IF..ELSE...ENDIF;  


而在 C 语言中,有相应的条件编译伪指令#IF...#ELSE...#ENDIF,在较大的程序设计中, 往往需要对整个程序进行条件编译.  


我要问的问题是:我在 CONFIG.H 中设置一个编译开关,对所有的 C 文件进行条件编译是有效的,  因为每个 C 文件中都有一个语句:#include "config.h",我如何将该编译开关的信息传递给汇编语言文件,如 VECYORS.S  


A:好像没有直接的方法,可以编写一个 CONFIG.INC 来管理汇编程序的配置.  


  


第 3 章 操作系统


第 120 问:  


Q:在 SWI_Exception 的 0x40 中的_OSFunctionAddr[regs[0]]中的 Regs[0]指的是堆栈中的


R0 还是其它


A:是堆栈中的 R0.  


第 121 问:  


Q:《ARM 微控制器基础与实战》中在 ucos 移植中说 C 语言无法保证堆栈的结构,请问这是什么含义


A:就是不能保证有哪些寄存器入栈及寄存器入栈的顺序.  


第 122 问:  


Q:请问斑竹 OSNeedToSwapContext 在哪个文件里声明的,我找不到


A:这是要删除的,我的 OS_CPU_C.C 中函数 OSIntCtxSw:  


  


void OSIntCtxSw (void)  


{  


  


}  


 第 123 问:  


Q:我的情况如下:我自己制作了一个硬件模块,用的是 lpc2214,现在需要将 ucos-ii 移植到上面去.我用板子做 ZLG 公司提供的实验,是可以做的,如 led 灯等,按道理说串口等硬件应该没有问题,然后我就做公司提供的那三个移植实例:ex2_arm.编译等是通过的,生成了 hex 文件,下载到 flash 中,运行 easyarm,但是没有任何显示,不知道是什么问题,应该是硬件上呢,还是其他的


A:这主要是 RAM 的问题,请用我们的工程模板,并选择在 FALSH 中调试,如果编译通过, 则一般行,  否则请减少任务堆栈的大小.  


第 124 问:  


Q:下载了工程模板以后,将工程模板目录下的文件都拷贝到了 stationary 目录下,然后建立了一个  ARM Executable Image for UCOSII(for lpc21xx)的工程,在 PROJECT 目录下的文件结构如下:  


test.c  


inlcudes.h  


 src->config.h,heap.s,includes.h,irq.s,lpc2294.h,  


lpc2106.h,mem_a.scf,os_cfg.s,stack.s,startup.s  


target.c,target.h,ucos_ii.c,ucos_ii.h,  


arm->os_cpu.h,os_cup_a.s,os_cup_c.c  


uCOS->ucos 源文件


arm_pc->pc.h,pc.c  


 编译可以通过,但是 MAKE 时提示:  


ERROR:Execution region IRAM overlaps with Execution region STACKS.  


如果我表述得不是很清楚的话,那么可否告诉我工程模板到底怎么操作,怎样才能把例子在  ARM2104 上跑起来.  


A:RAM 占用太大,请在 flash 中调试,并减少任务堆栈的大小.  


第 125 问:  


Q:我改了以下 SCF 文件,把堆栈的值设置大了一些,但是还是出现以前的老问题,那就是程序跑到TargetResetInit()函数处后就跳到取数据终止的异常中断去了.  

A:不能把堆栈设置到内部 RAM 之外.
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条