这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » stm32启动代码中的一些疑惑

共25条 2/3 1 2 3 跳转至
高工
2012-03-02 09:05:36     打赏
11楼
找到答案了,原来这些是编译器的一些伪指令在起作用,不是单纯的死循环

-------------------------------------------------------------------------------------------------------------------------
这里是定义各个中断向量的处理函数处,所有列出来的中断向量处理函数地址一致,功能也是一致:原地跳转。

既然所有的中断处理函数功能一致,那它是如何跳转至用户定义在C语言中的中断处理函数的呢?答案是,如果用户没有在用户代码(C语言)中定义对应向量的中断处理函数,则实际起作用的真正的中断处理函数即为上面列出的原地跳转功能处。

它是如何实现的? 注意到在声明导出处理函数后面的[WEAK]了吗?它的功能由链接器实现:如果在别处也定义该标号(函数),在链接时用别处的地址。如果没有其它定方定义,则以此处地址进行链接。

可能不太好理解,实际上是启动代码已经预定义了中断处理函数,它的功能很简单,就是原地跳转。只不过这块预定义的中断处理函数是否真正起作用,要看你是否在别处重定义了相同标号的中断处理函数。如果你已经重定义了,则以你重定义的中断处理函数为准。

以EXTI0中断为列,假设用户在自已的代码中配置好了EXTI0的中断,并且重定义了下面的EXTI0_IRQHandler函数,则链接器会以此函数地址进行链接。

void EXTI0_IRQHandler()

{

}

也就是在上面启动代码的@@@标注处(DCD EXTI0_IRQHandler),会以用户重定义的EXTI0_IRQHandler()函数地址填入。


高工
2012-03-02 10:19:33     打赏
12楼
Dummy Exception Handlers (infinite loops which can be modified) 
这一句已经告诉你怎样应用以下的程序。

工程师
2012-03-02 10:52:41     打赏
13楼
有点高深

高工
2012-03-02 15:21:58     打赏
14楼
高人!现在回过头来看,是的,明白过来了,原来第一句就直接概括完了(但是太精炼了,本人愚昧,一眼看不懂啊)

高工
2012-03-02 19:33:45     打赏
15楼
这句话只是提示下面的是死循环,可以改。
相信学过几天英语的都能看懂

这个帖子讨论的是以下内容

死循环在哪里?
哪些内容是死循环?
死循环是怎么实现的?
为什么是在启动文件里面放死循环?
为什么下面的内容不是死循环了?
这样实现有什么好处?

会改就更好了。。。
请教一下,能不能深入讲讲  “怎样应用以下的程序” ?

高工
2012-03-03 11:07:02     打赏
16楼
1:死循环就是B . 这句话
2:stm32的异常和中断函数都是一样的,就一句死循环,
      但是正如上面说的,这些是加了编译选项的,只不过这块预定义的中断处理函数是否真正起作用,要看你是否在别处重定义了相同标号的中断处理函数。如果你已经重定义了,则以你重定义的中断处理函数为准。
----------------------------------------------
4:为什么是在启动文件里面放死循环?
5:为什么下面的内容不是死循环了?
6:这样实现有什么好处?
       其实这些大部分都可以用[WEAK]来解释,该选项表示,当所有的源文件都没有定义这样一个标号时,编译器也不给出错误,而是会把标号置为0,若该标号为B或是BL指令时,则将该指令置为0(也就是NOP指令)。
      这样做的好处:我想着可能是出于指令冗余的思想,把所有的中断和异常都处理了,这样程序出问题的跑飞的时候,大部分时候能再跑飞去按照正常的指令继续执行下去。
-------------------------------------------------------
纯属个人看法,有问题,欢迎大家继续讨论

专家
2012-03-03 11:21:51     打赏
17楼
一:PROC为子程序开始,ENDP为子程序结束
二:[weak]的意思就是弱。 怎么弱呢?如果你在其他地方写一个同名函数,比如Reset_handler, 你写的这个函数就可以取代它这个函数了。
语法格式:
EXPORT 标号 {[WEAK]}
EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。标号在程序中区分大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。
使用示例:
AREA Init , CODE , READONLY
EXPORT Stest ;声明一个可全局引用的标号Stest……
END

高工
2012-03-03 11:56:08     打赏
18楼
呵呵,我上面是想说论坛讨论不要扔一句

“这一句已经告诉你怎样应用以下的程序。”这样的话,显得很高深的样子,其实相当于什么都没说

但是好像每个论坛都有这样一些人

高工
2012-03-03 13:49:58     打赏
19楼
恩啊,确实是,可能有些的确是高人,这个就真不好说了,毕竟高手在民间嘛,嘿嘿。
————————————————————————————————————
我刚看清楚antonine问的是“请教一下,能不能深入讲讲 “怎样应用以下的程序” ?
我看成了是怎么进入应用程序(进入main()函数)。。。
不过启动文件下最后那一块,关于初始化堆栈,跳转到用__main(),然后再
跳到真正的用户程序main()那一块,我还真没有理解透

高工
2012-03-06 09:40:15     打赏
20楼

究竟在main函数之前,发生了什么?如果你觉得已经明白了这个过程,那么请试着回答这个问题:程序是存储到FLASH中的,运行时static变量地址是指向RAM,那么这些static变量的初始值是如何映射到RAM中的?

 

我们以STM32F10x的启动代码为例,先看看其完整的源码:
---------------------------------分割线-------------------------------------------------------------------------------------
太长,也没办法粘过来,在这篇文章里我们能理解上面的困惑,
http://blog.csdn.net/norains/article/details/6052029
------------------------------------------------------------------------------------


共25条 2/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]