-
第
101
问
:
Q:
单步调试
i2cINT.C
在
ISendStr
中启动总线后<
/p>
,
程序怎么又跑到
vectors.o
中
,
进行初
始化了呢
A:
由于
VIC
的限制
,
程序不能在
0x18 <
/p>
停下来
,
否则执行非向量中断
.
如果没有设置
,
则非<
/p>
向量中断为
0,
将从
0
地址执行
.
建议
:
有中断时不要单步执行程序
< br>,
可以手动暂时关中断或设置断点代替单步
.
(
编者注
:
下载最新的
驱动可以解决这个问题
)
第
102
问
:
Q:
请
教
:
如何修改
ADS
的启动代码
,
从
__main
到
main
,
按道理应该有一个文件
,
修改这
p>
个小文件
,
就可以修改
启动代码
.
A:__main
是
ADS
运行库
,
最好不要修改
,
要是不使用库就
不要用
main()
函数
,
起个别的名
字
.
直接跳转过去就行了
.
详见
:
《
ARM
体系结构与编程》
P328.
第
103
问
:
Q:
我在
JTAG
< br>仿真时出现的对话框
,
提示
:
Warnning! interrupt vectors data is not
correct!
Program you downloaded can not
run freely!
A:
参见《
ARM
< br>微控制器基础与实战》附录一第一个问题的第二部分
,
选
择源代码的启动代
码文件夹下的
ve
ctors.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
是这块内存的标
号
< br>,
我想应该就是内存的首地址
,
这样应该好理解了
.
StackSvc DCD
SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
这个语句就是把这个首地址加上堆栈大小值
.
A:
计算出堆栈指针来
,
我想
这个堆栈是向下生长的
,
所以
SP
赋值的是堆栈地址最高的那个
.
第
105
问
:
Q:
请问启动代码中这句是什么意思
24
__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 <
/p>
提供的初始化代码调用
,
具体参考配套《
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
的起始地址<
/p>
,
但是第二句编译出错
,
我想应该是
C
编译器不许给指针
直接赋值
,
我用汇编解决了这个简单
的问题
,
但是怎么用
C
来解决呢
A:q =
(uint32 *)0x00006000;
第
108
问
:
Q:
问一个有关汇编的基础问题
.
例程
: ANDS R1,R1,#0x0400
BEQ W
AITOK
请问
ANDS
是如何影响标志位的
,
而
BEQ
判断的是那两个操作数相等时执行
A:R1&0x0400 => R1,
若结果为
0(
即
R1
为
0),
则标志位
Z=1.
当
Z=1
时
,BEQ W
AITOK
有效执行
.
第
109
问
:
Q:
请
教
:
在
ADS
中怎么给某个变量确定固定物理地址
就是类似
KEIL
中的
XDA
TA xxx _AT_ 0x4456
的功能
.
A:
使用分散加载机制
,mem_
等就是例子
.
25
第
110
问
:
Q:
哪里有介绍
ARM
的
C
语言编程的
A:
其实大多数嵌入式系统的
C
p>
语言都差不多
,
可找一本写嵌入式
C
语言的书即可
.
第
111
问
:
Q:
请
问在系统复位后首先执行的是否为
Boot Block
的中断向量
然后由
boot block
里面的程序决定是执行用户程序还是
ISP
程序
.
那么这时启动的
boot block
里的中断向量表和用户程序里的中断向量表是如何在
flash
里安排的
在《
ARM
微控制器基础与实战》上看到的是复位后
boot
扇区的最低
64
字节出现在
0x00000000
区域
,
那用户的中断向量表应该在哪个
区域
产品中一般为
0x000000
00,
在开发板中重启后实际为
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:
是
跳转到当前地址
,
< br>即死循环
,
与以下代码等效
:
HALT B HALT
第
115
问
:
Q:
模板里到底有些什么
A:
起动代码
,
相关编译
链接设置
.
起动代码是用来初始化系统的程序
,
如
Startup.s,target.c,sta
ck.s
等等
.
26
第
116
问
:
Q:
今
天试用了工程模板
.
使用了
ARM
Executable Image for lpc21xx
建了个项目
,
看了下
启动文件与原
来的不同了
,
用了个《
ARM
微控制器基础与实战》上的例程来作试验
,
用
的是
time0
< br>定时中断来亮灯的程序
,
用的例程的
TargetInit()
和
int
main(void);
修改了用户堆栈和
bottom_of_heap
的长度
,
程序能运行
,<
/p>
但不能产生中断
,time0
和
VIC
初始化的是正确的
,
是什么原因
用工程模板建立的项目文件夹的
src
中多了几个文件
,
其中的
mem_,mem_,mem_,
怎样才能导入到项目中来
谢谢
!
A:
原来
startup.s
默认是关了中断的
!
第
117
问
:
Q:
在
easyarm 2104
的配套光盘中的
IAP
例子中
,
定义了一个函数指针
void (*IAP_Entry)(uint32 param_tab[],
uint32 result_tab[]);
我看不懂
,<
/p>
这个函数和普通的函数定义方法不一样
,
尤其是
(*IAP_Entry),
大家教教我
.
A:
这是一个指向函数的指针
!!
第
118
问
:
Q:
变量定义中
volatile
是什么意思
请大侠告诉我一下《
ARM
微控制器基础与实战》上
c
语言定义
变量时出现了
volatile,
不知道是做什么用的
.C
语言里好像没有这个语法阿
!
A:
告诉编译器不要优化掉
,volatile
是易变的意思
.
第
119
问
:
Q:
请问
ARM
中的一个编译方面碰到的问题
.
在
ARM
地汇编语言中
,
有条件编译伪指令
IF..ELSE...END
IF;
而在
C
语言中
,
有相应的条件编译伪指令
#IF...#ELSE
...#ENDIF,
在较大的程序设计中
,
往往需要对整个程序进行条件编译
.
我要问的问题是
:
我在
CONFIG<
/p>
.H
中设置一个编译开关
,
对所有的
C
文件进行条件编译是
有效的
,
因为每个
C
文件中都有一个语句
:#include
我如何将该编译
开关的信息传递给汇
编语言文件
,
如
VECYORS.S
A:
好像没有直接的方法
,
可以编写一个
CONFIG
.INC
来管理汇编程序的配置
.
27
第
3
章
操作系统
第
120
问
: