DSP程序入口与启动流程
调试代码
本文通过分析在CCS集成开发环境下调试一个C程序,来分析C语言的启动流程。在CCS集成开发环境新建一个简单的helloworld工程,输出格式选择为ELF格式,链接脚本选择OMAPL138.cmd。配置完的工程属性如下,
对工程进行编译后,查看Debug目录下的helloworld.map文件最开始的几行内容
******************************************************************************
TMS320C6x Linker PC v8.2.2
******************************************************************************
>> Linked Thu Mar 13 15:49:47 2025
OUTPUT FILE NAME: <helloworld.out>
ENTRY POINT SYMBOL: "_c_int00" address: 800069c0
可以看到DSP的入口函数为_c_int00,地址为800005a0,每一个程序都需要从入口地址开始执行,在调试时CCS集成开发环境会将程序数据导入到DSP的内存中,并且会跳转到 _c_int00这个函数对应的地址执行,然后运行到main函数断点。从调试界面也可以看出在main函数的下面有一个 _c_int00的标签,正是main函数的调用者。
可以通过修改配置让其启动时暂停到_c_int00位置,在调试汇编程序时也可以通过这个操作进行调试。具体操作如下
1、在Debug界面打开Tools菜单栏,选择GEL Files菜单,然后会弹出GEL Files窗口
2、在GEL Files窗口选择Auto Run and Launch Options,窗口右侧会显示配置界面
3、在On a program load or restart左侧的方框取消勾选,勾选Halt the target before any debugger access (will impact servicing of interrupts)
4、重新加载程序,程序会停在 _c_int00
此时就可以通过单步调试观察程序从_c_int00入口地址执行到main函数之前的步骤了,如下图所示程序单步调试暂停在_args_main函数调用main的过程。
在上面的调试中可以看到哪些是在条件编译内有效的代码。
_c_int00源码分析
在C6000的8.2.2版本的编译器目录ti-cgt-c6000_8.2.2\lib\src文件夹下的boot.c文件可以找到_c_int00函数源码实现,由于该编译器已经不在支持输出COFF格式,所以只需要关注 __TI_EABI__ 这个条件的流程
/*****************************************************************************/
/* BOOT.C v8.2.2 - Initialize the C60 C runtime environment */
/* */
/* Copyright (c) 1993-2017 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* Redistribution and use in source and binary forms, with or without */
/* modification, are permitted provided that the following c