C语言中__attribute((section(name)))简单示例

[复制链接]
 楼主| keer_zu 发表于 2021-7-19 10:24 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2021-7-19 10:27 编辑

linux下使用readelf -S prog, 可以看到一张elf格式的表。表中以.开头的是一个一个的段。 __attribute((section(name)))的作用就是将被该属性修饰的符号都放到名为name的段中。

示例代码main.c中的_func1与_func2被__section宏修饰,最终都会被放到自定义的名为.app_init_sec段中。

  1. #include <stdio.h>
  2. #include <string.h>

  3. #define __section __attribute((section(".app_init_sec")))

  4. typedef struct init_t{
  5.         int (*func)(void);
  6.         char *name;
  7. }_init_t;

  8. _init_t __app_init_start__;
  9. _init_t __app_init_end__;

  10. static int func1(void)
  11. {
  12.         printf("call %s\n", __FUNCTION__);
  13.         return 0;
  14. }
  15. _init_t _func1 __section = {func1, "func1"};


  16. static int func2(void)
  17. {
  18.         printf("call %s\n", __FUNCTION__);
  19.         return 0;
  20. }
  21. _init_t _func2 __section = {func2, "func2"};

  22. int main(int argc, char **argv)
  23. {
  24.         _init_t *p;

  25.         for(p = &__app_init_start__; p < &__app_init_end__; p++){
  26.                 printf("==%s\n", p->name);
  27.                 p->func();
  28.         }

  29.         return 0;
  30. }

也许你已经注意到.app_init_sec段尚未定义,且__app_init_start__与__app_init_end__未做初始化就直接使用了。这是因为这些工作都是在一个.lds格式的文件中完成的。一个简单的.lds文件内容如下所示:


  1. //script.lds
  2. SECTIONS
  3. {
  4.     . = ALIGN(16);
  5.     __app_init_start__ = .;
  6.     .app_init_sec : { *(.app_init_sec) }
  7.     __app_init_end__ = .;
  8. }
  9. INSERT AFTER .rodata

为了编译出可执行的文件,需要运行如下的命令:


gcc main.c -T script.lds -g -o prog



运行程序prog, 输出如下所示:


  1. zkq@zkq-VirtualBox:~/src/test/src$ ./prog
  2. ==func1
  3. call func1
  4. ==func2
  5. call func2

