思是什么生肖| 心脏早搏是怎么回事有什么危害| 芹菜煮水喝有什么功效| 老人适合喝什么茶| 前列腺炎是什么原因引起的| 一个虫一个夫念什么| 小孩不吃肉是什么原因| 粉红粉红的什么| 什么水晶招财旺事业| 肺气肿用什么药| 珍珠婚是什么意思| 右手小指戴戒指什么意思| 心率快是什么原因| 为什么医院不推荐钡餐检查| 什么治胃胀气| 伤口感染用什么药| 越吃越瘦是什么原因| 8月29是什么星座| 若叶青汁有什么功效| 查宝宝五行八字缺什么| 左下腹痛挂什么科| 莫名其妙的名是什么意思| 胃泌素瘤是什么意思| beyond是什么意思| prince是什么牌子| 柠檬配什么泡水喝最好| 头发硬适合什么发型| 法益是什么意思| 胃炎胃溃疡吃什么药| 247是什么意思| 肺纹理增粗是什么意思| 巡视组组长什么级别| 渡人是什么意思| 下眼皮跳是什么原因| 梦见一个人死了是什么意思| 打喷嚏是什么预兆| 鼻尖痒是什么原因| 什么叫脘腹胀痛| 肺部结节是什么原因引起的| 纪念什么意思| 离婚的女人叫什么| 肾结石术后吃什么食物最好| 什么叫法令纹| 掉发严重是什么原因| hb是什么| 生理期不能吃什么水果| 梅子什么时候成熟| 三周年祭日有什么讲究| 舌头肿大是什么原因引起的| 裸睡是什么意思| 更年期出汗多是什么原因| 耳朵嗡嗡响吃什么药| 为什么会突然长智齿| 葛根是什么植物的根| 什么人容易得眩晕症| 7月15是什么星座| 9.23号是什么星座| 防小人应该佩戴什么| 孕妇羊水多是什么原因造成的| 眼睑炎用什么药效果好| 口腔溃疡看什么科室| 下面有味道用什么药| 社保缴纳基数是什么意思| 日语一库一库是什么意思| 军用水壶为什么是铝的| 思觉失调是什么意思| 5.13是什么星座| 脂肪垫是什么| 梦见走错路是什么意思| 韩语思密达是什么意思| amy什么意思| 女人左眼角有痣代表什么| 李子什么季节成熟| 荷叶茶有什么功效和作用| 喜鹊进家有什么预兆| 淋巴结用什么药效果好| 急性胃肠炎用什么药| 发低烧吃什么药| 彩虹像什么挂在天空| 睡觉后腰疼是什么原因引起的| 累觉不爱是什么意思| 军校是干什么的| 胃阴虚吃什么药| 作是什么意思| 6.26什么星座| 婴儿胀气是什么原因| 钾高吃什么可以降下来| 倒挂金钩是什么意思| 人体消化道中最长的器官是什么| 做梦梦见老公出轨是什么意思| 这是什么英文| 腊月二十三是什么星座| 灯红酒绿是什么意思| 色丁布是什么面料| 红细胞阳性是什么意思| 眼睛疲劳用什么眼药水好| 脾不好吃什么药| 前列腺炎吃什么中成药| 为什么会长痣| 贫血吃什么补得快| 肺气泡是什么病| 睡觉做梦多是什么原因| 解痉镇痛酊有什么功效| 甲亢什么不能吃| suv什么意思| 痛经喝什么可以缓解| 新生儿什么时候上户口| 单核细胞百分比偏高什么原因| 八月二十五是什么星座| 为什么空调外机不转| 护理考研考什么| 芹菜炒什么好吃| 筷子在古代叫什么| 岁月静好浅笑安然什么意思| 死库水是什么意思| 闹觉是什么意思| 亥和什么合| 什么是宫寒| 脏器灰阶立体成像是检查什么的| 月亮为什么会有圆缺变化| 飞行模式有什么用| Fish什么意思| 什么是gmp| 为什么眼睛会肿而且痛| 乳腺看什么科室| 婴儿拉奶瓣是什么原因| 清净心是什么意思| 宝宝睡觉头上出汗多是什么原因| her什么意思| 缺少雌激素的女性会有什么症状| 小年是什么时候| 立加羽读什么| 哺乳期妈妈感冒了可以吃什么药| 敢是什么意思| 夏季喝什么汤好| 阴唇是什么颜色| 葡萄球菌用什么抗生素| 幼小衔接是什么意思| 感觉是什么意思| 白蚁长什么样| 三五成群是什么意思| hpv疫苗什么时候打最好| 咳嗽变异性哮喘吃什么药| 什么是胃溃疡| 1985年是什么年| 舌苔白厚有齿痕是什么原因| 白细胞低吃什么食物好| 如花似玉什么意思| 孕妇红细胞偏低是什么原因| 头疼一般是什么原因引起的| 对食是什么意思| 老马识途是什么意思| 子宫长什么样| 心理障碍是什么病| 肌酐高有什么症状表现| 布洛芬有什么作用| 甲状腺是什么科| 女生过生日送什么礼物好| 子时属什么生肖| 剖腹产后能吃什么水果| 2012年属什么生肖| 梨花代表什么生肖| 舌头有问题看什么科| 静脉曲张挂什么号| 什么是爱情观| 搀扶是什么意思| 郴州有什么好玩的景点| 破日是什么意思| 阴气重是什么意思| 死了是什么感觉| 神经衰弱吃什么中成药| 一个井一个点念什么| 上分是什么意思| 舜字五行属什么| 为什么会长囊肿| 左肋骨下方是什么器官| 世界上最贵的烟是什么烟| 六月初六什么节| 胃不好吃什么水果| 血小板低会引发什么病| hpv去医院挂什么科| 不忘初心方得始终是什么意思| 胸导联低电压什么意思| 打扰了是什么意思| 萩是什么意思| 刚怀孕吃什么好| 经期喝咖啡有什么影响| 属狗适合佩戴什么饰品| 柠檬加蜂蜜泡水喝有什么功效| 山峦是什么意思| 枸杞泡水有什么功效| 软冷冻室一般放什么东西| 属鼠和什么属相最配| 色盲是什么意思| 我国的国球是什么球| 死库水是什么| 吃什么长头发快| 淋巴结肿大看什么科| 小白龙叫什么| 甲硝唑治什么| 心机是什么意思啊| 什么叫逻辑思维| 梵高属于什么画派| 梦见找鞋子是什么意思| 吃了羊肉不能吃什么| 5月有什么节日| 体寒吃什么| 姜什么时候种植最好| lomo卡是什么| 咳嗽咳到吐是什么原因| 湿气太重吃什么药最好| 什么鱼| 内透声差是什么意思| 烧心什么感觉| 来大姨妈喝酒有什么影响| 委曲求全是什么生肖| 宫颈多发囊肿是什么意思| 香草是什么植物| 终而复始什么意思| 鱼用什么游泳| 行驶证和驾驶证有什么区别| 大学体检都检查什么| 拔智齿后可以吃什么| 牛肉和什么炒好吃| 熊猫血有什么好处| 湿疹有什么忌口的食物| 什么是着相| 过敏性鼻炎吃什么| 一百岁叫什么之年| 木命的人适合佩戴什么首饰| 尿白细胞弱阳性是什么意思| 廉租房和公租房有什么区别| 子宫糜烂有什么症状| 99足银是什么意思| 特长有什么| 竖心旁的字与什么有关| 飞蛾吃什么东西| 超能力是什么意思| 什么是甲状腺结节| 拘留所和看守所有什么区别| 什么不及什么| 喝酒上头是什么原因| 恺字五行属什么| 看睾丸去医院挂什么科| 联系是什么意思| 黄体期是什么时候| 基点是什么意思| 儿童咳嗽挂什么科| 脸上长黑痣是什么原因| gin什么意思| 父亲是o型血孩子是什么血型| 冠心病什么症状表现| 蛋白粉什么时候喝效果最好| 榴莲吃多了有什么危害| 予五行属什么| 什么叫变应性鼻炎| 收入是什么意思| 鼻涕倒流到咽喉老吐痰吃什么药能根治| 筋膜炎有什么症状| 碱性是什么意思| 什么球会自己长大| 三叉戟是什么意思| 美篇是什么| 促什么谈什么| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 活动中心 ? 板卡试用 ? 【分享开发笔记,赚取电动螺丝刀】参考 RT-thread 的方式管理初始化函数调

