How to install a function in section and to call the function

    xiaoxiao2022-07-07  214

    1) __attribute__((section("section_name")))  fuctions: put the functions and datas into in the section pointed by "section_name"    #define STR(x) (#x)  #define ERIC_ATTRIB_SECTION(setction) __attribute__((section(setction)))    #define ERIC_TAB_ENTRY( _name ) \         ERIC_ATTRIB_SECTION(".eric.table." STR(_name) ".data")   2)"#" and "##"

      (1)"#" symbol convert a symbol to string.  #define STR(x) (#x)     (2)"##" symbol is used to connect the two symbols  #define STR_LINK(x, y) (x##y)

    3) how to use __asm__

        __asm__ __volatile__(       assembly language part:       output    part:       input    part:       broken    part:  )    (1) we use ";" "\n" or "\n\t" to distinguish expression of the assembly language part   we could use the following example to use __asm__

      #define str(x) #x   #define LAB(x) x

      #define ERIC_TAB_BEGIN(label, name)                                 \   __asm__(".section \".eric.table." str(name) ".begin\",\"aw\"\n"     \     ".globl " str(LAB(label)) "\n"                         \     ".type    " str(LAB(label)) ",object\n"                \     ".p2align " str(LAB) "\n"                           \     str(LAB(_label)) ":\n"                               \     ".previous\n"                                         \   )   4) how to use above data struct  (1)we use the ERIC_TAB_BEGIN to start a new read_write section     and also we can use ERIC_TAB_END(.begin->.finish) to end a section    (2)how to use the ERIC_TAB_ENTRY to install test     a) we can define the following data struct  struct lib_init_sturct{   unsigned int id;   unsigned int p_id;   int (*call_func)(void*);  };  typedef struct lib_init_sturct lib_init_s;    b) we can install the following func to install the function to the section  #define LIB_INIT_ENTRY(__name, _id, _p_id, _call_func) \   static int _call_func(void* ptr); \   lib_init_s __name \ ERIC_TAB_ENTRY(eric_lib_init_table) = \   {        .id   = _id, \        .p_id   = _p_id, \        .call_func  = _call_func   }  such as: LIB_INIT_ENTRY(eric_table, 0x600, 0x20, eric_initiate_hw)    (3) how to use the call the function in the section  1)we can define the following datastruct to define the section.  ERIC_TABLE_BEGIN(_lib_init_table, eric_lib_init_table);  ERIC_TABLE_END(_lib_init_table_end, eric_lib_init_table);  extern lib_init_s _lib_init_table[];  extern lib_init_s _lib_init_table_end[];    2)we can use the following codes to call the entry that installed in the section  int init_eric_lib(unsigned int lib_id,  unsigned int product_id, void* ptr)  {       lib_init_s* init = NULL;       int result = -1;       for (init = &_lib_init_table[0]; init != (lib_init_s*)&_lib_init_table_end; init++)       {            if (product_id == init->prod_id && lib_id == init->lib_id)           {                 result = init->call_func(ptr);                 break;           }       }       return result;  }

    最新回复(0)