运行命令readelf -S prog查看elf表,可以在.rodata后找到自定义的.app_init_sec段:

  1. zkq@zkq-VirtualBox:~/src/test/src$ readelf -S prog
  2. There are 37 section headers, starting at offset 0x202058:

  3. Section Headers:
  4.   [Nr] Name              Type             Address           Offset
  5.        Size              EntSize          Flags  Link  Info  Align
  6.   [ 0]                   NULL             0000000000000000  00000000
  7.        0000000000000000  0000000000000000           0     0     0
  8.   [ 1] .interp           PROGBITS         00000000004001c8  000001c8
  9.        000000000000001c  0000000000000000   A       0     0     1
  10.   [ 2] .note.ABI-tag     NOTE             00000000004001e4  000001e4
  11.        0000000000000020  0000000000000000   A       0     0     4
  12.   [ 3] .note.gnu.build-i NOTE             0000000000400204  00000204
  13.        0000000000000024  0000000000000000   A       0     0     4
  14.   [ 4] .gnu.hash         GNU_HASH         0000000000400228  00000228
  15.        000000000000001c  0000000000000000   A       5     0     8
  16.   [ 5] .dynsym           DYNSYM           0000000000400248  00000248
  17.        0000000000000060  0000000000000018   A       6     1     8
  18.   [ 6] .dynstr           STRTAB           00000000004002a8  000002a8
  19.        000000000000003f  0000000000000000   A       0     0     1
  20.   [ 7] .gnu.version      VERSYM           00000000004002e8  000002e8
  21.        0000000000000008  0000000000000002   A       5     0     2
  22.   [ 8] .gnu.version_r    VERNEED          00000000004002f0  000002f0
  23.        0000000000000020  0000000000000000   A       6     1     8
  24.   [ 9] .rela.dyn         RELA             0000000000400310  00000310
  25.        0000000000000018  0000000000000018   A       5     0     8
  26.   [10] .rela.plt         RELA             0000000000400328  00000328
  27.        0000000000000030  0000000000000018  AI       5    25     8
  28.   [11] .init             PROGBITS         0000000000400358  00000358
  29.        000000000000001a  0000000000000000  AX       0     0     4
  30.   [12] .plt              PROGBITS         0000000000400380  00000380
  31.        0000000000000030  0000000000000010  AX       0     0     16
  32.   [13] .plt.got          PROGBITS         00000000004003b0  000003b0
  33.        0000000000000008  0000000000000000  AX       0     0     8
  34.   [14] .text             PROGBITS         00000000004003c0  000003c0
  35.        0000000000000202  0000000000000000  AX       0     0     16
  36.   [15] .fini             PROGBITS         00000000004005c4  000005c4
  37.        0000000000000009  0000000000000000  AX       0     0     4
  38.   [16] .rodata           PROGBITS         00000000004005d0  000005d0
  39.        000000000000002b  0000000000000000   A       0     0     4
  40.   [17] .app_init_sec     PROGBITS         0000000000400600  00000600
  41.        0000000000000020  0000000000000000  WA       0     0     16
  42.   [18] .eh_frame_hdr     PROGBITS         0000000000400620  00000620
  43.        0000000000000044  0000000000000000   A       0     0     4
  44.   [19] .eh_frame         PROGBITS         0000000000400668  00000668
  45.        0000000000000134  0000000000000000   A       0     0     8
  46.   [20] .init_array       INIT_ARRAY       0000000000600e10  00200e10
  47.        0000000000000008  0000000000000000  WA       0     0     8
  48.   [21] .fini_array       FINI_ARRAY       0000000000600e18  00200e18
  49.        0000000000000008  0000000000000000  WA       0     0     8
  50.   [22] .jcr              PROGBITS         0000000000600e20  00200e20
  51.        0000000000000008  0000000000000000  WA       0     0     8
  52.   [23] .dynamic          DYNAMIC          0000000000600e28  00200e28
  53.        00000000000001d0  0000000000000010  WA       6     0     8
  54.   [24] .got              PROGBITS         0000000000600ff8  00200ff8
  55.        0000000000000008  0000000000000008  WA       0     0     8
  56.   [25] .got.plt          PROGBITS         0000000000601000  00201000
  57.        0000000000000028  0000000000000008  WA       0     0     8
  58.   [26] .data             PROGBITS         0000000000601028  00201028
  59.        0000000000000010  0000000000000000  WA       0     0     8
  60.   [27] .bss              NOBITS           0000000000601038  00201038
  61.        0000000000000008  0000000000000000  WA       0     0     1
  62.   [28] .comment          PROGBITS         0000000000000000  00201038
  63.        0000000000000035  0000000000000001  MS       0     0     1
  64.   [29] .debug_aranges    PROGBITS         0000000000000000  0020106d
  65.        0000000000000030  0000000000000000           0     0     1
  66.   [30] .debug_info       PROGBITS         0000000000000000  0020109d
  67.        00000000000001e8  0000000000000000           0     0     1
  68.   [31] .debug_abbrev     PROGBITS         0000000000000000  00201285
  69.        00000000000000f2  0000000000000000           0     0     1
  70.   [32] .debug_line       PROGBITS         0000000000000000  00201377
  71.        0000000000000061  0000000000000000           0     0     1
  72.   [33] .debug_str        PROGBITS         0000000000000000  002013d8
  73.        0000000000000120  0000000000000001  MS       0     0     1
  74.   [34] .shstrtab         STRTAB           0000000000000000  00201efe
  75.        000000000000015a  0000000000000000           0     0     1
  76.   [35] .symtab           SYMTAB           0000000000000000  002014f8
  77.        0000000000000798  0000000000000018          36    57     8
  78.   [36] .strtab           STRTAB           0000000000000000  00201c90
  79.        000000000000026e  0000000000000000           0     0     1
  80. Key to Flags:
  81.   W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  82.   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  83.   O (extra OS processing required) o (OS specific), p (processor specific)

 楼主| keer_zu 发表于 2021-7-19 10:35 | 显示全部楼层