共2条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】参考 RT-thread 的方式管理初始化函数调用

高工
2025-08-04 22:39:16   被打赏 28 分(兑奖)     打赏
百度 不熬夜的范爷皮肤当然比之前更棒了啊~其实现实生活中像范爷这样爱熬夜的妹子有很多,熬夜不仅伤害身体,最明显的体现就是各种肌肤问题,爱美姐今天就找来了黄鸣朗老师来给大家解答关于熬夜肌的问题,夜猫子们赶紧看过来哦。

【简介】

       在RT-thread 代码中对初始化代码部分是可以自动的进行初始化操作,而不需要进行手动的调用初始化接口。我们可以参照其代码实现将我们的代码初始化部分使用自动初始化的方式来实现。自动初始化的原理是将初始话函数指针放到一个特定的section(容器)中,让后根据section 的起始和结束地址之间的函数指针进行调用,从而完成初始化函数的自动调用完成初始化。

【功能需求】

本地初始化按照是否依赖操作系统进行分类可以分为系统相关及非系统相关,类如某些初始化会创建互斥锁来保护互斥访问保护临界区,这种初始话处理需要系统启动后才能进行,不依赖系统相关的初始化系统启动前就可以进行初始化。

自动初始化还需要可以配置初始化的顺序来避免初始化之间有顺序的依赖关系的场景。

