2016 - 2024

感恩一路有你

电脑上的thumb怎么打不开 在main之前,IAR都做了啥?

浏览量:4748 时间:2023-09-27 10:49:16 作者:采采

在main之前,IAR都做了啥?

最近要在Cortex-M3上写一个简单操作系统,准备建议使用IAR,替写好启动代码,花了一些时间了解了IAR在main()以前到底在干什么事。t

是需要系统复位时,Cortex-M3从代码区偏移0x00000000处资源栈顶地址,单独初始化设置MSP寄存器的值。t

接下来的事情从代码区偏移0x00000004某些第一个指令的跳转地址。这些地址,是CM3那些要求储放自动向量表的地方。t

这里是一个程序的启动区的反汇编:t

__vector_table:t

080040002600t

080040022000t

080040047E1Dt

080040060800t

这个程序是由IAP程序来正常启动的,IAP程序资源0x08004000处的MSP值(0x20002600),并设置中为MSP的值,即主堆栈比较大t

范围是0x20000000~0x200025FF。接下来的IAP程序查看0x08004004处的Reset_Handler的地址t

(0x08007E1D),并跳转Reset_Handler()先执行。t

IAP在这里已经是怎么模仿了Cortex-M3的复位序列,也就是说,在没有IAP的系统上,CM3只有从0x08000000获取MSP,从t

0x08000004声望兑换第一条指令所处地址。而IAP就存在在0x08000000这个地址上,IAP的启动,早就耗掉掉了这个复位序列,所以才t

IAP要启动时UserApp程序的时候,确实是全部我模仿Cortex-M3的复位序列的。t

下一步我们去看看复位后第一句指令——Reset_Handler()函数里有什么。t

若我们使用的是ST公司标准外设库,那么也有了现成的Reset_Handler,当然了他是弱定义——PUBWEAK,可以被我们覆写的小说改编函数覆盖。一般来说,我们在用的全是ST需要提供的Reset_Handler,在V3.4版本的库中,这个可以在startup_stm32f10x_xx.s中找到这个函数:t

PUBWEAKReset_Handlert

SECTION.text:CODE:REORDER(2)t

Reset_Handlert LDR R0,SystemInitt

BLXR0t

LDRR0,__iar_program_startt

BXR0t

的确ST还没有做太多的事,他只调用了自家库可以提供的SystemInit函数进行系统时钟、Flash读取文件的初始化,并把大权送到了t

__iar_program_start这个IAR需要提供的“内部函数”了,我们就跟紧这个__iar_program_start跳转,看看吧IAR做了什t

么,上面一段代码的反汇编追加:t

Reset_Handler:t

__iar_section$$root:t

08007E1C4801LDRR0,[PC,#0x4]LDRR0,SystemInitt

08007E1E4780BLXR0BLXR0t

08007E204801LDRR0,[PC,#0x4]LDRR0,__iar_program_startt

08007E224700BXR0BXR0t

08007E246C69t

08007E260800t

08007E287D8Dt

08007E2A0800t

再细心的观众会突然发现地址是0x08007E1C,比我们查到的0x08007E1D差了1,这是ARM家族的遗留问题,毕竟ARM处理器的指令至t

少是半字整个表格的(16位THUMB指令集内个t

32位ARM指令集),因为PC指针的LSB是常为0的,目的是十分充分依靠寄存器,ARM公司给PC的LSB了一个不重要的使命,那就是在先执行分支跳转时,PCt

的LSB1,来表示在用THUMB模式,LSB0,表示使用ARM模式,但在2011版的Cortex-M3内核上,只可以使用了THUMB-2指令集挑大梁,所t

以这一位要常保持1,因此我们查到的地址是0x08007E1D(C1100,D1101),放心好了,我们的CM3内核会遗漏掉掉LSB(除非为0,那t

么会过多一个fault),使正确跳转0x08007E1C。t

从0x08007E20处的打开程序指令,我们这个可以算不出__iar_program_start所处的位置,就是当前PC指针t

(0x08007E24),再加上4,即0x08007E28处的所朝的地址——0x08007D8D(0x08007D8C),我们跟紧着跳t

转,__iar_program_start果然在这里:t

__iar_program_start:t

08007D8CF000F88CBL__low_level_initt

08007D902800CMPR0,#0x0t

08007D92D001BEQ__iar_init$$donet

08007D94F7FFFFDEBL__iar_data_init2t

08007D982000MOVSR0,#0x0t

08007D9A F7FDFC49BLmaint

我们看见了IAR需要提供了__low_level_init这个函数并且了“底层”的初始化,尽快跟踪,我们可以查到__low_level_init这个函数又发生了什么,又不是不是我们想象中的不可告人。t

__low_level_init:t

08007EA82001MOVSR0,#0x1t

08007EAA4770BXLRt

__low_level_init预料之外想象的很简单,只是因为往R0寄存器中写入了1,就马上先执行

三星s5“thumbdata3是”什么文件?

三星S5手机.thumbdata3-开头的文件和.thumbnails是安卓系统中相机和图片的缓存文件,该文件好象会占用内存。

解决方法:1、用数据线连接到电脑和手机,选择类型U盘模式(将手机充当可移动磁盘)。以G盘为例,可以打开可移动磁盘,删除掉该目录下的.thumbdata3-1763508120和.thumbdata3--19672902992、新建项文件.thumbdata3--1967290299和.thumbdata3-1763508120。这里有两种方法。(1)会CMD的直接用CMD新建。(2)在电脑上找有后缀的文件,截图两个到可移动磁盘,各以此命名为.thumbdata3--1967290299和.thumbdata3-1763508120。3、右击文件,再点属性中改可读可写,提示框U盘。重启手机即可。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。