初学STM8会发现,STM8官方的固件库并没有供给一个.s文件的发动代码,那么她是怎么发动然后跳转到main函数履行的呢
首要,咱们依据ARM的仅仅能够估测,STM8也是经过复位向量来发动的,假定流程在复位嘹亮中完结的,应该首要去复位向量表中心去找,看复位向量又要看存储器映射,一环扣一环
STM8运用的是一致编址技能,以下是存储器编址图

咱们能够看到,最大取指空间是0XFFFFFF,也便是说,是16M,这是由于PC的特性决议的

在程序内部,它是将16M分为了256个节(sector),每个节的巨细为64K,64*256= 16384K=16M,由图咱们能够看到,在SECTOR0区间里边好像还有些奥妙,之后的便是一般空间了

这便是sector的分区,分区如下
0-17ff 是RAM空间,并且是最大的ram空间,STM8的ram一般都小于6K由此可见,在这个ram空间里边就包括有咱们的仓库区域.可是纷歧定是6K,(3G寻址的win7也没见多少人真的装3G啊,装2G内存条的多的是)
1800-3fff是保存区域
4000-47ff是最大2K的数据保存区(相当于EEPROM)
4800-487f是选项字节空间,用于设置一些装备信息
4900-4fff是保存空间
5000-57ff IO以及外设的寄存器空间(一致编址技能)
5800-5fff 保存区域
6000-67ff 2K的发动代码rom
6800-7eff 保存区间
7f00-7fff 体系寄存器的地址
8000-8080 中止向量
在往下才是flash空间,也便是说,咱们的代码寄存的区域便是在0x8000开端的
在上面那张图咱们能够看见复位向量

那是不是说芯片发动立马就到了复位向量0x8000的方位了呢?
其实不然,检查手册咱们发现这一段话

也便是说,体系发动的时分不在复位向量的当地,那这个6000区域寄存的是啥

原来是发动代码,仍是数据手册

鉴于此,咱们能够很肯定地说,体系发动的进程是
复位–>跳转到boot ram—>boot ram进行某种初始化–>处理用户有或许的程序更新–>跳转到0x8000–>复位向量履行
已然复位向量在8000,那么代码中应该有指示

咱们在IAR里边看到他对中止的处理依托这个宏界说,实际上他便是界说了两个重要的宏界说
INTERRUPT_HANDLER_TRAP(a)和INTERRUPT_HANDLER(a, b )
咱们翻开第一个
得到
INTERRUPT_HANDLER_TRAP(a) ==
_Pragma(vector = 1) __interruptvoid (a) (void)
这里边涉及到两个编译器关键字分别是Pragma和interrupt

Pragma是一个预处理指令,它包括不同的句子的时分有不同的意义,咱们现在包括的是vector,那就和vector有关系了

什么意思呢,咱们得看详细语法

也便是说,相当于在中止向量表标号中写入指定的函数
_Pragma(vector = 1) __interruptvoid (a) (void)
相当于在中止向量1的方位写入a这个函数的指针
INTERRUPT_HANDLER( a, b )翻开来
_Pragma(vector = b+2) __interruptvoid (a) (void)
便是在中止向量表B+2的方位写入a这个函数的指针,(由于0和1被reset和trap占用了)
现在咱们来看it.c中的句子就很清楚了

第一个函数是trap指针,咱们需求完成TRAP_IRQHandler这个函数就能相关上对应的中止向量
第二个函数相同咱们只需完成TLI_IRQHandler这个函数就OK了
函数的视野需求遵从
__interrupt void (a) (void)的形式,不然宏界说报错
可是trap有了,reset去哪了呢?这是IAR的一个手法,他把RESET躲藏了,咱们来看这个图片

相当于,IAR在RESET处默许寄存了一个中止向量指针,指针的指向是__iar_program_start函数,这个函数咱们无法找到,归于iar内置函数,可是咱们能够看到,调试就能够了
翻开仿真

在reset方位放置了一个0x80c3地址(0x82归于固定填充,24位地址,32位高八位不必),80c3方位代码如下

由此可见咱们的推论是正确的
先设置仓库基地址0x17ff然后阅历lowinit和datainit之后跳转到main函数履行
所以,IAR下编译STM8发动的进程总结如下
复位–>跳转到boot ram—>boot ram进行某种初始化–>处理用户有或许的程序更新–>跳转到0x8000–>复位向量履行à跳转到__iar_program_start–>跳转到main函数地址