一个rt-thread中的实例:

components.c
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2012-09-20     Bernard      Change the name to components.c
  9. *                             And all components related header files.
  10. * 2012-12-23     Bernard      fix the pthread initialization issue.
  11. * 2013-06-23     Bernard      Add the init_call for components initialization.
  12. * 2013-07-05     Bernard      Remove initialization feature for MS VC++ compiler
  13. * 2015-02-06     Bernard      Remove the MS VC++ support and move to the kernel
  14. * 2015-05-04     Bernard      Rename it to components.c because compiling issue
  15. *                             in some IDEs.
  16. * 2015-07-29     Arda.Fu      Add support to use RT_USING_USER_MAIN with IAR
  17. */

  18. #include <rthw.h>
  19. #include <rtthread.h>

  20. #ifdef RT_USING_USER_MAIN
  21. #ifndef RT_MAIN_THREAD_STACK_SIZE
  22. #define RT_MAIN_THREAD_STACK_SIZE     2048
  23. #endif
  24. #ifndef RT_MAIN_THREAD_PRIORITY
  25. #define RT_MAIN_THREAD_PRIORITY       (RT_THREAD_PRIORITY_MAX / 3)
  26. #endif
  27. #endif

  28. #ifdef RT_USING_COMPONENTS_INIT
  29. /*
  30. * Components Initialization will initialize some driver and components as following
  31. * order:
  32. * rti_start         --> 0
  33. * BOARD_EXPORT      --> 1
  34. * rti_board_end     --> 1.end
  35. *
  36. * DEVICE_EXPORT     --> 2
  37. * COMPONENT_EXPORT  --> 3
  38. * FS_EXPORT         --> 4
  39. * ENV_EXPORT        --> 5
  40. * APP_EXPORT        --> 6
  41. *
  42. * rti_end           --> 6.end
  43. *
  44. * These automatically initialization, the driver or component initial function must
  45. * be defined with:
  46. * INIT_BOARD_EXPORT(fn);
  47. * INIT_DEVICE_EXPORT(fn);
  48. * ...
  49. * INIT_APP_EXPORT(fn);
  50. * etc.
  51. */
  52. static int rti_start(void)
  53. {
  54.     return 0;
  55. }
  56. INIT_EXPORT(rti_start, "0");

  57. static int rti_board_start(void)
  58. {
  59.     return 0;
  60. }
  61. INIT_EXPORT(rti_board_start, "0.end");

  62. static int rti_board_end(void)
  63. {
  64.     return 0;
  65. }
  66. INIT_EXPORT(rti_board_end, "1.end");

  67. static int rti_end(void)
  68. {
  69.     return 0;
  70. }
  71. INIT_EXPORT(rti_end, "6.end");

  72. /**
  73. * RT-Thread Components Initialization for board
  74. */
  75. void rt_components_board_init(void)
  76. {
  77. #if RT_DEBUG_INIT
  78.     int result;
  79.     const struct rt_init_desc *desc;
  80.     for (desc = &__rt_init_desc_rti_board_start; desc < &__rt_init_desc_rti_board_end; desc ++)
  81.     {
  82.         rt_kprintf("initialize %s", desc->fn_name);
  83.         result = desc->fn();
  84.         rt_kprintf(":%d done\n", result);
  85.     }
  86. #else
  87.     const init_fn_t *fn_ptr;

  88.     for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++)
  89.     {
  90.         (*fn_ptr)();
  91.     }
  92. #endif
  93. }

  94. /**
  95. * RT-Thread Components Initialization
  96. */
  97. void rt_components_init(void)
  98. {
  99. #if RT_DEBUG_INIT
  100.     int result;
  101.     const struct rt_init_desc *desc;

  102.     rt_kprintf("do components initialization.\n");
  103.     for (desc = &__rt_init_desc_rti_board_end; desc < &__rt_init_desc_rti_end; desc ++)
  104.     {
  105.         rt_kprintf("initialize %s", desc->fn_name);
  106.         result = desc->fn();
  107.         rt_kprintf(":%d done\n", result);
  108.     }
  109. #else
  110.     const init_fn_t *fn_ptr;

  111.     for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++)
  112.     {
  113.         (*fn_ptr)();
  114.     }
  115. #endif
  116. }

  117. #ifdef RT_USING_USER_MAIN

  118. void rt_application_init(void);
  119. void rt_hw_board_init(void);
  120. int rtthread_startup(void);

  121. #if defined(__CC_ARM) || defined(__CLANG_ARM)
  122. extern int $Super$main(void);
  123. /* re-define main function */
  124. int $Sub$main(void)
  125. {
  126.     rtthread_startup();
  127.     return 0;
  128. }
  129. #elif defined(__ICCARM__)
  130. extern int main(void);
  131. /* __low_level_init will auto called by IAR cstartup */
  132. extern void __iar_data_init3(void);
  133. int __low_level_init(void)
  134. {
  135.     // call IAR table copy function.
  136.     __iar_data_init3();
  137.     rtthread_startup();
  138.     return 0;
  139. }
  140. #elif defined(__GNUC__)
  141. extern int main(void);
  142. /* Add -eentry to arm-none-eabi-gcc argument */
  143. int entry(void)
  144. {
  145.     rtthread_startup();
  146.     return 0;
  147. }
  148. #endif

  149. #ifndef RT_USING_HEAP
  150. /* if there is not enable heap, we should use static thread and stack. */
  151. ALIGN(8)
  152. static rt_uint8_t main_stack[RT_MAIN_THREAD_STACK_SIZE];
  153. struct rt_thread main_thread;
  154. #endif

  155. /* the system main thread */
  156. void main_thread_entry(void *parameter)
  157. {
  158.     extern int main(void);
  159.     extern int $Super$main(void);

  160.     /* RT-Thread components initialization */
  161.     rt_components_init();

  162.     /* invoke system main function */
  163. #if defined(__CC_ARM) || defined(__CLANG_ARM)
  164.     $Super$main(); /* for ARMCC. */
  165. #elif defined(__ICCARM__) || defined(__GNUC__)
  166.     main();
  167. #endif
  168. }

  169. void rt_application_init(void)
  170. {
  171.     rt_thread_t tid;

  172. #ifdef RT_USING_HEAP
  173.     tid = rt_thread_create("main", main_thread_entry, RT_NULL,
  174.                            RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
  175.     RT_ASSERT(tid != RT_NULL);
  176. #else
  177.     rt_err_t result;

  178.     tid = &main_thread;
  179.     result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,
  180.                             main_stack, sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);
  181.     RT_ASSERT(result == RT_EOK);
  182.        
  183.     /* if not define RT_USING_HEAP, using to eliminate the warning */
  184.     (void)result;
  185. #endif

  186.     rt_thread_startup(tid);
  187. }

  188. int rtthread_startup(void)
  189. {
  190.     rt_hw_interrupt_disable();

  191.     /* board level initialization
  192.      * NOTE: please initialize heap inside board initialization.
  193.      */
  194.     rt_hw_board_init();

  195.     /* show RT-Thread version */
  196.     rt_show_version();

  197.     /* timer system initialization */
  198.     rt_system_timer_init();

  199.     /* scheduler system initialization */
  200.     rt_system_scheduler_init();

  201. #ifdef RT_USING_SIGNALS
  202.     /* signal system initialization */
  203.     rt_system_signal_init();
  204. #endif

  205.     /* create init_thread */
  206.     rt_application_init();

  207.     /* timer thread initialization */
  208.     rt_system_timer_thread_init();

  209.     /* idle thread initialization */
  210.     rt_thread_idle_init();

  211.     /* start scheduler */
  212.     rt_system_scheduler_start();

  213.     /* never reach here */
  214.     return 0;
  215. }
  216. #endif
  217. #endif
 楼主| keer_zu 发表于 2021-7-19 10:35 | 显示全部楼层
