Keil 8051项目无main函数仍运行?如何自定义映射?C_START入口
Keil C51 ?C_START 入口逻辑与自定义映射方法
无main函数时程序正常运行的原因
Keil C51 启动文件STARTUP.a51中的LJMP ?C_START指令跳转的是C运行时库初始化入口,而非直接跳转main函数,控制权流转逻辑如下:
- 默认的
?C_START由Keil官方C运行时库提供,执行流程为:完成片内RAM清零、全局/静态变量初值拷贝、堆栈指针配置等C运行环境准备工作 → 跳转至用户定义的main函数 - 无
main函数仍可正常运行,说明你项目的?C_START逻辑已经被替换/重定向,要么是链接阶段指定了自定义入口跳过了main寻址,要么是你重写了?C_START的实现,初始化完成后直接跳转至你的应用代码入口,绕过了调用main的步骤。
自定义函数映射到?C_START的操作方法
可以将自定义函数映射到?C_START,常用两种实现方式:
方法1:修改启动文件直接跳转
- 打开工程中引入的
STARTUP.a51文件,找到末尾的LJMP ?C_START指令 - 将指令修改为跳转至你的自定义入口函数,例如自定义入口名为
app_entry,则修改为LJMP app_entry - 注意:如果你的自定义入口是C语言函数,需要自行在跳转前完成C运行环境初始化,否则全局变量、堆栈功能会出现异常。
方法2:通过链接器参数重定义入口
无需修改启动文件,通过链接配置完成映射:
- 打开Keil的
Options for Target配置界面,切换到Linker标签页 - 取消勾选
Use Memory Layout from Target Dialog - 在
Misc controls输入框中添加参数:--entry=?C_START=app_entry(将app_entry替换为你自己的函数名) - 保存配置后重新编译,链接阶段会自动将
?C_START的入口地址替换为你指定的自定义函数地址。
注意:如果自定义入口为C语言函数,需定义为无参数、无返回值的类型(
void app_entry(void)),避免调用约定不匹配导致程序跑飞。
内容的提问来源于stack exchange,提问作者user12027865
相关产品推荐
相关产品推荐

