From cbfb87fac1020380eca3b15b32ea738820059007 Mon Sep 17 00:00:00 2001 From: qiuyiuestc Date: Mon, 12 Apr 2010 17:37:37 +0000 Subject: [PATCH] add module feature git-svn-id: https://rt-thread.googlecode.com/svn/trunk@614 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- bsp/mini2440/SConstruct | 5 +- bsp/mini2440/mini2440_ram.ld | 6 + bsp/mini2440/network.xpm | 172 +++++++++++++ bsp/mini2440/network_disconnect.xpm | 98 +++++++ bsp/mini2440/osc.c | 131 ++++++++++ bsp/mini2440/osc.o | Bin 0 -> 22812 bytes bsp/mini2440/picture.c | 300 ++++++++++++++++++++++ bsp/mini2440/picture.h | 8 + bsp/mini2440/rtconfig.h | 10 +- bsp/mini2440/run_module.c | 41 +++ bsp/mini2440/startup.c | 5 + bsp/mini2440/today.c | 213 +++++++++++++++ bsp/mini2440/touch.c | 13 +- components/hello/hello.c | 20 +- components/hello/mk.bat | 3 + components/thread/mk.bat | 3 + components/thread/module_thread_dynamic.c | 6 +- finsh/cmd.c | 22 ++ src/kservice.c | 5 - src/module.c | 32 ++- src/object.c | 10 + src/rtm.c | 36 +++ src/scheduler.c | 8 + src/thread.c | 32 +-- 24 files changed, 1128 insertions(+), 51 deletions(-) create mode 100644 bsp/mini2440/network.xpm create mode 100644 bsp/mini2440/network_disconnect.xpm create mode 100644 bsp/mini2440/osc.c create mode 100644 bsp/mini2440/osc.o create mode 100644 bsp/mini2440/picture.c create mode 100644 bsp/mini2440/picture.h create mode 100644 bsp/mini2440/run_module.c create mode 100644 bsp/mini2440/today.c create mode 100644 components/hello/mk.bat create mode 100644 components/thread/mk.bat create mode 100644 src/rtm.c diff --git a/bsp/mini2440/SConstruct b/bsp/mini2440/SConstruct index f93b4acd33..8d6ae425bd 100644 --- a/bsp/mini2440/SConstruct +++ b/bsp/mini2440/SConstruct @@ -42,7 +42,10 @@ if rtconfig.RT_USING_RTGUI: objs = objs + SConscript(RTT_ROOT + '/rtgui/SConscript', variant_dir='build/rtgui', duplicate=0) objs = objs + SConscript(RTT_ROOT + '/examples/gui/SConscript', variant_dir='build/examples/gui', duplicate=0) -src_bsp = ['application.c', 'startup.c', 'board.c', 'rtc_calendar.c' ] +if rtconfig.RT_USING_MODBUS: + objs = objs + SConscript(RTT_ROOT + '/net/freemodbus/SConscript', variant_dir='build/net/freemodbus', duplicate=0) + +src_bsp = ['application.c', 'startup.c', 'board.c', 'rtc_calendar.c', 'info.c', 'today.c', 'picture.c', 'osc.c', 'device_info.c', 'run_module.c'] src_drv = ['console.c', 'led.c'] if rtconfig.RT_USING_DFS: diff --git a/bsp/mini2440/mini2440_ram.ld b/bsp/mini2440/mini2440_ram.ld index 95856f2688..9eb287ffd6 100644 --- a/bsp/mini2440/mini2440_ram.ld +++ b/bsp/mini2440/mini2440_ram.ld @@ -22,6 +22,12 @@ SECTIONS KEEP(*(VSymTab)) __vsymtab_end = .; . = ALIGN(4); + + /* section information for modules */ + . = ALIGN(4); + __rtmsymtab_start = .; + KEEP(*(RTMSymTab)) + __rtmsymtab_end = .; } . = ALIGN(4); diff --git a/bsp/mini2440/network.xpm b/bsp/mini2440/network.xpm new file mode 100644 index 0000000000..6e47ce1fa6 --- /dev/null +++ b/bsp/mini2440/network.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static char * network_xpm[] = { +"24 24 145 2", +" c None", +". c #6C6E6A", +"+ c #676965", +"@ c #6B6D6A", +"# c #C6C8C4", +"$ c #F0F1F0", +"% c #F1F1F0", +"& c #C8CAC6", +"* c #646662", +"= c #446795", +"- c #27508B", +"; c #2A538D", +"> c #2E558F", +", c #315890", +"' c #355B92", +") c #385E94", +"! c #3C6196", +"~ c #5C7BA2", +"{ c #F2F3F2", +"] c #626460", +"^ c #F2F2F2", +"/ c #3E6297", +"( c #86ACD5", +"_ c #88AED6", +": c #8BB0D7", +"< c #8DB1D7", +"[ c #8CB1D7", +"} c #8CB0D6", +"| c #8DAED6", +"1 c #5B7AA7", +"2 c #F4F4F4", +"3 c #61635F", +"4 c #30578F", +"5 c #88ADD6", +"6 c #8EB1D7", +"7 c #92B3D8", +"8 c #96B6D8", +"9 c #92B2D6", +"0 c #8CADD3", +"a c #84A7CF", +"b c #5F615D", +"c c #204A87", +"d c #6694C7", +"e c #6391C5", +"f c #618FC3", +"g c #5E8CC1", +"h c #5B8ABF", +"i c #5887BD", +"j c #5684BB", +"k c #5D5F5B", +"l c #5D8CC0", +"m c #5A89BE", +"n c #5886BD", +"o c #5584BB", +"p c #5281B9", +"q c #4F7FB7", +"r c #4D7CB5", +"s c #5C5E5A", +"t c #5482BA", +"u c #5180B8", +"v c #4F7EB6", +"w c #4C7BB4", +"x c #4979B2", +"y c #4676B1", +"z c #4373AF", +"A c #5A5C58", +"B c #406492", +"C c #31527F", +"D c #656D70", +"E c #5E605B", +"F c #C3C4C1", +"G c #80827F", +"H c #C8CAC7", +"I c #545651", +"J c #5E605C", +"K c #6A6E68", +"L c #72756F", +"M c #7B7E79", +"N c #848781", +"O c #8D908A", +"P c #969993", +"Q c #9FA29C", +"R c #416593", +"S c #244E89", +"T c #29518C", +"U c #2D558E", +"V c #325991", +"W c #375C93", +"X c #3B6096", +"Y c #5D7BA3", +"Z c #555753", +"` c #D0D2CE", +" . c #BBBEB7", +".. c #BABDB6", +"+. c #F2F2F1", +"@. c #345A92", +"#. c #81A8D3", +"$. c #83ABD4", +"%. c #8AAFD6", +"&. c #8FB3D8", +"*. c #92B4DA", +"=. c #5978A6", +"-. c #D2D4D1", +";. c #2C548E", +">. c #85ACD5", +",. c #92B5DA", +"'. c #98B9DB", +"). c #95B6DA", +"!. c #90B2D7", +"~. c #88ACD3", +"{. c #464644", +"]. c #719ECE", +"^. c #6E9BCC", +"/. c #6A98C9", +"(. c #6794C7", +"_. c #608EC2", +":. c #5C8BC0", +"<. c #757773", +"[. c #DADAD9", +"}. c #6391C4", +"|. c #5F8DC2", +"1. c #5C8ABF", +"2. c #5181B8", +"3. c #7F817C", +"4. c #ECECEA", +"5. c #5B89BF", +"6. c #5483BA", +"7. c #4D7DB6", +"8. c #4A7AB3", +"9. c #4776B1", +"0. c #80827D", +"a. c #EEEEEC", +"b. c #3F6392", +"c. c #82847F", +"d. c #848680", +"e. c #7F817D", +"f. c #7D7F7B", +"g. c #666863", +"h. c #A8ACA5", +"i. c #B1B3AC", +"j. c #E1E1DE", +"k. c #EDEDEB", +"l. c #E0E0DE", +"m. c #565854", +"n. c #767874", +" ", +" . + + + + + + + + + . ", +" @ # $ % % % % % % % $ & @ ", +" * $ = - ; > , ' ) ! ~ { * ", +" ] ^ / ( _ : < [ } | 1 2 ] ", +" 3 % 4 5 6 7 8 9 0 a ) % 3 ", +" b % c d e f g h i j c % b ", +" k % c l m n o p q r c % k ", +" s % c t u v w x y z c % s ", +" A $ B c c c c c c C D + + + + + + + + + . ", +" E F $ % % % % % % G # $ % % % % % % % $ H @ ", +" I J K L M N O P Q * $ R c S T U V W X Y { * ", +" Z ` .............] +.@.#.$.( %.[ &.*.=.2 ] ", +" Z -.+.+.+.+.+.+.+.3 % ;.>.: ,.'.).!.~.W % 3 ", +" {.Z Z Z Z Z Z Z Z b % c ].^./.(.e _.:.c % b ", +" <.[.<. k % c d }.|.1.i o 2.c % k ", +" 3.4.3. s % c 5.i 6.u 7.8.9.c % s ", +" 0.a.0. A $ B c c c c c c c b.$ A ", +" c...c. E F $ % % % % % % % $ F E ", +" 0.a.0.d.0.e.f.g.J K L M N O P Q h.i.J I ", +" 0.j.a...a.k.l.m.` ............... .` Z ", +" 0.0.c.0.3.n.Z -.+.+.+.+.+.+.+.+.+.-.Z ", +" {.Z Z Z Z Z Z Z Z Z Z Z {. ", +" "}; diff --git a/bsp/mini2440/network_disconnect.xpm b/bsp/mini2440/network_disconnect.xpm new file mode 100644 index 0000000000..4b9ba17e15 --- /dev/null +++ b/bsp/mini2440/network_disconnect.xpm @@ -0,0 +1,98 @@ +/* XPM */ +static char * network_disconnect_xpm[] = { +"24 24 71 1", +" c None", +". c #191918", +"+ c #181817", +"@ c #808080", +"# c #EDEDED", +"$ c #6B6B6A", +"% c #161615", +"& c #D8D8D8", +"* c #484848", +"= c #A4A4A4", +"- c #E6E6E6", +"; c #F3F3F3", +"> c #F5F5F6", +", c #C0C0C5", +"' c #F3F3F4", +") c #F0F0F0", +"! c #B7B4C3", +"~ c #B7B5C4", +"{ c #F5F5F5", +"] c #A19DB2", +"^ c #EEEEEE", +"/ c #B6B4C3", +"( c #B7B5C3", +"_ c #B3B1C1", +": c #B5B3C1", +"< c #EAEAEB", +"[ c #EFEFEF", +"} c #A19EB2", +"| c #A09CB1", +"1 c #928FA2", +"2 c #676571", +"3 c #D3D3D3", +"4 c #2A2A2A", +"5 c #090909", +"6 c #8B8B8B", +"7 c #0F0F0E", +"8 c #2A2A29", +"9 c #70706F", +"0 c #898988", +"a c #A8A8A8", +"b c #0E0E0D", +"c c #D1D1D1", +"d c #ECECEC", +"e c #EBEBEB", +"f c #D9D9D9", +"g c #C1C1C1", +"h c #B7B7B7", +"i c #BCBCBC", +"j c #141413", +"k c #7F7F7E", +"l c #B6B6B5", +"m c #C8C8C7", +"n c #C0C0C0", +"o c #949494", +"p c #E5E5E5", +"q c #5D5D5C", +"r c #242423", +"s c #9A9A99", +"t c #C8C8C8", +"u c #C5C5C5", +"v c #E8E8E8", +"w c #BABABA", +"x c #DEDEDE", +"y c #D5D5D5", +"z c #C2C2C2", +"A c #B3B3B3", +"B c #909090", +"C c #B6B6B6", +"D c #C4C4C4", +"E c #1F1F1D", +"F c #000000", +" ", +" .........+ ", +" +@#########$% ", +" .#&*******=-. ", +" .;*>,,>,,'*). ", +" .)*!~~~>{]*). ", +" .^*/(_:<<]*[. ", +" .^*}}|}<<]*^. ", +" .#*]]]]]12.........+ ", +" .;3*****4@#########$% ", +" 56######.#&*******=-. ", +" 7890aaaa.;*>,,>,,'*). ", +" b;)cdeee.)*!~~~>{]*). ", +" bfghiiii.^*/(_:<<]*[. ", +" j........^*}}|}<<]*^. ", +" klk .#*]]]]]]]*#. ", +" kmk .;3*******n#. ", +" k3k 56#########o. ", +" kpk 7890aaaa09q.r ", +" kpskkkkb;)cdeeetuuv. ", +" kwxyzABbfghiiiiCcyD. ", +" kkkkkkE...........F ", +" ", +" "}; diff --git a/bsp/mini2440/osc.c b/bsp/mini2440/osc.c new file mode 100644 index 0000000000..b2cd90439a --- /dev/null +++ b/bsp/mini2440/osc.c @@ -0,0 +1,131 @@ +#include +#include +#include + +#include +#include + +#define POINT_LENGTH 320 +static rt_uint8_t points[POINT_LENGTH]; +static rt_uint8_t old_point, fudu = 1; +static rt_uint16_t current_point = 0; + +static rtgui_view_t *osc_view = RT_NULL; +static rtgui_timer_t *osc_timer; + +#include + +void osc_timeout(struct rtgui_timer* timer, void* parameter) +{ + struct rtgui_dc* dc; + rtgui_color_t saved; + const double PI=3.141592653589793238462643383279; + + dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(osc_view)); + if (dc == RT_NULL) return ; + + saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)); + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)) = + RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(osc_view)); + if (current_point != 0) + rtgui_dc_draw_line(dc, current_point - 1, old_point, current_point, points[current_point]); + else + rtgui_dc_draw_point(dc, current_point, points[current_point]); + + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)) = saved; + + old_point = points[current_point]; + points[current_point] = 100 * sin((current_point * 4 * fudu) * PI / POINT_LENGTH) + 100; + if (current_point != 0) + rtgui_dc_draw_line(dc, current_point - 1, points[current_point - 1], current_point, points[current_point]); + else + rtgui_dc_draw_point(dc, current_point, points[current_point]); + + current_point ++; + if (current_point == POINT_LENGTH) + { + current_point = 0; + fudu ++; + if (fudu == 4) fudu = 1; + } + + rtgui_dc_end_drawing(dc); +} + +static rt_bool_t osc_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) +{ + switch (event->type) + { + case RTGUI_EVENT_PAINT: + { + struct rtgui_dc* dc; + struct rtgui_rect rect; + int index; + + dc = rtgui_dc_begin_drawing(widget); + if (dc == RT_NULL) return RT_FALSE; + rtgui_widget_get_rect(widget, &rect); + + rtgui_dc_fill_rect(dc, &rect); + for (index = 0; index < 320; index ++) + rtgui_dc_draw_point(dc, index, points[index]); + rtgui_dc_end_drawing(dc); + + return RT_FALSE; + } + + case RTGUI_EVENT_KBD: + { + struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; + if ((ekbd->type == RTGUI_KEYDOWN) && (ekbd->key == RTGUIK_RETURN)) + { + rtgui_workbench_t* workbench; + + /* stop timer */ + rtgui_timer_destory(osc_timer); + /* clean points */ + rt_memset(points, 0xff, sizeof(points)); + current_point = 0; + + /* close this view */ + workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(osc_view)->parent); + rtgui_workbench_remove_view(workbench, osc_view); + rtgui_view_destroy(osc_view); + + osc_view = RT_NULL; + fudu = 0; + return RT_FALSE; + } + } + } + + return rtgui_view_event_handler(widget, event); +} + +rtgui_view_t *osc_view_create(struct rtgui_workbench* workbench) +{ + if (osc_view != RT_NULL) + { + rtgui_view_show(osc_view, RT_FALSE); + } + else + { + /* create picture view */ + osc_view = rtgui_view_create("Oscilloscope"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(osc_view), + osc_view_event_handler); + + rtgui_workbench_add_view(workbench, osc_view); + /* this view can be focused */ + RTGUI_WIDGET(osc_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + + rt_memset(points, 0xff, sizeof(points)); + + osc_timer = rtgui_timer_create(8, + RT_TIMER_FLAG_PERIODIC, + osc_timeout, RT_NULL); + rtgui_timer_start(osc_timer); + } + + return osc_view; +} diff --git a/bsp/mini2440/osc.o b/bsp/mini2440/osc.o new file mode 100644 index 0000000000000000000000000000000000000000..32a5831fa47f31e98557c0c2ea15f435bc5257f7 GIT binary patch literal 22812 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 +#include +#include + +#include +#include +#include +#include + +enum picture_view_mode +{ + VIEW_SINGLE_MODE, + VIEW_DIR_MODE, + VIEW_FN_LIST_MODE +}; + +static rtgui_view_t* picture_view = RT_NULL; +static enum picture_view_mode view_mode = VIEW_SINGLE_MODE; + +/* current picture file name */ +static char current_fn[32] = {0}; +static const char** picture_fn_list; +static rt_uint8_t picture_fn_list_size, picture_fn_list_current; + +static void picture_show_prev() +{ + DIR* dir; + struct dirent* entry; + rt_bool_t is_last; + char fn[32]; + + fn[0] = '\0'; + is_last = RT_FALSE; + + dir = opendir("/"); + if (dir == RT_NULL) + { + rt_kprintf("open directory failed\n"); + return; + } + + do + { + entry = readdir(dir); + if (entry != RT_NULL) + { + if (strstr(entry->d_name, ".hdc") != RT_NULL || + strstr(entry->d_name, ".HDC") != RT_NULL) + { + /* it's a HDC image */ + if ((strcmp(entry->d_name, current_fn) == 0) && + is_last != RT_TRUE) + { + if (fn[0] == '\0') + { + /* it should be the last image */ + is_last = RT_TRUE; + } + else + { + /* display image */ + strcpy(current_fn, fn); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + closedir(dir); + return; + } + } + strcpy(fn, entry->d_name); + } + } + } while(entry != RT_NULL); + + /* close directory */ + closedir(dir); + + if ((is_last == RT_TRUE) && fn[0] != '\0') + { + strcpy(current_fn, fn); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + } +} + +static void picture_show_next() +{ + DIR* dir; + struct dirent* entry; + rt_bool_t found, has_image; + + found = RT_FALSE; has_image = RT_FALSE; + +__restart: + dir = opendir("/"); + if (dir == RT_NULL) + { + rt_kprintf("open directory failed\n"); + return; + } + + do + { + entry = readdir(dir); + if (entry != RT_NULL) + { + if (strstr(entry->d_name, ".hdc") != RT_NULL || + strstr(entry->d_name, ".HDC") != RT_NULL) + { + /* this directory includes image */ + has_image = RT_TRUE; + + if (found == RT_TRUE || current_fn[0] == '\0') + { + strcpy(current_fn, entry->d_name); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + + closedir(dir); + return; + } + + /* it's a HDC image */ + if (strcmp(entry->d_name, current_fn) == 0) + found = RT_TRUE; + } + } + } while(entry != RT_NULL); + + /* close directory */ + closedir(dir); + + if (has_image != RT_TRUE) return; + current_fn[0] = '\0'; + goto __restart; +} + +static rt_bool_t picture_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) +{ + if (event->type == RTGUI_EVENT_PAINT) + { + struct rtgui_dc* dc; + struct rtgui_rect rect; + struct rtgui_image* image; + char fn[32]; + + dc = rtgui_dc_begin_drawing(widget); + if (dc == RT_NULL) return RT_FALSE; + rtgui_widget_get_rect(widget, &rect); + + /* open image */ + rt_sprintf(fn, "/%s", current_fn); + image = rtgui_image_create_from_file("hdc", + fn, RT_FALSE); + if (image != RT_NULL) + { + /* blit image */ + rtgui_image_blit(image, dc, &rect); + /* destroy image */ + rtgui_image_destroy(image); + } + else + { + rtgui_dc_fill_rect(dc, &rect); + rtgui_dc_draw_text(dc, "没有文件被打开", &rect); + } + rtgui_dc_end_drawing(dc); + + return RT_FALSE; + } + else if (event->type == RTGUI_EVENT_KBD) + { + struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; + if (ekbd->type == RTGUI_KEYDOWN) + { + switch (ekbd->key) + { + case RTGUIK_UP: + if (view_mode == VIEW_DIR_MODE) picture_show_next(); + else if (view_mode == VIEW_FN_LIST_MODE) + { + picture_fn_list_current ++; + if (picture_fn_list_current == picture_fn_list_size) + { + picture_fn_list_current = 0; + } + strcpy(current_fn, picture_fn_list[picture_fn_list_current]); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + } + break; + case RTGUIK_DOWN: + if (view_mode == VIEW_DIR_MODE) picture_show_prev(); + else if (view_mode == VIEW_FN_LIST_MODE) + { + if (picture_fn_list_current == 0) + { + picture_fn_list_current = picture_fn_list_size - 1; + } + else picture_fn_list_current --; + + strcpy(current_fn, picture_fn_list[picture_fn_list_current]); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + } + break; + case RTGUIK_RETURN: + { + rtgui_view_t* view; + rtgui_workbench_t* workbench; + + /* close this view */ + current_fn[0] = '\0'; + + /* remove view in workbench */ + view = RTGUI_VIEW(widget); + workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent); + rtgui_workbench_remove_view(workbench, view); + rtgui_view_destroy(view); + + picture_view = RT_NULL; + } + break; + } + } + return RT_FALSE; + } + + return rtgui_view_event_handler(widget, event); +} + +rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench) +{ + if (picture_view != RT_NULL) + { + rtgui_view_show(picture_view, RT_FALSE); + } + else + { + /* create picture view */ + picture_view = rtgui_view_create("Picture Presentation"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), + picture_view_event_handler); + + rtgui_workbench_add_view(workbench, picture_view); + /* this view can be focused */ + RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + } + + return picture_view; +} + +rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, + const char* filename) +{ + if (picture_view != RT_NULL) + { + rtgui_view_show(picture_view, RT_FALSE); + } + else + { + strcpy(current_fn, filename); + + /* create picture view */ + picture_view = rtgui_view_create("Picture Presentation"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), + picture_view_event_handler); + + rtgui_workbench_add_view(workbench, picture_view); + /* this view can be focused */ + RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + + view_mode = VIEW_SINGLE_MODE; + } + + return picture_view; +} + +rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, + const char* list[], rt_uint8_t size) +{ + if (picture_view != RT_NULL) + { + rtgui_view_show(picture_view, RT_FALSE); + } + else + { + picture_fn_list = list; + picture_fn_list_size = size; + picture_fn_list_current = 0; + strcpy(current_fn, picture_fn_list[picture_fn_list_current]); + + /* create picture view */ + picture_view = rtgui_view_create("Picture Presentation"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), + picture_view_event_handler); + + rtgui_workbench_add_view(workbench, picture_view); + /* this view can be focused */ + RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + + view_mode = VIEW_FN_LIST_MODE; + } + + return picture_view; +} diff --git a/bsp/mini2440/picture.h b/bsp/mini2440/picture.h new file mode 100644 index 0000000000..867b9837ec --- /dev/null +++ b/bsp/mini2440/picture.h @@ -0,0 +1,8 @@ +#ifndef __PICTURE_H__ +#define __PICTURE_H__ + +rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench); +rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, const char* fn); +rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, const char* list[], rt_uint8_t size); + +#endif diff --git a/bsp/mini2440/rtconfig.h b/bsp/mini2440/rtconfig.h index 7bb66c8f82..469e2fb845 100644 --- a/bsp/mini2440/rtconfig.h +++ b/bsp/mini2440/rtconfig.h @@ -63,6 +63,9 @@ /* Using Device System */ #define RT_USING_DEVICE +/* Using Module System */ +#define RT_USING_MODULE + /* SECTION: Console options */ /* the buffer size of console */ #define RT_CONSOLEBUF_SIZE 128 @@ -84,7 +87,7 @@ /* SECTION: Device filesystem support */ /* using DFS support */ #define RT_USING_DFS -#define RT_USING_DFS_ELMFATFS +#define RT_USING_DFS_ELMFAT /* #define RT_USING_DFS_YAFFS2 */ /* #define DFS_USING_WORKDIR */ @@ -96,6 +99,9 @@ /* the max number of cached sector */ #define DFS_CACHE_MAX_NUM 4 +/* Enable freemodbus protocal stack*/ +/* #define RT_USING_MODBUS */ + /* SECTION: lwip, a lighwight TCP/IP protocol stack */ /* Using lighweight TCP/IP protocol stack */ #define RT_USING_LWIP @@ -158,7 +164,7 @@ #define RT_LWIP_TCPTHREAD_PRIORITY 128 /* mail box size of tcpip thread to wait for */ -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8 +#define RT_LWIP_TCPTHREAD_MBOX_SIZE 32 /* thread stack size of tcpip thread */ #define RT_LWIP_TCPTHREAD_STACKSIZE 4096 diff --git a/bsp/mini2440/run_module.c b/bsp/mini2440/run_module.c new file mode 100644 index 0000000000..d7fd62e2bf --- /dev/null +++ b/bsp/mini2440/run_module.c @@ -0,0 +1,41 @@ +/* + * File : module.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-04-12 yi.qiu first version + */ + +#include +#include + +#ifdef RT_USING_FINSH +#include +static char buffer[4096]; + +void run_module(const char* filename) +{ + int fd, length; + struct dfs_stat s; + + fd = open(filename, O_RDONLY, 0); + length = read(fd, buffer, 4096); + if (length == 0) + { + rt_kprintf("check: read file failed\n"); + close(fd); + return; + } + + rt_module_load(buffer, filename); +} + +FINSH_FUNCTION_EXPORT(run_module, run module from file); +#endif + diff --git a/bsp/mini2440/startup.c b/bsp/mini2440/startup.c index 288b72ef31..4632ee9fcb 100644 --- a/bsp/mini2440/startup.c +++ b/bsp/mini2440/startup.c @@ -139,6 +139,11 @@ void rtthread_startup(void) rt_device_init_all(); #endif +#ifdef RT_USING_MODULE + /* init module system */ + rt_system_module_init(); +#endif + /* init application */ rt_application_init(); diff --git a/bsp/mini2440/today.c b/bsp/mini2440/today.c new file mode 100644 index 0000000000..2ee6a4e599 --- /dev/null +++ b/bsp/mini2440/today.c @@ -0,0 +1,213 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "picture.h" + +static rtgui_image_t *background = RT_NULL; +rtgui_image_t *selected_image = RT_NULL; + +static struct rtgui_view* function_view; +static struct rtgui_view* home_view; +static struct rtgui_workbench* workbench; + +const char *introduction_list[] = +{ + "/rtt/01.hdc", + "/rtt/02.hdc", + "/rtt/03.hdc", + "/rtt/04.hdc", + "/rtt/05.hdc", + "/rtt/06.hdc", + "/rtt/07.hdc", + "/rtt/08.hdc", +}; + +void function_introduction(void* parameter) +{ + rtgui_view_t *view; + + view = picture_view_create_view_list(workbench, introduction_list, + sizeof(introduction_list)/sizeof(char*)); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_filelist(void* parameter) +{ + rtgui_rect_t rect; + rtgui_view_t *view; + + rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); + view = (rtgui_view_t*)rtgui_filelist_view_create(workbench, "/", "*.*", &rect); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_osc(void* parameter) +{ + rtgui_view_t *view; + extern rtgui_view_t *osc_view_create(rtgui_workbench_t *workbench); + + view = osc_view_create(workbench); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_device(void* parameter) +{ + rtgui_view_t *view; + extern rtgui_view_t *device_view_create(rtgui_workbench_t *workbench); + + view = device_view_create(workbench); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_action(void* parameter) +{ + rt_kprintf("item action!\n"); + return; +} + +struct rtgui_list_item function_list[] = +{ + {"RT-Thread介绍", RT_NULL, function_introduction, RT_NULL}, + {"文件浏览", RT_NULL, function_filelist, RT_NULL}, + {"波形演示", RT_NULL, function_osc, RT_NULL}, + {"设备信息", RT_NULL, function_device, RT_NULL}, +}; + +static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) +{ + if (event->type == RTGUI_EVENT_PAINT) + { + struct rtgui_dc* dc; + struct rtgui_rect rect; + + dc = rtgui_dc_begin_drawing(widget); + if (dc == RT_NULL) return RT_FALSE; + rtgui_widget_get_rect(widget, &rect); + + /* draw background */ + background = rtgui_image_create_from_file("hdc", + "/resource/bg.hdc", RT_FALSE); + if (background != RT_NULL) + { + rtgui_image_blit(background, dc, &rect); + rtgui_image_destroy(background); + + background = RT_NULL; + } + else + { + rtgui_dc_fill_rect(dc, &rect); + } + rtgui_dc_end_drawing(dc); + + return RT_FALSE; + } + else if (event->type == RTGUI_EVENT_MOUSE_BUTTON) + { + struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; + if (emouse->button == RTGUI_MOUSE_BUTTON_UP | RTGUI_MOUSE_BUTTON_LEFT) + { + rtgui_view_show(function_view, RT_FALSE); + } + return RT_FALSE; + } + + return rtgui_view_event_handler(widget, event); +} + +rt_bool_t today_workbench_event_handler(rtgui_widget_t *widget, rtgui_event_t *event) +{ + if (event->type == RTGUI_EVENT_MOUSE_BUTTON) + { + struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; + //if (emouse->button == RTGUI_MOUSE_BUTTON_UP | RTGUI_MOUSE_BUTTON_LEFT) + if(0) + { + /* active home view */ + if (workbench->current_view != home_view) + { + rtgui_view_show(home_view, RT_FALSE); + return RT_FALSE; + } + } + } + + return rtgui_workbench_event_handler(widget, event); +} + +static void today_entry(void* parameter) +{ + rt_mq_t mq; + rtgui_rect_t rect; + + mq = rt_mq_create("qToday", 256, 4, RT_IPC_FLAG_FIFO); + rtgui_thread_register(rt_thread_self(), mq); + + selected_image = rtgui_image_create_from_file("hdc", + "/resource/select.hdc", RT_FALSE); + + workbench = rtgui_workbench_create("main", "workbench"); + if (workbench == RT_NULL) return; + rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), today_workbench_event_handler); + + /* add home view */ + home_view = rtgui_view_create("Home"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(home_view), home_view_event_handler); + + rtgui_workbench_add_view(workbench, home_view); + /* this view can be focused */ + RTGUI_WIDGET(home_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + /* set widget focus */ + rtgui_widget_focus(RTGUI_WIDGET(home_view)); + + rtgui_view_show(home_view, RT_FALSE); + + /* add function view */ + rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); + function_view = (struct rtgui_view*)rtgui_list_view_create(function_list, + sizeof(function_list)/sizeof(struct rtgui_list_item), &rect); + rtgui_workbench_add_view(workbench, function_view); + + rtgui_workbench_event_loop(workbench); + + rtgui_thread_deregister(rt_thread_self()); + rt_mq_delete(mq); +} + +void today_init() +{ + rt_thread_t tid; + + tid = rt_thread_create("today", + today_entry, RT_NULL, + 2048, 25, 10); + + if (tid != RT_NULL) rt_thread_startup(tid); +} diff --git a/bsp/mini2440/touch.c b/bsp/mini2440/touch.c index 0e3f245414..8aef45a23b 100644 --- a/bsp/mini2440/touch.c +++ b/bsp/mini2440/touch.c @@ -95,7 +95,7 @@ void report_touch_input(int updown) } /* rt_kprintf("touch %s: ts.x: %d, ts.y: %d, count:%d\n", updown? "down" : "up", - xp, yp, ts.count); */ + xp, yp, ts.count); */ emouse.button |= RTGUI_MOUSE_BUTTON_LEFT; @@ -122,7 +122,7 @@ static void touch_timer_fire(void) ADCCON |= S3C2410_ADCCON_ENABLE_START; } -void s3c2410_adc_stylus_action() +void s3c2410_adc_stylus_action(void) { rt_uint32_t data0; rt_uint32_t data1; @@ -148,7 +148,7 @@ void s3c2410_adc_stylus_action() } } -void s3c2410_intc_stylus_updown() +void s3c2410_intc_stylus_updown(void) { rt_uint32_t data0; rt_uint32_t data1; @@ -186,13 +186,13 @@ void s3c2410_intc_stylus_updown() void rt_touch_handler(int irqno) { - if (SUBSRCPND & (1 << 10)) + if (SUBSRCPND & BIT_SUB_ADC) { /* INT_SUB_ADC */ s3c2410_adc_stylus_action(); } - if (SUBSRCPND & (1 << 9)) + if (SUBSRCPND & BIT_SUB_TC) { /* INT_SUB_TC */ s3c2410_intc_stylus_updown(); @@ -202,7 +202,7 @@ void rt_touch_handler(int irqno) INTPND |= (rt_uint32_t)(1 << INTADC); } -void rt_hw_touch_init() +void rt_hw_touch_init(void) { /* init touch screen structure */ rt_memset(&ts, 0, sizeof(struct s3c2410ts)); @@ -233,3 +233,4 @@ void rt_hw_touch_init() first_down_report = 1; } + diff --git a/components/hello/hello.c b/components/hello/hello.c index c4653793a4..6b6402de1c 100644 --- a/components/hello/hello.c +++ b/components/hello/hello.c @@ -1,6 +1,22 @@ #include -void hello() +static int a = 0; +int b = 1000000; + +void function(int count1, int count2) { - rt_kprintf("Hello RT-Thread\n"); + rt_kprintf("Hello RT-Thread %d %d\n", count1, count2); +} + +int rtm_main(void) +{ + int i; + for(i=0; i<1000; i++) + { + a++; + b--; + function(a, b); + } + + return 0; } diff --git a/components/hello/mk.bat b/components/hello/mk.bat new file mode 100644 index 0000000000..8f906a3af7 --- /dev/null +++ b/components/hello/mk.bat @@ -0,0 +1,3 @@ +set PATH="E:\Program Files\CodeSourcery\Sourcery G++ Lite\bin";%PATH% +arm-none-eabi-gcc -c hello.c -o hello.o -DRT_MODULE "-I..\..\include" "-I..\..\bsp\mini2440" +arm-none-eabi-gcc -o hello.mo -r -d -e rtm_main -nostdlib hello.o \ No newline at end of file diff --git a/components/thread/mk.bat b/components/thread/mk.bat new file mode 100644 index 0000000000..2eaedccc6f --- /dev/null +++ b/components/thread/mk.bat @@ -0,0 +1,3 @@ +set PATH="E:\Program Files\CodeSourcery\Sourcery G++ Lite\bin";%PATH% +arm-none-eabi-gcc -c module_thread_dynamic.c -o module_thread_dynamic.o -DRT_MODULE "-I..\..\include" "-I..\..\bsp\mini2440" +arm-none-eabi-gcc -o dynamic.mo -r -d -e rtm_main -nostdlib module_thread_dynamic.o \ No newline at end of file diff --git a/components/thread/module_thread_dynamic.c b/components/thread/module_thread_dynamic.c index 7a5d3238ce..d4ac0f6716 100644 --- a/components/thread/module_thread_dynamic.c +++ b/components/thread/module_thread_dynamic.c @@ -1,5 +1,9 @@ #include +#define THREAD_PRIORITY 25 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 5 + static void thread_entry(void* parameter) { rt_kprintf("thread dynamicly created ok\n"); @@ -16,8 +20,6 @@ int rtm_main() THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); return 0; } \ No newline at end of file diff --git a/finsh/cmd.c b/finsh/cmd.c index 5e576b275d..023ea5a38b 100644 --- a/finsh/cmd.c +++ b/finsh/cmd.c @@ -336,6 +336,28 @@ int list_device() FINSH_FUNCTION_EXPORT(list_device, list device in system) #endif +#ifdef RT_USING_MODULE +int list_module() +{ + struct rt_module *module; + struct rt_list_node *list, *node; + + list = &rt_object_container[RT_Object_Class_Module].object_list; + + rt_kprintf("module entry stack size\n"); + rt_kprintf("-------- ---------- ----------\n"); + for (node = list->next; node != list; node = node->next) + { + module = (struct rt_device*)(rt_list_entry(node, struct rt_object, list)); + rt_kprintf("%-8s 0x%08x 0x%08x \n", module->parent.name, (rt_uint32_t)module->module_entry, + module->stack_size); + } + + return 0; +} +FINSH_FUNCTION_EXPORT(list_module, list module in system) +#endif + int list() { struct finsh_syscall_item* syscall_item; diff --git a/src/kservice.c b/src/kservice.c index cdd0a60907..e1aa3ffb51 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -977,9 +977,4 @@ char *strdup(const char *s) __attribute__((weak, alias("rt_strdup"))); #endif #endif -#ifdef RT_USING_MODULE -#include -/* some buildin kernel symbol */ -RTM_EXPORT(rt_kprintf) -#endif /*@}*/ diff --git a/src/module.c b/src/module.c index 4316d171d6..a2958cc66b 100644 --- a/src/module.c +++ b/src/module.c @@ -19,6 +19,19 @@ #include "module.h" #include "kservice.h" +/* #define RT_MODULE_DEBUG */ + +#define elf_module ((Elf32_Ehdr *)module_ptr) +#define shdr ((Elf32_Shdr *)((rt_uint8_t *)module_ptr + elf_module->e_shoff)) + +#define IS_PROG(s) (s.sh_type == SHT_PROGBITS) +#define IS_NOPROG(s) (s.sh_type == SHT_NOBITS) +#define IS_REL(s) (s.sh_type == SHT_REL) +#define IS_RELA(s) (s.sh_type == SHT_RELA) +#define IS_ALLOC(s) (s.sh_flags == SHF_ALLOC) +#define IS_AX(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_EXECINSTR)) +#define IS_AW(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_WRITE)) + #ifdef RT_USING_MODULE rt_list_t rt_module_symbol_list; struct rt_module* rt_current_module; @@ -55,17 +68,6 @@ rt_uint32_t rt_module_symbol_find(const rt_uint8_t* sym_str) return 0; } -#define elf_module ((Elf32_Ehdr *)module_ptr) -#define shdr ((Elf32_Shdr *)((rt_uint8_t *)module_ptr + elf_module->e_shoff)) - -#define IS_PROG(s) (s.sh_type == SHT_PROGBITS) -#define IS_NOPROG(s) (s.sh_type == SHT_NOBITS) -#define IS_REL(s) (s.sh_type == SHT_REL) -#define IS_RELA(s) (s.sh_type == SHT_RELA) -#define IS_ALLOC(s) (s.sh_flags == SHF_ALLOC) -#define IS_AX(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_EXECINSTR)) -#define IS_AW(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_WRITE)) - int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf32_Addr sym_val, rt_uint32_t module_addr) { Elf32_Addr *where, tmp; @@ -79,7 +81,9 @@ int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf32_Addr case R_ARM_ABS32: *where += (Elf32_Addr)sym_val; +#ifdef RT_MODULE_DEBUG rt_kprintf("R_ARM_ABS32: %x -> %x\n", where, *where); +#endif break; case R_ARM_PC24: @@ -92,7 +96,9 @@ int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf32_Addr tmp = sym_val - (Elf32_Addr)where + (addend << 2); tmp >>= 2; *where = (*where & 0xff000000) | (tmp & 0x00ffffff); +#ifdef RT_MODULE_DEBUG rt_kprintf("R_ARM_PC24: %x -> %x\n", where, *where); +#endif break; default: @@ -275,7 +281,9 @@ struct rt_module* rt_module_load(void* module_ptr, const rt_uint8_t* name) for (i = 0; i < nr_reloc; i ++) { Elf32_Sym *sym = &symtab[ELF32_R_SYM(rel->r_info)]; +#ifdef RT_MODULE_DEBUG rt_kprintf("relocate symbol: %s\n", strtab + sym->st_name); +#endif if (sym->st_shndx != STN_UNDEF) { if(ELF_ST_TYPE(sym->st_info) == STT_SECTION) @@ -310,7 +318,9 @@ struct rt_module* rt_module_load(void* module_ptr, const rt_uint8_t* name) } else { +#ifdef RT_MODULE_DEBUG rt_kprintf("unresolved relocate symbol: %s\n", strtab + sym->st_name); +#endif /* need to resolve symbol in kernel symbol table */ Elf32_Addr addr = rt_module_symbol_find(strtab + sym->st_name); if (addr != (Elf32_Addr)RT_NULL) diff --git a/src/object.c b/src/object.c index 7ad0540255..3843326b61 100644 --- a/src/object.c +++ b/src/object.c @@ -21,6 +21,10 @@ #include "kservice.h" +#ifdef RT_USING_MODULE +extern struct rt_module* rt_current_module; +#endif + #define _OBJ_CONTAINER_LIST_INIT(c) \ {&(rt_object_container[c].object_list), &(rt_object_container[c].object_list)} struct rt_object_information rt_object_container[RT_Object_Class_Unknown] = @@ -249,8 +253,14 @@ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char* name) register rt_base_t temp; struct rt_object_information* information; +#ifdef RT_USING_MODULE + /* get module object information */ + information = (rt_current_module != RT_NULL) ? + &rt_current_module->module_object[type] : &rt_object_container[type]; +#else /* get object information */ information = &rt_object_container[type]; +#endif object = (struct rt_object*)rt_malloc(information->object_size); if (object == RT_NULL) diff --git a/src/rtm.c b/src/rtm.c new file mode 100644 index 0000000000..309891af7d --- /dev/null +++ b/src/rtm.c @@ -0,0 +1,36 @@ +/* + * File : module.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-04-12 yi.qiu first version + */ + +#include +#include + +/* some buildin kernel symbol */ + +/* thread symbol */ +RTM_EXPORT(rt_thread_init) +RTM_EXPORT(rt_thread_detach) +RTM_EXPORT(rt_thread_create) +RTM_EXPORT(rt_thread_self) +RTM_EXPORT(rt_thread_find) +RTM_EXPORT(rt_thread_startup) +RTM_EXPORT(rt_thread_delete) +RTM_EXPORT(rt_thread_yield) +RTM_EXPORT(rt_thread_delay) +RTM_EXPORT(rt_thread_control) +RTM_EXPORT(rt_thread_suspend) +RTM_EXPORT(rt_thread_resume) +RTM_EXPORT(rt_thread_timeout) + +/* kservice symbol */ +RTM_EXPORT(rt_kprintf) diff --git a/src/scheduler.c b/src/scheduler.c index c570b3dbbc..a414840850 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -35,6 +35,9 @@ rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; struct rt_thread* rt_current_thread; rt_uint8_t rt_current_priority; +#ifdef RT_USING_MODULE +extern struct rt_module* rt_current_module; +#endif #if RT_THREAD_PRIORITY_MAX > 32 /* maximun priority level, 256 */ @@ -260,6 +263,11 @@ void rt_schedule() from_thread = rt_current_thread; rt_current_thread = to_thread; +#ifdef RT_USING_MODULE + if(rt_current_thread->module_parent != RT_NULL) + rt_current_module = rt_current_thread->module_parent; +#endif + #ifdef RT_USING_HOOK if (rt_scheduler_hook != RT_NULL) rt_scheduler_hook(from_thread, to_thread); #endif diff --git a/src/thread.c b/src/thread.c index 875a00aedb..b8859f9a0c 100644 --- a/src/thread.c +++ b/src/thread.c @@ -32,6 +32,10 @@ extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; extern struct rt_thread* rt_current_thread; extern rt_uint8_t rt_current_priority; +#ifdef RT_USING_MODULE +extern struct rt_module* rt_current_module; +#endif + #ifdef RT_USING_HEAP extern rt_list_t rt_thread_defunct; #endif @@ -78,7 +82,8 @@ static rt_err_t _rt_thread_init(struct rt_thread* thread, #ifdef RT_USING_MODULE /* init module parent */ - thread->module_parent = RT_NULL; + thread->module_parent = + (rt_current_module != RT_NULL) ? rt_current_module : RT_NULL; #endif /* init user data */ @@ -228,12 +233,12 @@ rt_err_t rt_thread_startup (rt_thread_t thread) static void rt_thread_exit() { struct rt_thread* thread; - register rt_base_t temp; + register rt_base_t temp; - /* disable interrupt */ - temp = rt_hw_interrupt_disable(); + /* disable interrupt */ + temp = rt_hw_interrupt_disable(); - /* get current thread */ + /* get current thread */ thread = rt_current_thread; /* remove from schedule */ @@ -628,21 +633,4 @@ rt_thread_t rt_thread_find(char* name) return thread; } -#ifdef RT_USING_MODULE -#include -/* some buildin kernel symbol */ -RTM_EXPORT(rt_thread_init) -RTM_EXPORT(rt_thread_detach) -RTM_EXPORT(rt_thread_create) -RTM_EXPORT(rt_thread_self) -RTM_EXPORT(rt_thread_find) -RTM_EXPORT(rt_thread_startup) -RTM_EXPORT(rt_thread_delete) -RTM_EXPORT(rt_thread_yield) -RTM_EXPORT(rt_thread_delay) -RTM_EXPORT(rt_thread_control) -RTM_EXPORT(rt_thread_suspend) -RTM_EXPORT(rt_thread_resume) -RTM_EXPORT(rt_thread_timeout) -#endif /*@}*/ -- GitLab