news 2026/4/18 13:24:32

AURIX TC3XX启动文件解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AURIX TC3XX启动文件解析

启动文件流程图:

TC3xx系列MCU复位后会从Ifx_Ssw_Tc0.c文件的_START()函数开始启动,启动的时候都会从CPU0开始运行,直到在__StartUpSoftware_Phase6()函数中才会根据用户配置依次启动其他核。

_START()

_START()的地址由link文件中RESET决定,以Tasking为例. 在Link文件中:

这个地址也必须和BMHD中的应用程序起始地址定义一致。

_START()代码解析:

__StartUpSoftware()

__StartUpSoftware()主要用来设置A1寄存器,设置PSW寄存器,以及判断是否是Application Reset, 从而进行不同的跳转。

在Tricore中A0,A1,A8,A9是全局地址寄存器,此处的A1所指向区域用来存放small RODATA, 所谓small data区域就是可以直接寻址。

PSW的默认值设的是0x980, 即Supervise mode, Global Address Register Write Permission Enable, Call Depth Count Enable, User Stack

__StartUpSoftware()代码解析:

__StartUpSoftware_Phase2()

在这个API里面,会根据用户的配置,执行EVRC的初始化配置,LBIST测试,MONBIST测试。

__StartUpSoftware_Phase2()代码解析:

__StartUpSoftware_Phase3PowerOnResetPath()

在这个API里面, 会初始化上下文,所谓的上下文就是SP指针和CSA。

在Tricore中,SP是A10寄存器,在这里会把栈顶地址赋给A10.

CSA是存放上下文的区域,在Tricore中,每当调用子函数或者进中断时,都会把一些通用寄存器自动存放在CSA区域 (Push),然后等到子函数返回或中断返回时,再把这些寄存器恢复(Pop)。

__StartUpSoftware_Phase3ApplicationResetPath代码解析:

__StartUpSoftware_Phase4

在这个API里面,会首先进行对CPU0 watchdog和safety watchdog进行一次喂狗(注意:复位后CPU0 watchdog和safety watchdog是使能的),然后根据用户配置,完成时钟初始化以及MBIST测试。

__StartUpSoftware_Phase5

在这个API里面, 只有SMU配置的一个API,但是这个API只是个空函数,所以其实在这里什么都没有做。

__StartUpSoftware_Phase3ApplicationResetPath

和__StartUpSoftware_Phase3PowerOnResetPath()一样。

__StartUpSoftware_Phase6

根据用户配置启动不同的内核。

SYSCON寄存器的BHALT位用来设置Core是否启动,PC用来设置程序指针,Ifx_Ssw_startCore()中设置这两个寄存器,来启动其他内核。


__StartUpSoftware_Phase6()代码解析:

__Ifx_Ssw_startCore()代码解析:

以TC38x为例,如果所有4个内核都启动,那么__StartUpSoftware_Phase6()中会启动CORE1。这个时候,__Core0_Start()和__Core1_Start()是同时运行的,在__Core1_Start()的最后会启动Core2,然后跳转到__Core2_Start(),在_Core2_Start() 最后会启动Core3, 然后跳转到__Core3_Start().

__Corex_start

以__Core0_Start()为例,在__Core0_Start()中,会根据配置使能PCACHE和DCACHE,设置A0, A8, A9地址,配置Trap和中断向量表起始地址,配置中断栈指针,初始化全局变量。

CACHE配置:

是否使能CACHE,通过配置下面两个宏:

通过配置PCON0的PCBYP位来使能PCACHE:

通过配置DCON0的PCBYP来使能DCACHE:

Trap和中断向量配置:

BTV寄存器用来设置Trap向量表的首地址,在工程中Trap向量表的首地址在link文件中设置,通过下面语句会把link文件中Trap向量表地址赋给BTV.

BIV寄存器用来设置中断向量表的首地址,在工程中中断向量表的首地址在link文件中设置,通过下面语句会把link文件的中断向量表地址赋给BIV. 注意在Tricore中,默认状态下,中断向量是32字节对齐的,中断向量的位置不是固定的,而是由中断优先级决定的。

配置ISTACK:

在Tricore中,栈分为USTACK和ISTACK, 他们的使用由PSW.IS位来决定,默认配置PSW.IS=0,即在线程中的函数调用时,会用USTACK(A11)部分作为CPU的栈,而在中断函数中会用ISTACK(ISP)作为CPU的栈。USTACK和ISTACK大小和位置是在Link文件中配置的。下面语句设置ISP:

对于CPU0,在__StartUpSoftware_Phase3ApplicationResetPath()已经把USTACK的栈顶指针赋给了A10. 对于其他CPU,在各自的__Corex_Start()把USTACK的栈顶指针赋给了各自CPU的A10。

初始化全局变量:

下面函数用来初始化全局变量 (这个函数是编译器来实现的),全局变量分为两部分:Data和BSS。

Data: 存放有初始化全局变量,有初始化的全局变量的初始值最初是放在Flash中,在这个函数里面,会把初始值从Flash赋给全局变量。

BSS: BSS段用于存放没有初始化值的全局变量,在这个函数里面会把没有初始化值的全局变量清零。

对于其它__Corex_Start()而言,和__Core0_Start()的流程基本一样,另外增加了把USTACK栈顶指针赋给A10的操作和PSW初始化操作。

在各个CPU的__Corex_Start()最后会跳转到各自的corex_main()中运行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:02:15

SSH连接超时设置:保持PyTorch远程会话长期稳定

SSH连接超时设置:保持PyTorch远程会话长期稳定 在深度学习项目中,一个让人又爱又恨的场景是这样的:你提交了一个长达72小时的模型训练任务,满怀期待地去休息,结果第二天回来发现SSH连接早已断开,训练进程被…

作者头像 李华
网站建设 2026/4/18 8:08:04

Jupyter Notebook内核安装:连接远程PyTorch-CUDA环境

Jupyter Notebook内核安装:连接远程PyTorch-CUDA环境 在高校实验室里,一个学生正用轻薄的MacBook Air运行ResNet-50训练——而他的模型正在百公里外的一台A100服务器上飞速迭代。这不是科幻场景,而是如今AI开发者的日常。随着深度学习模型规…

作者头像 李华
网站建设 2026/4/18 8:51:45

免费提速 - 这招让你的夸克网盘下载速度飙升到70MB/S

今天教大家一招能解决夸克网盘限制的在线工具。这个工具也是完全免费使用的。下面让大家看看我用这个工具的下载速度咋样。地址获取:放在这里了,可以直接获取 这个速度还是不错的把。对于平常不怎么下载的用户还是很友好的。下面开始今天的教学 输入我给…

作者头像 李华
网站建设 2026/4/18 9:44:55

Anaconda环境激活钩子:进入PyTorch环境自动加载配置

Anaconda环境激活钩子:进入PyTorch环境自动加载配置 在深度学习项目中,每次打开终端、激活虚拟环境后还要手动设置一堆环境变量——CUDA_HOME、LD_LIBRARY_PATH、调试标志……这样的流程是不是已经让你感到疲惫?更别提团队协作时,…

作者头像 李华
网站建设 2026/4/18 9:45:19

Jupyter Notebook快捷键大全:加速PyTorch代码编写

Jupyter Notebook 快捷键与 PyTorch-CUDA 镜像协同提效实战 在深度学习项目开发中,你是否经历过这样的场景:刚写完一段 PyTorch 模型代码,想测试输出形状,却不得不停下键盘操作、伸手去点“运行”按钮?或者因为环境配置…

作者头像 李华