【代码对应】

该功能实现的第一步需要在一个容器内将初始化函数进行统一管理保存,方便统一管理,将这些符号放入到容器统一管理,本地的IAR环境需使section,告诉编译器要将这些符号放在一起统一管理,同时如果这些符号没有被直接调用,需要告诉编译器这些符号需要帮我保留不要擅自优化掉。

在IAR 环境下要将符号保存到section 和 保留对应符号要加如下的修饰符

#define section(x)               @ x
#define used                     __root

IAR 中可以使用@ section_name 来修饰函数及变量,对应说明如下

image.png

IAR 中告诉编译器保留对应的符号使用__root 来修饰变量及符号,对应说明如下

image.png


使用RT-thread  的声明初始化函数section 定义宏INIT_EXPORT 将函数符号放入特定的section 中

/********************************************************************************************************
 *                                 Global Macro definition                                              *
 *******************************************************************************************************/
typedef int (*init_fn_t)(void);
#ifdef DEBUGING_AUTO_INIT
    struct init_desc
    {
        const char* fn_name;
        const init_fn_t fn;
    };
    #define INIT_EXPORT(fn, level)                                                       \
        const char __rti_##fn##_name[] = #fn;                                            \
        used const struct init_desc __init_desc_##fn ection(".ini_fn." level) =          \
        { __rti_##fn##_name, fn};
#else
    #define INIT_EXPORT(fn, level)                                                       \
        used const init_fn_t __init_##fn section(".ini_fn." level) = fn
#endif

上述宏INIT_EXPORT 宏会定义.init_fn.xx的section,我们之前提到除了需要一个容器对函数进行管理,上面的宏已经可以对函数符号进行容器化的管理,同时我们还需要根据自己的是需求来配置容器内函数的顺序,可以让设置xx 的数值让编译器来帮我们实现指定顺序,编译器会按照符号的命名来进行符号的排序,类如INIT_EXPORT (fn,"1.0") 就会在INIT_EXPORT (fn,"1.1") 的前面我们可以利用该特性来实现容器内的函数排序。

有了上述的认识,我们可以通过定义level “1.xx” 至 "1.end " 区间的函数为非系统依赖的初始化容器,level 2.0 至 levle 6.0 之间的函数为依赖系统的初始化函数,使用rt-thread内的初始化调用函数完成这两个类型的函数初始化处理,对应的自动初始化代码调用如下:

static int rti_start(void)
{
    return 0;
}
INIT_EXPORT(rti_start, "0");

static int rti_board_start(void)
{
    return 0;
}
INIT_EXPORT(rti_board_start, "0.end");

static int rti_board_end(void)
{
    return 0;
}
INIT_EXPORT(rti_board_end, "1.end");

static int rti_end(void)
{
    return 0;
}
INIT_EXPORT(rti_end, "6.end");

/**
 * @brief  Onboard components initialization. In this function, the board-level
 *         initialization function will be called to complete the initialization
 *         of the on-board peripherals.
 */
void components_board_init(void)
{
#ifdef DEBUGING_AUTO_INIT
    int result;
    const struct rt_init_desc *desc;
    for (desc = &__rt_init_desc_rti_board_start; desc < &__rt_init_desc_rti_board_end; desc ++)
    {
        printf("initialize %s", desc->fn_name);
        result = desc->fn();
        printf(":%d done\n", result);
    }
#else
    volatile const init_fn_t *fn_ptr;

    for (fn_ptr = &__init_rti_board_start; fn_ptr < &__init_rti_board_end; fn_ptr++)
    {
        (*fn_ptr)();
    }
#endif /* DEBUGING_AUTO_INIT */
}

/**
 * @brief  RT-Thread Components Initialization.
 */
void components_app_init(void)
{
#ifdef DEBUGING_AUTO_INIT
    int result;
    const struct rt_init_desc *desc;

    printf("do components initialization.\n");
    for (desc = &__init_desc_rti_board_end; desc < &__init_desc_rti_end; desc ++)
    {
        printf("initialize %s", desc->fn_name);
        result = desc->fn();
        printf(":%d done\n", result);
    }
#else
    volatile const init_fn_t *fn_ptr;

    for (fn_ptr = &__init_rti_board_end; fn_ptr < &__init_rti_end; fn_ptr ++)
    {
        (*fn_ptr)();
    }
#endif /* DEBUGING_AUTO_INIT */
}

按照上面level “1.xx” 至 "1.end " 区间的函数为非系统依赖的初始化容器,level 2.0 至 levle 6.0 之间的函数为依赖系统的初始化函数 的管理方式,定义如下的初始化函数声明宏来管理初始化调用,暂时只定义三个level 足够我们使用,可以扩展的空间也很大根据实际情况来调整。

/* board init */
#define INIT_BOARD_EXPORT_LEVEL1(fn)           INIT_EXPORT(fn, "1.1")
#define INIT_BOARD_EXPORT_LEVEL2(fn)           INIT_EXPORT(fn, "1.2")
#define INIT_BOARD_EXPORT_LEVEL3(fn)           INIT_EXPORT(fn, "1.3")

/* os run init */
#define INIT_OSRUN_EXPORT_LEVEL1(fn)           INIT_EXPORT(fn, "2.1")
#define INIT_OSRUN_EXPORT_LEVEL2(fn)           INIT_EXPORT(fn, "2.2")
#define INIT_OSRUN_EXPORT_LEVEL3(fn)           INIT_EXPORT(fn, "2.3")

【功能验证】

验证功能前我们先看下我们现有的初始化代码,对应初始化代码如下,adc/i2c 初始化如下。

image.png

我么修改代码使用自动初始化的方式,声明i2c 初始化调用为level1

image.png

配置adc 初始化为level2

image.png

声明后我们不需要之前显性的调用接口,在main 函数内调用初始化调用自动调用接口即可,代码相对之前会简洁。

image.png

根据配置level i2c 初始化调用 要在adc 初始化之前,产看对应的map文件也可以看出i2c在容器内部地址是靠前相对会被优先调用。

image.png

上述map 中符号的布局跟之前分析的一致,我们编译代码运行结果如下,发现I2c/adc初始化函数已经被调用,I2C初始化也是在ADC之前跟设计的保持一致。

image.png

上述运行结果跟预期的保持一致,功能验证通过,这里介绍了依赖系统相关的自动初始化,依赖系统的处理也是类似在此就不重复赘述了。






高工
2025-08-04 17:31:14     打赏
2楼

linux里面也好多这种玩法


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
尿路感染吃什么药比较好的快 百雀羚适合什么年龄段 雨像什么 57年属什么生肖 胃隐隐作痛吃什么药
去医院测血糖挂什么科 刚生完孩子的产妇吃什么好 口腔溃疡长什么样 季字五行属什么 50而知天命什么意思
a型血和a型血生的孩子是什么血型 头孢和什么不能一起吃 手心发红是什么原因 什么是鸡奸 好马不吃回头草什么意思
挂匾是什么意思 谜底是什么意思 17号来月经什么时候是排卵期 婴儿有眼屎是什么原因引起的 曲克芦丁片治什么病
天天喝白酒对身体有什么危害hcv9jop6ns1r.cn 血沉是检查什么的hcv9jop1ns5r.cn 草莓什么季节种植hcv8jop7ns9r.cn 什么寒什么冻hcv8jop0ns0r.cn 牙疼吃什么药最好最有效hcv8jop3ns8r.cn
脸上长痣是什么原因造成的hcv9jop2ns4r.cn 幽门螺旋杆菌吃什么药最好hcv8jop5ns9r.cn 肚子大什么原因hcv8jop8ns6r.cn 修女是干什么的jingluanji.com 霍乱是什么hcv8jop1ns9r.cn
为什么睡不醒wzqsfys.com 烦闷是什么意思hcv9jop6ns3r.cn 什么虫子有毒hanqikai.com 淋巴细胞升高说明什么hcv9jop6ns9r.cn 灰指甲是什么样子的hcv8jop5ns4r.cn
什么才叫幸福hcv7jop6ns3r.cn 天蝎座是什么象hcv7jop9ns7r.cn 哦多桑是什么意思hcv8jop1ns7r.cn 众里寻他千百度是什么意思hcv8jop3ns3r.cn 1981属什么生肖hcv9jop6ns6r.cn
百度