本帖最后由 keer_zu 于 2021-7-19 10:36 编辑

一个rt-thread中的实例:

components.c:

  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2012-09-20     Bernard      Change the name to components.c
  9. *                             And all components related header files.
  10. * 2012-12-23     Bernard      fix the pthread initialization issue.
  11. * 2013-06-23     Bernard      Add the init_call for components initialization.
  12. * 2013-07-05     Bernard      Remove initialization feature for MS VC++ compiler
  13. * 2015-02-06     Bernard      Remove the MS VC++ support and move to the kernel
  14. * 2015-05-04     Bernard      Rename it to components.c because compiling issue
  15. *                             in some IDEs.
  16. * 2015-07-29     Arda.Fu      Add support to use RT_USING_USER_MAIN with IAR
  17. */

  18. #include <rthw.h>
  19. #include <rtthread.h>

  20. #ifdef RT_USING_USER_MAIN
  21. #ifndef RT_MAIN_THREAD_STACK_SIZE
  22. #define RT_MAIN_THREAD_STACK_SIZE     2048
  23. #endif
  24. #ifndef RT_MAIN_THREAD_PRIORITY
  25. #define RT_MAIN_THREAD_PRIORITY       (RT_THREAD_PRIORITY_MAX / 3)
  26. #endif
  27. #endif

  28. #ifdef RT_USING_COMPONENTS_INIT
  29. /*
  30. * Components Initialization will initialize some driver and components as following
  31. * order:
  32. * rti_start         --> 0
  33. * BOARD_EXPORT      --> 1
  34. * rti_board_end     --> 1.end
  35. *
  36. * DEVICE_EXPORT     --> 2
  37. * COMPONENT_EXPORT  --> 3
  38. * FS_EXPORT         --> 4
  39. * ENV_EXPORT        --> 5
  40. * APP_EXPORT        --> 6
  41. *
  42. * rti_end           --> 6.end
  43. *
  44. * These automatically initialization, the driver or component initial function must
  45. * be defined with:
  46. * INIT_BOARD_EXPORT(fn);
  47. * INIT_DEVICE_EXPORT(fn);
  48. * ...
  49. * INIT_APP_EXPORT(fn);
  50. * etc.
  51. */
  52. static int rti_start(void)
  53. {
  54.     return 0;
  55. }
  56. INIT_EXPORT(rti_start, "0");

  57. static int rti_board_start(void)
  58. {
  59.     return 0;
  60. }
  61. INIT_EXPORT(rti_board_start, "0.end");

  62. static int rti_board_end(void)
  63. {
  64.     return 0;
  65. }
  66. INIT_EXPORT(rti_board_end, "1.end");

  67. static int rti_end(void)
  68. {
  69.     return 0;
  70. }
  71. INIT_EXPORT(rti_end, "6.end");

  72. /**
  73. * RT-Thread Components Initialization for board
  74. */
  75. void rt_components_board_init(void)
  76. {
  77. #if RT_DEBUG_INIT
  78.     int result;
  79.     const struct rt_init_desc *desc;
  80.     for (desc = &__rt_init_desc_rti_board_start; desc < &__rt_init_desc_rti_board_end; desc ++)
  81.     {
  82.         rt_kprintf("initialize %s", desc->fn_name);
  83.         result = desc->fn();
  84.         rt_kprintf(":%d done\n", result);
  85.     }
  86. #else
  87.     const init_fn_t *fn_ptr;

  88.     for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++)
  89.     {
  90.         (*fn_ptr)();
  91.     }
  92. #endif
  93. }

  94. /**
  95. * RT-Thread Components Initialization
  96. */
  97. void rt_components_init(void)
  98. {
  99. #if RT_DEBUG_INIT
  100.     int result;
  101.     const struct rt_init_desc *desc;

  102.     rt_kprintf("do components initialization.\n");
  103.     for (desc = &__rt_init_desc_rti_board_end; desc < &__rt_init_desc_rti_end; desc ++)
  104.     {
  105.         rt_kprintf("initialize %s", desc->fn_name);
  106.         result = desc->fn();
  107.         rt_kprintf(":%d done\n", result);
  108.     }
  109. #else
  110.     const init_fn_t *fn_ptr;

  111.     for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++)
  112.     {
  113.         (*fn_ptr)();
  114.     }
  115. #endif
  116. }

  117. #ifdef RT_USING_USER_MAIN

  118. void rt_application_init(void);
  119. void rt_hw_board_init(void);
  120. int rtthread_startup(void);

  121. #if defined(__CC_ARM) || defined(__CLANG_ARM)
  122. extern int $Super$main(void);
  123. /* re-define main function */
  124. int $Sub$main(void)
  125. {
  126.     rtthread_startup();
  127.     return 0;
  128. }
  129. #elif defined(__ICCARM__)
  130. extern int main(void);
  131. /* __low_level_init will auto called by IAR cstartup */
  132. extern void __iar_data_init3(void);
  133. int __low_level_init(void)
  134. {
  135.     // call IAR table copy function.
  136.     __iar_data_init3();
  137.     rtthread_startup();
  138.     return 0;
  139. }
  140. #elif defined(__GNUC__)
  141. extern int main(void);
  142. /* Add -eentry to arm-none-eabi-gcc argument */
  143. int entry(void)
  144. {
  145.     rtthread_startup();
  146.     return 0;
  147. }
  148. #endif

  149. #ifndef RT_USING_HEAP
  150. /* if there is not enable heap, we should use static thread and stack. */
  151. ALIGN(8)
  152. static rt_uint8_t main_stack[RT_MAIN_THREAD_STACK_SIZE];
  153. struct rt_thread main_thread;
  154. #endif

  155. /* the system main thread */
  156. void main_thread_entry(void *parameter)
  157. {
  158.     extern int main(void);
  159.     extern int $Super$main(void);

  160.     /* RT-Thread components initialization */
  161.     rt_components_init();

  162.     /* invoke system main function */
  163. #if defined(__CC_ARM) || defined(__CLANG_ARM)
  164.     $Super$main(); /* for ARMCC. */
  165. #elif defined(__ICCARM__) || defined(__GNUC__)
  166.     main();
  167. #endif
  168. }

  169. void rt_application_init(void)
  170. {
  171.     rt_thread_t tid;

  172. #ifdef RT_USING_HEAP
  173.     tid = rt_thread_create("main", main_thread_entry, RT_NULL,
  174.                            RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
  175.     RT_ASSERT(tid != RT_NULL);
  176. #else
  177.     rt_err_t result;

  178.     tid = &main_thread;
  179.     result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,
  180.                             main_stack, sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);
  181.     RT_ASSERT(result == RT_EOK);
  182.        
  183.     /* if not define RT_USING_HEAP, using to eliminate the warning */
  184.     (void)result;
  185. #endif

  186.     rt_thread_startup(tid);
  187. }

  188. int rtthread_startup(void)
  189. {
  190.     rt_hw_interrupt_disable();

  191.     /* board level initialization
  192.      * NOTE: please initialize heap inside board initialization.
  193.      */
  194.     rt_hw_board_init();

  195.     /* show RT-Thread version */
  196.     rt_show_version();

  197.     /* timer system initialization */
  198.     rt_system_timer_init();

  199.     /* scheduler system initialization */
  200.     rt_system_scheduler_init();

  201. #ifdef RT_USING_SIGNALS
  202.     /* signal system initialization */
  203.     rt_system_signal_init();
  204. #endif

  205.     /* create init_thread */
  206.     rt_application_init();

  207.     /* timer thread initialization */
  208.     rt_system_timer_thread_init();

  209.     /* idle thread initialization */
  210.     rt_thread_idle_init();

  211.     /* start scheduler */
  212.     rt_system_scheduler_start();

  213.     /* never reach here */
  214.     return 0;
  215. }
  216. #endif
  217. #endif



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

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1477

主题

12909

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部