您当前的位置:首页 >  快讯 >> 
全球微头条丨英飞凌tc397:告诉你程序真正的启动过程

时间:2023-06-21 15:17:01    来源 : 个人图书馆-新用户3849ayns


(相关资料图)

嵌入式开发中,main函数似乎成了我们很多开发人员理解的程序入口,真的是这样吗?main函数只能说是应用程序恢复到了一个初始状态,对CPU来说,它可不认为自己在main函数处开始执行程序的。本文通过链接文件(*.lsl)、*.map文件以及启动文件详细地聊一聊tc397(其它英飞凌系列类似)的启动过程。

1PC寄存器值哪里来?我们知道程序的执行需要获取指令地址->执行指令。那么第一个指令的地址如何来的呢?答:嵌入式开发中,我们会在链接文件(比如:*.lsl)中规定好程序复位地址,而这个地址就是CPU程序指针寄存器(PC:Program Counter)获取的第一个地址,即程序真正的入口点。在链接文件中用标号RESET(不同链接器识别的标号可能不同)设置程序复位地址。如下所示,链接文件设置了复位地址:0xA0000000。这里注意:在程序中设置了.start段,并将.start段的起始地址设为0xA0000000,也就是说,.start段里的程序才是系统复位后执行的第一个程序,这个程序是执行main函数之前所必需的,因为每个CPU的中断向量表入口点、Trap入口点等均需要提前告知,否则CPU不知道程序异常或者发生中断时该做啥。
;
通过调试,我们可以看到,程序上电或者复位执行的第一个指令如下所示。_START函数要执行的指令在二进制文件(*.hex)具体体现如下所示:3中断向量表基地址设置刚才提到,在真正执行main函数之前,有很多前置功能需要设置,这里主要讲一下中断向量表基地址的设置。我们知道,中断发生时,CPU根据中断向量号及中断向量表基地址即可找到中断处理函数。但是大家是不是好奇这样的问题:每当中断发生的时候,CPU是如何知道中断向量表基地址的呢?首先,我们在链接文件(*.lsl)中通过标号设置每个CPU的中断向量表基地址,如下所示:

当外部某个条件满足时,会触发一个中断请求给ICU,ICU再将中断分配给对应的CPU/DMA,如下所示:当多个中断同时请求时,ICU通过中断优先级(中断向量号)决定将哪个中断请求先送给CPU/DMA,具体仲裁过程如下所示。4执行main函数如下所示,执行完必要的启动流程之后,程序跳转到用户的main程序。一般来说是先跳转到Boot的main程序,如果不需要刷新App/Boot程序,且App程序标志位有效,程序跳转到App的main函数,之后用户真正的功能得以运行。
Ifx_Ssw_jumpToFunction(core0_main);}

标签:

热门推荐

X 关闭

X 关闭