zoukankan      html  css  js  c++  java
  • __attribute__之section详解 ------ 把函数指定到具体某个section 之 RT-thread 实例详解

    typedef int (*init_fn_t)(void);
    #define RT_USED                     __attribute__((used))
    #define INIT_EXPORT(fn, level)
      RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn." level) = fn #define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") #define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2")

     SECTION(".rti_fn." "1") 等效于 SECTION(".rti_fn.1"),可见 level 是前一段的后缀,称".rti_fn.1"为段名

    以下定义空函数,为了后面遍历函数用,标记起始地址和结束地址

    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");

    查看 rtthread.map 可以看

     遍历函数还有一种方法,在 lds 相应段中定义变量表示起始地址和结束地址

    link.lds

            /* section information for initial. */
            . = ALIGN(4);  //ALIGN()是在.h中定义
            __rt_init_start = .;
            KEEP(*(SORT(.rti_fn*)))
            __rt_init_end = .;

    如果使用空函数遍历,SORT()排序函数必须加 

    rtdef.h

        #define ALIGN(n)                    __attribute__((aligned(n)))

    把相应的函数放入section的段中

    INIT_BOARD_EXPORT(esp8266_port_init);
    INIT_BOARD_EXPORT(clock_information);

    通过空函数遍历函数

        const init_fn_t *fn_ptr;
    
        for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++)
        {
            (*fn_ptr)();
        }

    通过空函数遍历的好处是:可以在段名前缀一样的情况下,分几段进行遍历,因为有些函数不是在同一个位置执行

    通过 lds 定义的变量进行遍历

        extern init_fn_t __rt_init_start;
        extern init_fn_t __rt_init_end;
        
        const init_fn_t *fn_ptr = &__rt_init_start;
        for (fn_ptr = &__rt_init_start; fn_ptr < &__rt_init_end; fn_ptr++)
        {
            (*fn_ptr)();
        }
  • 相关阅读:
    rpm yum 等命令无响应的解决方法
    ulimit open files linux打开文件数设置验证
    解析XtraBackup备份MySQL的原理和过程(转)
    Xtrabackup之innobackupex备份恢复详解(转)
    Linux中内存查看命令free详解(转)
    mysql innobackupex xtrabackup 大数据量 备份 还原(转)
    Percona Xtrabackup备份mysql(转)
    安装完 MySQL 后必须调整的 10 项配置(转)
    MySQL 5.5 服务器变量详解二(转)
    MySQL 5.5 服务器变量详解一(转)
  • 原文地址:https://www.cnblogs.com/god-of-death/p/14863866.html
Copyright © 2011-2022 走看看