硬汉嵌入式论坛

 找回密码
 立即注册
查看: 595|回复: 11
收起左侧

[IAR] 如何才能不影响原函数,但是又包含原函数?

[复制链接]

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2024-3-30 11:10:21 | 显示全部楼层 |阅读模式
我想定义一个函数,这个函数和已有的函数同名字,编译无法通过。
但是呢,我想在不更换这个函数名字的前提下,让调用原函数的地方,直接调用我的函数,
然后在我的函数中再去调用原函数。
是不是有些绕?
好,举个例子。
原函数名字叫_txe_block_allocate,我新建个函数也叫这个名字,然后我在当前我新建的函数中
调用了一个_txe_block_allocate_orig,然后在我的内部.c文件中定义 extern UINT _txe_block_allocate_orig;
在外面的.h文件中让#pragma weak _txe_block_allocate_orig=_txe_block_allocate
感觉有些混乱,但是我是这么理解的。因为这就是trace alyzer源码这么干的,现在编译不过了,哪位大神给解决一下
我把源码传上来。
trcCTI.c (64.92 KB, 下载次数: 3) trcCTI.h (49.71 KB, 下载次数: 3)
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2024-3-30 13:56:07 | 显示全部楼层
你直接屏蔽原来的函数实现重新实现不行吗?还是有什么新的需求
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2024-3-30 14:06:29 | 显示全部楼层
你用宏定义也ok吧  #pragma weak _txe_block_allocate_orig=_txe_block_allocate 好像不太行?
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-3-30 15:43:49 | 显示全部楼层
我记得是在函数前加static, 就只有同文件的函数能调用它,而且不同文件可以有同各的函数,你试试吧
如果说不行,就用宏把文件名称连接到函数名, 这看起来就等于同名的函数。
回复

使用道具 举报

8

主题

104

回帖

138

积分

初级会员

积分
138
发表于 2024-3-30 21:28:36 | 显示全部楼层
手动修改链接文件即可。
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2024-4-1 10:46:04 | 显示全部楼层
#pragma weak symbol1 = symbol2
This pragma declares symbol1 to be a weak alias of symbol2. It is an error if symbol2 is not defined in the current translation unit.


好问题,用"#pragma weak symbol1 = symbol2"应该是可以满足你的需求,它允许你灵活控制链接不同的函数。
回复

使用道具 举报

82

主题

402

回帖

668

积分

金牌会员

积分
668
QQ
发表于 2024-4-1 10:51:34 | 显示全部楼层
可以把原函数用 weak 定义成弱函数
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2024-4-1 10:59:25 | 显示全部楼层
老生常谈的问题,参考:
https://www.armbbs.cn/forum.php? ... d=123362&extra=
回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2024-4-1 11:03:14 | 显示全部楼层
本帖最后由 glory 于 2024-4-1 11:05 编辑

总结起来就是,keil用$Super$$ 和 $Sub$$,
[C] 纯文本查看 复制代码
extern void ExtraFunc(void);
extern void $Super$$foo(void);
/* this function is called instead of the original foo() */
void $Sub$$foo(void){
  ExtraFunc();    /* does some extra setup work */
  $Super$$foo();  /* calls the original foo() function */
                  /* To avoid calling the original foo() function
                   * omit the $Super$$foo(); function call.                   */
}

gcc 用__wrap 和 __real(并且用--wrap选项指定symbol),
[C] 纯文本查看 复制代码
void* __wrap_malloc(size_t size)
{
        fprintf(stdout, "call __wrap_malloc function, size: %d\n", size);
        return __real_malloc(size);
}


回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
 楼主| 发表于 2024-4-1 11:39:53 | 显示全部楼层
glory 发表于 2024-4-1 11:03
总结起来就是,keil用$Super$$ 和 $Sub$$,
[mw_shl_code=c,true]extern void ExtraFunc(void);
extern v ...

大神,iar呢?我看iar里对gcc的支持,没有wrap的支持
回复

使用道具 举报

3

主题

337

回帖

346

积分

高级会员

积分
346
发表于 2024-4-5 12:30:05 | 显示全部楼层
zhang0352505 发表于 2024-4-1 11:39
大神,iar呢?我看iar里对gcc的支持,没有wrap的支持

IAR目前没有这个功能
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
 楼主| 发表于 2024-4-7 09:42:50 | 显示全部楼层
glory 发表于 2024-4-5 12:30
IAR目前没有这个功能

好吧,多谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 21:29 , Processed in 0.350821 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表