庄永 发表于 2024-2-20 20:00:40

分散加载疑问


背景:
团队开发项目,为了实现每个人的Debug代码隔离开来,不提交同时也不影响其他人开发,将Debug相关的代码通过分散加载实现Debug相关代码的自动初始化流程。

原理:

#define CALL_NAME(f)         __debug_init_##f
#define CALL_SECTION            __attribute__((section("DEBUG_INIT")))
#define DEBUG_INIT(f)          CALL_SECTION static debug_init CALL_NAME(f) = f


个人需要Debug部分的代码模块化后,调用 DEBUG_INIT 宏将代码指定到DEBUG_INIT节,然后主函数遍历这个节进行初始化

现象:
按道理使用了这些节我应该在分散加载文件里面声明的,但是调试的时候忘记该分散加载文件了,只是定义很多初始化接口,结果,居然能够运行。下面的代码居然能够正常运行并且正常初始化,大佬们知道原因吗


extern uint32_t DEBUG_INIT$$Base;
extern uint32_t DEBUG_INIT$$Limit;


eric2013 发表于 2024-2-21 09:48:01

这个可以看下MAP文件,如果有对应的section就可以。

庄永 发表于 2024-2-21 11:31:52

eric2013 发表于 2024-2-21 09:48
这个可以看下MAP文件,如果有对应的section就可以。

MAP文件有对应的section的。只是感觉奇怪,以前都是得在分散加载文件里面指定对应的section的,现在不知道都是可以的,不知道啥原因。

eric2013 发表于 2024-2-21 14:01:23

庄永 发表于 2024-2-21 11:31
MAP文件有对应的section的。只是感觉奇怪,以前都是得在分散加载文件里面指定对应的section的,现在不知 ...

通过分散加载主要是方便设置section到指定的存储空间。

直接attribute也是有的section的,像RTX5的调试组件就是这种玩法。

yklstudent 发表于 2024-2-21 14:39:35

群主分享下这个玩法,很感兴趣

庄永 发表于 2024-2-21 14:48:31

eric2013 发表于 2024-2-21 14:01
通过分散加载主要是方便设置section到指定的存储空间。

直接attribute也是有的section的,像RTX5的调 ...

明白了,感谢硬汉

庄永 发表于 2024-2-21 14:51:48

yklstudent 发表于 2024-2-21 14:39
群主分享下这个玩法,很感兴趣

就是将通过宏DEBUG_INIT修饰初始化函数,将这些函数指定放在DEBUG_INIT段,然后主函数里面通过遍历DEBUG_INIT$$Base到DEBUG_INIT$$Limit之间的内容并调用实现初始化,不用将那些初始化函数一一调用,这样团队内部开发人员自己的调试文件就可以隔离开来,在自己的本地,不会由于每个人都有自己的调试信息导致代码很乱
页: [1]
查看完整版本: 分散加载疑问