在搭建或迁移TASKING工程时,经常会遇到TASKING启动代码怎么配置、TASKING启动代码和芯片型号怎么匹配的问题。启动代码不是普通业务代码,它负责把芯片从复位后的初始状态带到C程序可运行的状态。堆栈、全局变量初始化、中断向量、缓存、CSA、核启动顺序、链接脚本入口,这些地方只要有一个和芯片型号不一致,就可能出现能编译、能下载,但程序不起跑或跑一段就异常的情况。
一、TASKING启动代码怎么配置
在建立或者搬移TASKING工程的时候,大家经常不知道TASKING启动代码怎么配置,也搞不懂TASKING启动代码和芯片型号怎么匹配,其实启动代码和普通的业务代码不一样,芯片在复位之后的初始状态就是靠它带入到C程序运行状态的,像堆栈、全局变量初始化、中断向量、缓存、CSA、核启动顺序、链接脚本入口这些地方,只要有一个地方和芯片型号对不上,就很容易碰到虽然能编译和下载,但是程序就是不跑,或者跑一会就报错的情况。
1、确认启动代码来源
当我们新建TASKING TriCore或者SmartCode工程的时候,软件向导里一般会让作者选择要不要加startup file,如果选了,工程里就会自动出来cstart.c、cstart.h或者多核用的文件,这些文件之后也可以通过点击【File】→【New】→【Startup Files】来补上。
2、检查启动配置页面
我们通常可以去【Project】→【Properties】→【C/C++Build】下面的启动相关页面检查,比如【Startup Configuration】和【Startup Registers】这两个地方,这里面一般都包含启动代码怎么生成、寄存器最开始的值、堆栈、数据怎么初始化、清零段还有中断这些配置。
3、核对入口符号和链接文件
启动代码到最后肯定要和LSL链接文件一起配合使用,LSL文件里面一般写了程序入口、stack、copy table还有section怎么放这些规矩,TASKING链接脚本里的derivative定义是用来描述芯片内部总线和存储系统的,linker也会根据这个来理解地址和内存空间。
二、TASKING启动代码和芯片型号怎么匹配
我们在让启动代码和芯片型号匹配的时候,不能觉得“只要都是AURIX”或者“只要都是TriCore”就行了,因为TC2xx、TC3xx、TC4xx之间,具体的型号、内核有几个、Flash/RAM怎么排的、外设寄存器还有启动办法都不一样。
1、目标芯片型号要选准确
我们在工程属性或者新建工程的向导里面,必须把正确的processor、device或者derivative选对,如果芯片型号选错了,编译器、SFR头文件、链接文件还有启动初始化的逻辑都会被影响,情况轻一点是寄存器名字不对或者头文件对不上,严重的话连下载地址、启动入口和RAM区域都会出错。
就像TC275、TC297、TC375、TC397这些型号是不能随便乱换的,虽然它们代码结构差不多,但是Flash的开始地址、核的数量、局部RAM、LMU RAM还有外设基地址都有区别,在搬移工程的时候,作者不能只复制老工程的设置,得重新确认一遍目标芯片的型号。
2、多核配置要和实际工程一致
如果用的是多核芯片,作者要弄清楚工程到底选的是【All cores】、【Core 0】还是某一个单独的核心,在用TASKING SmartCode建立多核处理器工程的时候,里面会让你选多核配置,要是建了一个不是Core 0的单核工程,那就需要让Core 0工程来把其他的核心启动起来。
这种问题经常容易让人误以为是调试器连不上,但实际情况可能是Core 1或者Core 2的程序已经编出来了,只是没被Core 0正确带起来,在多核工程里面,启动代码、链接脚本、核跟核之间的同步、每个core的stack和入口函数全部都要对得上才行。
3、厂商库版本要和芯片系列一致
在用iLLD、MCAL、BSP或者板子例程的时候,启动文件一般已经和某个芯片系列绑死在一起了,比如Ifx_Ssw_Tc0.c、芯片目录、寄存器头文件、配置宏还有板子初始化文件里面,可能都写了TC3xx或者具体型号的信息。
三、启动代码匹配异常怎么排查
如果启动代码没配好,错误不一定会出现在编译的时候,很多时候工程能Build成功也能正常下载,但是芯片复位以后就是进不去main函数,或者进了main以后变量是乱的,又或者一开中断就死机,多核工程里也经常只有单核在跑。
1、程序不进main先看入口和复位流程
要是发现程序下载完以后进不去main,作者得先去检查启动入口、复位向量、boot配置、debug启动脚本还有LSL里面的start address,不用一上来就怀疑main函数或者后面的应用代码。
做AURIX工程的时候还要多注意UCB、启动地址和调试配置,在有些情况下,芯片必须要拿到正确的启动配置信息才能从想好的地址开始跑,而且去动Flash配置操作的时候要非常小心,因为这种区域一般有擦写次数限制,安全要求也高。
2、变量异常看初始化段
如果程序能进main,但是发现全局变量的初值不对、静态变量奇怪或者数组内容是乱的,这时候要重点看.data、.bss、copy table和清零的逻辑,因为.data一般需要把初值从Flash搬到RAM里,.bss也需要在启动的时候清零,TASKING知识库里说过启动代码会管这种不需要初始化的变量清零工作,如果是特殊RAM要保持数据的场景,可能还要想办法不让它清零。
3、中断异常看向量表和栈
要是程序的主循环跑得好好的,但是一打开中断就跑飞,就要重点去查中断向量表、trap向量、CSA、interrupt stack和user stack了,要是芯片型号选错或者启动文件不对,中断入口就会被放错地方,栈空间可能也没留在算好的RAM区域里。
总结
TASKING启动代码怎么配置,TASKING启动代码和芯片型号怎么匹配,说到底就是要把启动文件、芯片型号、链接脚本和厂家的底层库绑在一起查,配置的时候先看清楚是用TASKING默认的cstart,还是用iLLD、MCAL、BSP给的启动文件,然后再去核对processor、derivative、多核配置、SFR头文件、LSL文件和调试启动配置,排查的时候可以根据“不进main、变量异常、中断异常、多核不启动”这些现象分开看,只要把启动代码来源理清楚,芯片型号选对,再把链接文件和初始化过程对应好,TASKING工程在启动时候的麻烦就会少很多了。