北国孤月 发表于 2010-12-29 10:31:32

The location of stacks的问题?

;The location of stacks各个模式下,堆栈的起始地址
UserStack        EQU        (_STACK_BASEADDRESS-0x3800)        ;0x33ff4800 ~_STACK_BASEADDRESS        EQU 0x33ff8000
SVCStack        EQU        (_STACK_BASEADDRESS-0x2800)        ;0x33ff5800 ~
UndefStack        EQU        (_STACK_BASEADDRESS-0x2400)        ;0x33ff5c00 ~
AbortStack        EQU        (_STACK_BASEADDRESS-0x2000)        ;0x33ff6000 ~
IRQStack        EQU        (_STACK_BASEADDRESS-0x1000)        ;0x33ff7000 ~
FIQStack        EQU        (_STACK_BASEADDRESS-0x0)        ;0x33ff8000 ~



为什么定成这样的?????求解答

天嵌_support1 发表于 2010-12-29 17:41:06

1# 北国孤月


我不知道,网友。

北国孤月 发表于 2010-12-29 20:06:17

2# embedsky_lxt


呵呵呵,我还是没有搞清楚,不过回答了,就谢谢你啦啦啦啦啦!!

吕氏春秋8266 发表于 2010-12-29 20:53:39

当要修改各模式下堆栈指针时,只需重新定义_STACK_BASEADDRESS的值就可以了,不用一个个修改!

北国孤月 发表于 2010-12-30 16:02:12

4# 吕氏春秋8266


#difine pISR_EINT0(*(unsigned*)(_ISR_STARTADDREs+0x84))

这句话是什么意思?貌似就是一个地址呀,为什么不直接定义一下不就得了,为什么搞的这么复杂?

天嵌_support1 发表于 2010-12-30 17:21:13

5# 北国孤月


中断处理函数入口地址

吕氏春秋8266 发表于 2010-12-30 17:28:23

本帖最后由 吕氏春秋8266 于 2010-12-30 17:30 编辑

:)同上,方便修改~

北国孤月 发表于 2010-12-30 20:28:52

7# 吕氏春秋8266


首先,我代表裸奔一族感谢您的回答,可能是老弟表达不清,你们都没有看懂我的意思,我费了一天的时间才搞懂了这是什么意思,如下:

ARM C嵌入式编程中的几个关键字
1、访问绝对地址的内存位置:
   #define pISR_EINT0 (*(unsigned *) (_ISR_STRATADDRESS+0x74))
   上述语句把无符号整数_ISR_STRATADDRESS+0x74强制转换为指针,指向RAM,用下面的语句可以访问它:
pISR_EINT0 = (int)Eint0_ISR
   为了访问一个绝对地址,把一个整形数强制转换(typecast)为一指针。
   注:第一个*表间址、第二个*表强制转换(看的不是太明白)
2、__irq:
   为了方便使用高级语言编写异常处理函数,ARM编译器对异常处理函数做了特定扩展,只要使用关键字_irq,这样编译出来的函数就满足异常响应对现场保护和恢复的需要;
3、编写中断服务程序的一些基本原则:
   √避免在中断服务程序中做浮点运算:好的中断服务程序应该遵循短小有效这一原则,在中断服务程序中做浮点运算大大违背这一原则,同时有些处理器/编译器就是不允许在中断服务程序中做浮点运算;
   √中断服务程序不能有返回值:所以中断服务程序都定义为返回类型为void,即:void _irq Eint0_ISR(void);
   √中断服务函数不能传递参数:故参数列表为void,即:void _irq Eint0_ISR(void);
4、Static:
   一个static变量,其实就是全局变量,只不过它有作用域,它可用于保存变量所在函数被类调用期间的中间状态,比如:
int cCout()
{
Static int loop = 0;
.......
loop++;
.......
}
   loop变量的值会跟随着函数的调用次数而递增,函数退出后,loop的值还存在,只是loop只能在函数中才能被访问(函数作用域),而loop的内存 空间也只会在函数第一次被调用时才会被分配和初始化,以后每次进入函数,都不为static分配了,而直接使用上一次的值。在模块内,一个被声明为静态的 函数只可被这一模块内的其他函数调用,模块外其它函数无权访问,是一个本地全局变量。
5、Constant:
   将一个变量或对象定义成constant类型,则定义之后不能被更新(可读不可写),即在定义或说明类型时必须给他一个初始值。
   几种须要注意的地方:
   √如果const位于星号(*)的 ......



谢谢您!!!!

我裸奔,我快乐!!

吕氏春秋8266 发表于 2010-12-31 08:44:29

在C语言中,如果P为一个指针,刚*P表示该指针所指向内存的数据
考虑一个C语言中最基本的问题,要求用指针对地址0x54000018的数据(100)进行读写,程序如下:
INT I;
INT *P;                                    定义P为指针
P=(INT *)0x54000018;            将整数0x54000018转换为指针并赋值于P
I=*P;                                       将地址0x54000018保存的数据100赋值于I,即I=100
*P=200;                                  将200保存在0x54000018处。
同理,在上面我们可以定义
P=(unsigned*)(_ISR_STARTADDREs+0x84)即将整数转换为指针并赋值于P
对该地址进行读写引用*P即*P=*(unsigned*)(_ISR_STARTADDREs+0x84)
我们定义#define pISR_EINT0 *P,用pISR_EINT0来代替*P对地址_ISR_STARTADDREs+0x84处的数据进行操作,即
#define pISR_EINT0 ,*(unsigned*)(_ISR_STARTADDREs+0x84)
pISR_EINT0是指向内存 _ISR_STARTADDREs+0x84的数据

pISR_EINT0=100,即将内存_ISR_STARTADDREs+0x84处数据赋值为100
I=pISR_EINT0将将内存_ISR_STARTADDREs+0x84处数据赋值于I.

吕氏春秋8266 发表于 2010-12-31 08:49:49

不是定义的双指针,否则理解将会错误!

embedsky_lhh 发表于 2010-12-31 09:55:03

1# 北国孤月


EQU这条汇编指令(伪指令)不占内存,就是把一个寄存器地址取一个名字一样。我的理解就是用它方便代码移植和修改,要改变时之改变定义部分就OK了
页: [1]
查看完整版本: The location of stacks的问题?