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 之外.
文章评论(0条评论)
登录后参与讨论