summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bsp/mini2440/SConstruct5
-rw-r--r--bsp/mini2440/mini2440_ram.ld6
-rw-r--r--bsp/mini2440/network.xpm172
-rw-r--r--bsp/mini2440/network_disconnect.xpm98
-rw-r--r--bsp/mini2440/osc.c131
-rw-r--r--bsp/mini2440/osc.obin0 -> 22812 bytes
-rw-r--r--bsp/mini2440/picture.c300
-rw-r--r--bsp/mini2440/picture.h8
-rw-r--r--bsp/mini2440/rtconfig.h10
-rw-r--r--bsp/mini2440/run_module.c41
-rw-r--r--bsp/mini2440/startup.c5
-rw-r--r--bsp/mini2440/today.c213
-rw-r--r--bsp/mini2440/touch.c13
-rw-r--r--components/hello/hello.c20
-rw-r--r--components/hello/mk.bat3
-rw-r--r--components/thread/mk.bat3
-rw-r--r--components/thread/module_thread_dynamic.c6
-rw-r--r--finsh/cmd.c22
-rw-r--r--src/kservice.c5
-rw-r--r--src/module.c32
-rw-r--r--src/object.c10
-rw-r--r--src/rtm.c36
-rw-r--r--src/scheduler.c8
-rw-r--r--src/thread.c32
24 files changed, 1128 insertions, 51 deletions
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 <rtgui/rtgui.h>
+#include <rtgui/image.h>
+#include <rtgui/rtgui_system.h>
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/workbench.h>
+
+#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 <math.h>
+
+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 0000000000..32a5831fa4
--- /dev/null
+++ b/bsp/mini2440/osc.o
Binary files differ
diff --git a/bsp/mini2440/picture.c b/bsp/mini2440/picture.c
new file mode 100644
index 0000000000..3575a7c1a6
--- /dev/null
+++ b/bsp/mini2440/picture.c
@@ -0,0 +1,300 @@
+#include <rtgui/rtgui.h>
+#include <rtgui/image.h>
+#include <rtgui/rtgui_system.h>
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/workbench.h>
+#include <dfs_posix.h>
+#include <string.h>
+
+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 <rtthread.h>
+#include <dfs_posix.h>
+
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+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 <rtgui/rtgui.h>
+#include <rtgui/image.h>
+#include <rtgui/rtgui_system.h>
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/list_view.h>
+#include <rtgui/widgets/workbench.h>
+#include <rtgui/widgets/filelist_view.h>
+#include <string.h>
+
+#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 <rtthread.h>
-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 <rtthread.h>
+#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 <rtm.h>
-/* 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 <rtthread.h>
+#include <rtm.h>
+
+/* 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 <rtm.h>
-/* 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
/*@}*/