编译器高级用法1:MDK ARMLINK $Sub$$ $Super$$


交流学习,如有错误欢迎指正。by: wwdeng QQ:435398366


参考:
https://stackoverflow.com/questions/7494244/how-to-change-entry-point-of-c-program-with-gcc
https://www.cnblogs.com/yizhanwillsucceed/p/13602170.html
https://www.cnblogs.com/raswin/p/10031117.html
https://blog.youkuaiyun.com/morixinguan/article/details/106515414


交流学习,如有错误欢迎指正。by: wwdeng QQ:435398366


<think>嗯,用户问的是MDK$Super$$main和$Sub$$main的定义和作用。我需要先回忆一下MDK(也就是ARM的Keil开发环境)中的这些符号的用途。根据用户提供的引用内容,看起来这些符号是用来在函数执行前后插入自定义代码的,特别是在main函数前后。 首先,引用[2]和[3]提到,$Sub$$main是在主程序main之前插入一段新代码。例如,RT-Thread使用了$Sub$$main来初始化系统,比如关闭中断,然后启动RT-Thread的运行时环境。而$Super$$main则是用来调用原始的main函数,这样用户可以在替换main的同时保留原函数的功能。 用户可能是在开发嵌入式系统,特别是使用RTOS(如RT-Thread)时遇到这个问题。他们可能需要在main函数执行前做一些硬件初始化或者系统启动的准备工作,而MDK提供的这种机制可以让他们在不修改原有main函数代码的情况下,插入自定义的代码。 需要解释清楚这两个符号的作用机制,即如何通过$Sub$$$Super$$来重定向函数调用。例如,当定义$Sub$$main时,编译器会将所有对main的调用替换成这个新函数,而通过调用$Super$$main,可以在新函数中执行原有main的代码。这样既扩展了功能,又不影响原有逻辑。 另外,用户可能想知道具体的用法示例,比如代码结构是怎样的,如何在项目中应用这些符号。需要确保回答中给出具体的代码示例,并说明每个部分的作用。比如引用中的components.c代码,展示了如何禁用中断并启动系统,然后调用原始的main。 可能还需要提到这种方法的适用场景,比如在启动RTOS之前必须进行的初始化步骤,或者需要在特定硬件平台上进行前置配置的情况。同时,要注意不同编译器的兼容性,比如ARMCC、IAR和GCC的处理方式可能不同,这在代码中通常用预处理器指令来处理。 用户可能还会有疑问,比如这样做是否会影响程序的正常流程,或者是否有其他类似的符号可以使用。但根据问题,主要需要集中在定义、作用和使用方法上,确保回答清晰、结构合理,并引用提供的参考资料来支持解释。</think>MDK$Super$$$Sub$$的定义与作用分析如下: ### 一、核心机制解析 $Super$$$Sub$$是ARM编译器(ARMCC)特有的符号重定向机制,主要用于实现函数拦截与扩展。其核心原理是: 1. **$Sub$$前缀**:创建新函数体,拦截原函数调用 2. **$Super$$前缀**:访问原始函数实现 3. 通过组合使用实现"函数装饰器"模式 ### 二、具体定义说明 以`main()`函数为例: ```c // 定义拦截函数 int $Sub$$main(void) { /* 前置操作代码 */ rt_hw_interrupt_disable(); rtthread_startup(); /* 调用原始main函数 */ return $Super$$main(); } // 原始main函数保持原样 int main(void) { /* 用户代码 */ } ``` 该机制在RT-Thread启动流程中有典型应用[^2][^3] ### 三、应用场景对比 | 场景类型 | 使用方式 | 典型应用 | |-------------------|----------------------------|-------------------------------| | 系统初始化前置 | 在$Sub$$main中添加启动代码 | RTOS启动前关闭中断[^2] | | 功能扩展 | 包裹原始函数实现功能增强 | 添加调试日志/性能统计 | | 代码保护 | 隐藏原始函数实现 | 安全启动验证 | ### 四、实现原理图解 ``` 原始调用流程: main() -> 用户代码 拦截后流程: $Sub$$main() -> 前置代码 -> $Super$$main() -> 原始main() ``` ### 五、注意事项 1. 编译器兼容性:仅适用于ARMCC编译器 2. 链接顺序:需确保$Sub$$函数在链接时优先处理 3. 递归调用:避免在$Sub$$函数中直接调用原函数名 4. 多级拦截:支持多层$Sub$$嵌套,但需谨慎设计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值