summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorguochuangjian <[email protected]>2018-08-05 15:08:50 +0800
committerguochuangjian <[email protected]>2018-08-05 15:08:50 +0800
commit3de51fe25688f0b6c7cb9f9d424861654fb09e49 (patch)
treedcf4a170b00deace7860187e3ff9c2e6495e0923 /src
parent650f06aa1943d439ac049f6bc276b216999e6a56 (diff)
parent03bf99a56de255d41655bc8486d50cadbcae22f0 (diff)
fix usRcvBufferPos == MB_SER_PDU_SIZE_MAX bug
Diffstat (limited to 'src')
-rw-r--r--src/Kconfig139
-rw-r--r--src/components.c7
-rw-r--r--src/device.c75
-rw-r--r--src/idle.c107
-rw-r--r--src/ipc.c92
-rw-r--r--src/kservice.c3
-rw-r--r--src/memheap.c12
-rw-r--r--src/mempool.c15
-rw-r--r--src/module.c769
-rw-r--r--src/object.c106
-rw-r--r--src/signal.c7
-rw-r--r--src/slab.c19
-rw-r--r--src/thread.c31
-rw-r--r--src/timer.c8
14 files changed, 408 insertions, 982 deletions
diff --git a/src/Kconfig b/src/Kconfig
index d8ddbfc838..f08a90f66b 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -4,8 +4,8 @@ config RT_NAME_MAX
int "The maximal size of kernel object name"
range 2 32
default 8
- help
- Each kernel object, such as thread, timer, semaphore etc, has a name,
+ help
+ Each kernel object, such as thread, timer, semaphore etc, has a name,
the RT_NAME_MAX is the maximal size of this object name.
config RT_ALIGN_SIZE
@@ -14,7 +14,7 @@ config RT_ALIGN_SIZE
help
Alignment size for CPU architecture data access
- choice
+ choice
prompt "The maximal level value of priority of thread"
default RT_THREAD_PRIORITY_32
@@ -41,40 +41,29 @@ config RT_TICK_PER_SECOND
help
System's tick frequency, Hz.
-config RT_DEBUG
- bool "Enable debug features"
- default y
-
-if RT_DEBUG
-
config RT_USING_OVERFLOW_CHECK
bool "Using stack overflow checking"
default y
help
- Enable thread stack overflow checking. The stack overflow is checking when
+ Enable thread stack overflow checking. The stack overflow is checking when
each thread switch.
-config RT_DEBUG_INIT
- int "Enable system initialization informat print"
- default 0
- help
- print the procedure name of initialization
-
-config RT_DEBUG_THREAD
- int "Enable thread switch information dump"
- default 0
- help
- print the switch to/from thread name when each thread context switch
-
-endif
-
config RT_USING_HOOK
bool "Enable system hook"
default y
help
- Enable the hook function when system running, such as idle thread hook,
+ Enable the hook function when system running, such as idle thread hook,
thread context switch etc.
+ if RT_USING_HOOK
+ config RT_IDEL_HOOK_LIST_SIZE
+ int "The max size of idel hook list"
+ default 4
+ range 1 16
+ help
+ The system has a hook list. This is the hook list size.
+ endif
+
config IDLE_THREAD_STACK_SIZE
int "The stack size of idle thread"
default 256
@@ -83,7 +72,7 @@ config RT_USING_TIMER_SOFT
bool "Enable software timer with a timer thread"
default n
help
- the timeout function context of soft-timer is under a high priority timer
+ the timeout function context of soft-timer is under a high priority timer
thread.
if RT_USING_TIMER_SOFT
@@ -97,6 +86,94 @@ config RT_TIMER_THREAD_STACK_SIZE
endif
+menuconfig RT_DEBUG
+ bool "Enable debugging features"
+ default y
+
+if RT_DEBUG
+
+config RT_DEBUG_INIT_CONFIG
+ bool "Enable debugging of components initialization"
+ default n
+
+config RT_DEBUG_INIT
+ int
+ default 1 if RT_DEBUG_INIT_CONFIG
+
+config RT_DEBUG_THREAD_CONFIG
+ bool "Enable debugging of Thread State Changes"
+ default n
+
+config RT_DEBUG_THREAD
+ int
+ default 1 if RT_DEBUG_THREAD_CONFIG
+
+config RT_DEBUG_SCHEDULER_CONFIG
+ bool "Enable debugging of Scheduler"
+ default n
+
+config RT_DEBUG_SCHEDULER
+ int
+ default 1 if RT_DEBUG_SCHEDULER_CONFIG
+
+config RT_DEBUG_IPC_CONFIG
+ bool "Enable debugging of IPC"
+ default n
+
+config RT_DEBUG_IPC
+ int
+ default 1 if RT_DEBUG_IPC_CONFIG
+
+config RT_DEBUG_TIMER_CONFIG
+ bool "Enable debugging of Timer"
+ default n
+
+config RT_DEBUG_TIMER
+ int
+ default 1 if RT_DEBUG_TIMER_CONFIG
+
+config RT_DEBUG_IRQ_CONFIG
+ bool "Enable debugging of IRQ(Interrupt Request)"
+ default n
+
+config RT_DEBUG_IRQ
+ int
+ default 1 if RT_DEBUG_IRQ_CONFIG
+
+config RT_DEBUG_MEM_CONFIG
+ bool "Enable debugging of Small Memory Algorithm"
+ default n
+
+config RT_DEBUG_MEM
+ int
+ default 1 if RT_DEBUG_MEM_CONFIG
+
+config RT_DEBUG_SLAB_CONFIG
+ bool "Enable debugging of SLAB Memory Algorithm"
+ default n
+
+config RT_DEBUG_SLAB
+ int
+ default 1 if RT_DEBUG_SLAB_CONFIG
+
+config RT_DEBUG_MEMHEAP_CONFIG
+ bool "Enable debugging of Memory Heap Algorithm"
+ default n
+
+config RT_DEBUG_MEMHEAP
+ int
+ default 1 if RT_DEBUG_MEMHEAP_CONFIG
+
+config RT_DEBUG_MODULE_CONFIG
+ bool "Enable debugging of Application Module"
+ default n
+
+config RT_DEBUG_MODULE
+ int
+ default 1 if RT_DEBUG_MODULE_CONFIG
+
+endif
+
menu "Inter-Thread communication"
config RT_USING_SEMAPHORE
@@ -124,7 +201,7 @@ config RT_USING_SIGNALS
select RT_USING_MEMPOOL
default n
help
- A signal is an asynchronous notification sent to a specific thread
+ A signal is an asynchronous notification sent to a specific thread
in order to notify it of an event that occurred.
endmenu
@@ -142,7 +219,7 @@ menu "Memory Management"
help
Using memory heap object to manage dynamic memory heap.
- choice
+ choice
prompt "Dynamic Memory Management"
default RT_USING_SMALL_MEM
@@ -178,7 +255,7 @@ menu "Memory Management"
endif
config RT_USING_HEAP
- bool
+ bool
default n if RT_USING_NOHEAP
default y if RT_USING_SMALL_MEM
default y if RT_USING_SLAB
@@ -192,6 +269,10 @@ menu "Kernel Device Object"
bool "Using device object"
default y
+ config RT_USING_DEVICE_OPS
+ bool "Using ops for each device object"
+ default n
+
config RT_USING_INTERRUPT_INFO
bool "Enable additional interrupt trace information"
default n
diff --git a/src/components.c b/src/components.c
index a73efa37b1..818e570b3c 100644
--- a/src/components.c
+++ b/src/components.c
@@ -37,6 +37,9 @@
#ifndef RT_MAIN_THREAD_STACK_SIZE
#define RT_MAIN_THREAD_STACK_SIZE 2048
#endif
+#ifndef RT_MAIN_THREAD_PRIORITY
+#define RT_MAIN_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 3)
+#endif
#endif
#ifdef RT_USING_COMPONENTS_INIT
@@ -205,14 +208,14 @@ void rt_application_init(void)
#ifdef RT_USING_HEAP
tid = rt_thread_create("main", main_thread_entry, RT_NULL,
- RT_MAIN_THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX / 3, 20);
+ RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
RT_ASSERT(tid != RT_NULL);
#else
rt_err_t result;
tid = &main_thread;
result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,
- main_stack, sizeof(main_stack), RT_THREAD_PRIORITY_MAX / 3, 20);
+ main_stack, sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);
RT_ASSERT(result == RT_EOK);
/* if not define RT_USING_HEAP, using to eliminate the warning */
diff --git a/src/device.c b/src/device.c
index 231a052b86..0b662ae620 100644
--- a/src/device.c
+++ b/src/device.c
@@ -29,15 +29,34 @@
*/
#include <rtthread.h>
+#if defined(RT_USING_POSIX)
+#include <rtdevice.h> /* for wqueue_init */
+#endif
#ifdef RT_USING_DEVICE
+#ifdef RT_USING_DEVICE_OPS
+#define device_init (dev->ops->init)
+#define device_open (dev->ops->open)
+#define device_close (dev->ops->close)
+#define device_read (dev->ops->read)
+#define device_write (dev->ops->write)
+#define device_control (dev->ops->control)
+#else
+#define device_init (dev->init)
+#define device_open (dev->open)
+#define device_close (dev->close)
+#define device_read (dev->read)
+#define device_write (dev->write)
+#define device_control (dev->control)
+#endif
+
/**
* This function registers a device driver with specified name.
*
* @param dev the pointer of device driver structure
* @param name the device driver's name
- * @param flags the flag of device
+ * @param flags the capabilities flag of device
*
* @return the error code, RT_EOK on initialization successfully.
*/
@@ -58,7 +77,7 @@ rt_err_t rt_device_register(rt_device_t dev,
#if defined(RT_USING_POSIX)
dev->fops = RT_NULL;
- rt_list_init(&(dev->wait_queue));
+ rt_wqueue_init(&(dev->wait_queue));
#endif
return RT_EOK;
@@ -75,6 +94,8 @@ RTM_EXPORT(rt_device_register);
rt_err_t rt_device_unregister(rt_device_t dev)
{
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
+ RT_ASSERT(rt_object_is_systemobject(&dev->parent));
rt_object_detach(&(dev->parent));
@@ -154,6 +175,8 @@ rt_device_t rt_device_create(int type, int attach_size)
rt_device_t device;
size = RT_ALIGN(sizeof(struct rt_device), RT_ALIGN_SIZE);
+ attach_size = RT_ALIGN(attach_size, RT_ALIGN_SIZE);
+ /* use the totoal size */
size += attach_size;
device = (rt_device_t)rt_malloc(size);
@@ -170,15 +193,18 @@ RTM_EXPORT(rt_device_create);
/**
* This function destroy the specific device object.
*
- * @param device, the specific device object.
+ * @param dev, the specific device object.
*/
-void rt_device_destroy(rt_device_t device)
+void rt_device_destroy(rt_device_t dev)
{
- /* unregister device firstly */
- rt_device_unregister(device);
+ RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
+ RT_ASSERT(rt_object_is_systemobject(&dev->parent) == RT_FALSE);
+
+ rt_object_detach(&(dev->parent));
/* release this device object */
- rt_free(device);
+ rt_free(dev);
}
RTM_EXPORT(rt_device_destroy);
#endif
@@ -197,11 +223,11 @@ rt_err_t rt_device_init(rt_device_t dev)
RT_ASSERT(dev != RT_NULL);
/* get device init handler */
- if (dev->init != RT_NULL)
+ if (device_init != RT_NULL)
{
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
- result = dev->init(dev);
+ result = device_init(dev);
if (result != RT_EOK)
{
rt_kprintf("To initialize device:%s failed. The error code is %d\n",
@@ -230,13 +256,14 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
rt_err_t result = RT_EOK;
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
/* if device is not initialized, initialize it. */
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
{
- if (dev->init != RT_NULL)
+ if (device_init != RT_NULL)
{
- result = dev->init(dev);
+ result = device_init(dev);
if (result != RT_EOK)
{
rt_kprintf("To initialize device:%s failed. The error code is %d\n",
@@ -257,9 +284,9 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)
}
/* call device open interface */
- if (dev->open != RT_NULL)
+ if (device_open != RT_NULL)
{
- result = dev->open(dev, oflag);
+ result = device_open(dev, oflag);
}
else
{
@@ -294,6 +321,7 @@ rt_err_t rt_device_close(rt_device_t dev)
rt_err_t result = RT_EOK;
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
if (dev->ref_count == 0)
return -RT_ERROR;
@@ -304,9 +332,9 @@ rt_err_t rt_device_close(rt_device_t dev)
return RT_EOK;
/* call device close interface */
- if (dev->close != RT_NULL)
+ if (device_close != RT_NULL)
{
- result = dev->close(dev);
+ result = device_close(dev);
}
/* set open flag */
@@ -335,6 +363,7 @@ rt_size_t rt_device_read(rt_device_t dev,
rt_size_t size)
{
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
if (dev->ref_count == 0)
{
@@ -343,9 +372,9 @@ rt_size_t rt_device_read(rt_device_t dev,
}
/* call device read interface */
- if (dev->read != RT_NULL)
+ if (device_read != RT_NULL)
{
- return dev->read(dev, pos, buffer, size);
+ return device_read(dev, pos, buffer, size);
}
/* set error code */
@@ -373,6 +402,7 @@ rt_size_t rt_device_write(rt_device_t dev,
rt_size_t size)
{
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
if (dev->ref_count == 0)
{
@@ -381,9 +411,9 @@ rt_size_t rt_device_write(rt_device_t dev,
}
/* call device write interface */
- if (dev->write != RT_NULL)
+ if (device_write != RT_NULL)
{
- return dev->write(dev, pos, buffer, size);
+ return device_write(dev, pos, buffer, size);
}
/* set error code */
@@ -405,11 +435,12 @@ RTM_EXPORT(rt_device_write);
rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg)
{
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
/* call device write interface */
- if (dev->control != RT_NULL)
+ if (device_control != RT_NULL)
{
- return dev->control(dev, cmd, arg);
+ return device_control(dev, cmd, arg);
}
return -RT_ENOSYS;
@@ -430,6 +461,7 @@ rt_device_set_rx_indicate(rt_device_t dev,
rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size))
{
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
dev->rx_indicate = rx_ind;
@@ -451,6 +483,7 @@ rt_device_set_tx_complete(rt_device_t dev,
rt_err_t (*tx_done)(rt_device_t dev, void *buffer))
{
RT_ASSERT(dev != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&dev->parent) == RT_Object_Class_Device);
dev->tx_complete = tx_done;
diff --git a/src/idle.c b/src/idle.c
index ecd894b8e2..d6c2f98a49 100644
--- a/src/idle.c
+++ b/src/idle.c
@@ -26,6 +26,7 @@
* dead thread.
* 2016-08-09 ArdaFu add method to get the handler of the idle thread.
* 2018-02-07 Bernard lock scheduler to protect tid->cleanup.
+ * 2018-07-14 armink add idle hook list
*/
#include <rthw.h>
@@ -52,7 +53,12 @@ static rt_uint8_t rt_thread_stack[IDLE_THREAD_STACK_SIZE];
extern rt_list_t rt_thread_defunct;
#ifdef RT_USING_IDLE_HOOK
-static void (*rt_thread_idle_hook)();
+
+#ifndef RT_IDEL_HOOK_LIST_SIZE
+#define RT_IDEL_HOOK_LIST_SIZE 4
+#endif
+
+static void (*idle_hook_list[RT_IDEL_HOOK_LIST_SIZE])();
/**
* @ingroup Hook
@@ -61,12 +67,67 @@ static void (*rt_thread_idle_hook)();
*
* @param hook the specified hook function
*
+ * @return RT_EOK: set OK
+ * -RT_EFULL: hook list is full
+ *
* @note the hook function must be simple and never be blocked or suspend.
*/
-void rt_thread_idle_sethook(void (*hook)(void))
+rt_err_t rt_thread_idle_sethook(void (*hook)(void))
+{
+ rt_size_t i;
+ rt_base_t level;
+ rt_err_t ret = -RT_EFULL;
+
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
+
+ for (i = 0; i < RT_IDEL_HOOK_LIST_SIZE; i++)
+ {
+ if (idle_hook_list[i] == RT_NULL)
+ {
+ idle_hook_list[i] = hook;
+ ret = RT_EOK;
+ break;
+ }
+ }
+ /* enable interrupt */
+ rt_hw_interrupt_enable(level);
+
+ return ret;
+}
+
+/**
+ * delete the idle hook on hook list
+ *
+ * @param hook the specified hook function
+ *
+ * @return RT_EOK: delete OK
+ * -RT_ENOSYS: hook was not found
+ */
+rt_err_t rt_thread_idle_delhook(void (*hook)(void))
{
- rt_thread_idle_hook = hook;
+ rt_size_t i;
+ rt_base_t level;
+ rt_err_t ret = -RT_ENOSYS;
+
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
+
+ for (i = 0; i < RT_IDEL_HOOK_LIST_SIZE; i++)
+ {
+ if (idle_hook_list[i] == hook)
+ {
+ idle_hook_list[i] = RT_NULL;
+ ret = RT_EOK;
+ break;
+ }
+ }
+ /* enable interrupt */
+ rt_hw_interrupt_enable(level);
+
+ return ret;
}
+
#endif
/* Return whether there is defunctional thread to be deleted. */
@@ -164,46 +225,30 @@ void rt_thread_idle_excute(void)
rt_hw_interrupt_enable(lock);
#ifdef RT_USING_HEAP
-#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
- /* the thread belongs to an application module */
- if (thread->flags & RT_OBJECT_FLAG_MODULE)
- rt_module_free((rt_module_t)thread->module_id, thread->stack_addr);
- else
-#endif
- /* release thread's stack */
- RT_KERNEL_FREE(thread->stack_addr);
+ /* release thread's stack */
+ RT_KERNEL_FREE(thread->stack_addr);
/* delete thread object */
rt_object_delete((rt_object_t)thread);
#endif
-
-#ifdef RT_USING_MODULE
- if (module != RT_NULL)
- {
- extern rt_err_t rt_module_destroy(rt_module_t module);
-
- /* if sub thread list and main thread are all empty */
- if ((module->module_thread == RT_NULL) &&
- rt_list_isempty(&module->module_object[RT_Object_Class_Thread].object_list))
- {
- module->nref --;
- }
-
- /* destroy module */
- if (module->nref == 0)
- rt_module_destroy(module);
- }
-#endif
}
}
static void rt_thread_idle_entry(void *parameter)
{
+#ifdef RT_USING_IDLE_HOOK
+ rt_size_t i;
+#endif
+
while (1)
{
+
#ifdef RT_USING_IDLE_HOOK
- if (rt_thread_idle_hook != RT_NULL)
+ for (i = 0; i < RT_IDEL_HOOK_LIST_SIZE; i++)
{
- rt_thread_idle_hook();
+ if (idle_hook_list[i] != RT_NULL)
+ {
+ idle_hook_list[i]();
+ }
}
#endif
diff --git a/src/ipc.c b/src/ipc.c
index dbf0881b02..b1a5dbe402 100644
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -242,7 +242,10 @@ RTM_EXPORT(rt_sem_init);
*/
rt_err_t rt_sem_detach(rt_sem_t sem)
{
+ /* parameter check */
RT_ASSERT(sem != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
+ RT_ASSERT(rt_object_is_systemobject(&sem->parent.parent));
/* wakeup all suspend threads */
rt_ipc_list_resume_all(&(sem->parent.suspend_thread));
@@ -303,7 +306,10 @@ rt_err_t rt_sem_delete(rt_sem_t sem)
{
RT_DEBUG_NOT_IN_INTERRUPT;
+ /* parameter check */
RT_ASSERT(sem != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
+ RT_ASSERT(rt_object_is_systemobject(&sem->parent.parent) == RT_FALSE);
/* wakeup all suspend threads */
rt_ipc_list_resume_all(&(sem->parent.suspend_thread));
@@ -330,7 +336,9 @@ rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)
register rt_base_t temp;
struct rt_thread *thread;
+ /* parameter check */
RT_ASSERT(sem != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(sem->parent.parent)));
@@ -437,6 +445,10 @@ rt_err_t rt_sem_release(rt_sem_t sem)
register rt_base_t temp;
register rt_bool_t need_schedule;
+ /* parameter check */
+ RT_ASSERT(sem != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
+
RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(sem->parent.parent)));
need_schedule = RT_FALSE;
@@ -481,7 +493,10 @@ RTM_EXPORT(rt_sem_release);
rt_err_t rt_sem_control(rt_sem_t sem, int cmd, void *arg)
{
rt_ubase_t level;
+
+ /* parameter check */
RT_ASSERT(sem != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
if (cmd == RT_IPC_CMD_RESET)
{
@@ -524,6 +539,7 @@ RTM_EXPORT(rt_sem_control);
*/
rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag)
{
+ /* parameter check */
RT_ASSERT(mutex != RT_NULL);
/* init object */
@@ -555,7 +571,10 @@ RTM_EXPORT(rt_mutex_init);
*/
rt_err_t rt_mutex_detach(rt_mutex_t mutex)
{
+ /* parameter check */
RT_ASSERT(mutex != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex);
+ RT_ASSERT(rt_object_is_systemobject(&mutex->parent.parent));
/* wakeup all suspend threads */
rt_ipc_list_resume_all(&(mutex->parent.suspend_thread));
@@ -617,7 +636,10 @@ rt_err_t rt_mutex_delete(rt_mutex_t mutex)
{
RT_DEBUG_NOT_IN_INTERRUPT;
+ /* parameter check */
RT_ASSERT(mutex != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex);
+ RT_ASSERT(rt_object_is_systemobject(&mutex->parent.parent) == RT_FALSE);
/* wakeup all suspend threads */
rt_ipc_list_resume_all(&(mutex->parent.suspend_thread));
@@ -647,7 +669,9 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
/* this function must not be used in interrupt even if time = 0 */
RT_DEBUG_IN_THREAD_CONTEXT;
+ /* parameter check */
RT_ASSERT(mutex != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex);
/* get current thread */
thread = rt_thread_self();
@@ -779,6 +803,10 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
struct rt_thread *thread;
rt_bool_t need_schedule;
+ /* parameter check */
+ RT_ASSERT(mutex != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex);
+
need_schedule = RT_FALSE;
/* only thread could release mutex because we need test the ownership */
@@ -874,6 +902,10 @@ RTM_EXPORT(rt_mutex_release);
*/
rt_err_t rt_mutex_control(rt_mutex_t mutex, int cmd, void *arg)
{
+ /* parameter check */
+ RT_ASSERT(mutex != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex);
+
return -RT_ERROR;
}
RTM_EXPORT(rt_mutex_control);
@@ -892,6 +924,7 @@ RTM_EXPORT(rt_mutex_control);
*/
rt_err_t rt_event_init(rt_event_t event, const char *name, rt_uint8_t flag)
{
+ /* parameter check */
RT_ASSERT(event != RT_NULL);
/* init object */
@@ -921,6 +954,8 @@ rt_err_t rt_event_detach(rt_event_t event)
{
/* parameter check */
RT_ASSERT(event != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event);
+ RT_ASSERT(rt_object_is_systemobject(&event->parent.parent));
/* resume all suspended thread */
rt_ipc_list_resume_all(&(event->parent.suspend_thread));
@@ -976,6 +1011,8 @@ rt_err_t rt_event_delete(rt_event_t event)
{
/* parameter check */
RT_ASSERT(event != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event);
+ RT_ASSERT(rt_object_is_systemobject(&event->parent.parent) == RT_FALSE);
RT_DEBUG_NOT_IN_INTERRUPT;
@@ -1009,11 +1046,12 @@ rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set)
/* parameter check */
RT_ASSERT(event != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event);
+
if (set == 0)
return -RT_ERROR;
need_schedule = RT_FALSE;
- RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(event->parent.parent)));
/* disable interrupt */
level = rt_hw_interrupt_disable();
@@ -1021,6 +1059,8 @@ rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set)
/* set event */
event->set |= set;
+ RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(event->parent.parent)));
+
if (!rt_list_isempty(&event->parent.suspend_thread))
{
/* search thread list to resume thread */
@@ -1108,6 +1148,8 @@ rt_err_t rt_event_recv(rt_event_t event,
/* parameter check */
RT_ASSERT(event != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event);
+
if (set == 0)
return -RT_ERROR;
@@ -1217,8 +1259,11 @@ RTM_EXPORT(rt_event_recv);
rt_err_t rt_event_control(rt_event_t event, int cmd, void *arg)
{
rt_ubase_t level;
- RT_ASSERT(event != RT_NULL);
+ /* parameter check */
+ RT_ASSERT(event != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event);
+
if (cmd == RT_IPC_CMD_RESET)
{
/* disable interrupt */
@@ -1298,6 +1343,8 @@ rt_err_t rt_mb_detach(rt_mailbox_t mb)
{
/* parameter check */
RT_ASSERT(mb != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
+ RT_ASSERT(rt_object_is_systemobject(&mb->parent.parent));
/* resume all suspended thread */
rt_ipc_list_resume_all(&(mb->parent.suspend_thread));
@@ -1372,6 +1419,8 @@ rt_err_t rt_mb_delete(rt_mailbox_t mb)
/* parameter check */
RT_ASSERT(mb != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
+ RT_ASSERT(rt_object_is_systemobject(&mb->parent.parent) == RT_FALSE);
/* resume all suspended thread */
rt_ipc_list_resume_all(&(mb->parent.suspend_thread));
@@ -1379,15 +1428,8 @@ rt_err_t rt_mb_delete(rt_mailbox_t mb)
/* also resume all mailbox private suspended thread */
rt_ipc_list_resume_all(&(mb->suspend_sender_thread));
-#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
- /* the mb object belongs to an application module */
- if (mb->parent.parent.flag & RT_OBJECT_FLAG_MODULE)
- rt_module_free(mb->parent.parent.module_id, mb->msg_pool);
- else
-#endif
-
- /* free mailbox pool */
- RT_KERNEL_FREE(mb->msg_pool);
+ /* free mailbox pool */
+ RT_KERNEL_FREE(mb->msg_pool);
/* delete mailbox object */
rt_object_delete(&(mb->parent.parent));
@@ -1417,6 +1459,7 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
/* parameter check */
RT_ASSERT(mb != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
/* initialize delta tick */
tick_delta = 0;
@@ -1562,6 +1605,7 @@ rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout)
/* parameter check */
RT_ASSERT(mb != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
/* initialize delta tick */
tick_delta = 0;
@@ -1692,7 +1736,10 @@ RTM_EXPORT(rt_mb_recv);
rt_err_t rt_mb_control(rt_mailbox_t mb, int cmd, void *arg)
{
rt_ubase_t level;
+
+ /* parameter check */
RT_ASSERT(mb != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
if (cmd == RT_IPC_CMD_RESET)
{
@@ -1802,6 +1849,8 @@ rt_err_t rt_mq_detach(rt_mq_t mq)
{
/* parameter check */
RT_ASSERT(mq != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
+ RT_ASSERT(rt_object_is_systemobject(&mq->parent.parent));
/* resume all suspended thread */
rt_ipc_list_resume_all(&mq->parent.suspend_thread);
@@ -1895,19 +1944,14 @@ rt_err_t rt_mq_delete(rt_mq_t mq)
/* parameter check */
RT_ASSERT(mq != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
+ RT_ASSERT(rt_object_is_systemobject(&mq->parent.parent) == RT_FALSE);
/* resume all suspended thread */
rt_ipc_list_resume_all(&(mq->parent.suspend_thread));
-#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
- /* the mq object belongs to an application module */
- if (mq->parent.parent.flag & RT_OBJECT_FLAG_MODULE)
- rt_module_free(mq->parent.parent.module_id, mq->msg_pool);
- else
-#endif
-
- /* free message queue pool */
- RT_KERNEL_FREE(mq->msg_pool);
+ /* free message queue pool */
+ RT_KERNEL_FREE(mq->msg_pool);
/* delete message queue object */
rt_object_delete(&(mq->parent.parent));
@@ -1932,7 +1976,9 @@ rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size)
register rt_ubase_t temp;
struct rt_mq_message *msg;
+ /* parameter check */
RT_ASSERT(mq != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
RT_ASSERT(buffer != RT_NULL);
RT_ASSERT(size != 0);
@@ -2020,7 +2066,9 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size)
register rt_ubase_t temp;
struct rt_mq_message *msg;
+ /* parameter check */
RT_ASSERT(mq != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
RT_ASSERT(buffer != RT_NULL);
RT_ASSERT(size != 0);
@@ -2108,7 +2156,9 @@ rt_err_t rt_mq_recv(rt_mq_t mq,
struct rt_mq_message *msg;
rt_uint32_t tick_delta;
+ /* parameter check */
RT_ASSERT(mq != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
RT_ASSERT(buffer != RT_NULL);
RT_ASSERT(size != 0);
@@ -2242,7 +2292,9 @@ rt_err_t rt_mq_control(rt_mq_t mq, int cmd, void *arg)
rt_ubase_t level;
struct rt_mq_message *msg;
+ /* parameter check */
RT_ASSERT(mq != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
if (cmd == RT_IPC_CMD_RESET)
{
diff --git a/src/kservice.c b/src/kservice.c
index e3ddf3eb66..fa82ccdd80 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -531,6 +531,9 @@ char *rt_strdup(const char *s)
return tmp;
}
RTM_EXPORT(rt_strdup);
+#ifdef __CC_ARM
+char *strdup(const char *s) __attribute__((alias("rt_strdup")));
+#endif
#endif
/**
diff --git a/src/memheap.c b/src/memheap.c
index 7317ebdbab..de637f2685 100644
--- a/src/memheap.c
+++ b/src/memheap.c
@@ -134,6 +134,8 @@ RTM_EXPORT(rt_memheap_init);
rt_err_t rt_memheap_detach(struct rt_memheap *heap)
{
RT_ASSERT(heap);
+ RT_ASSERT(rt_object_get_type(&heap->parent) == RT_Object_Class_MemHeap);
+ RT_ASSERT(rt_object_is_systemobject(&heap->parent));
rt_object_detach(&(heap->lock.parent.parent));
rt_object_detach(&(heap->parent));
@@ -150,6 +152,7 @@ void *rt_memheap_alloc(struct rt_memheap *heap, rt_uint32_t size)
struct rt_memheap_item *header_ptr;
RT_ASSERT(heap != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&heap->parent) == RT_Object_Class_MemHeap);
/* align allocated size */
size = RT_ALIGN(size, RT_ALIGN_SIZE);
@@ -295,6 +298,9 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
struct rt_memheap_item *header_ptr;
struct rt_memheap_item *new_ptr;
+ RT_ASSERT(heap);
+ RT_ASSERT(rt_object_get_type(&heap->parent) == RT_Object_Class_MemHeap);
+
if (newsize == 0)
{
rt_memheap_free(ptr);
@@ -524,6 +530,9 @@ void rt_memheap_free(void *ptr)
/* get pool ptr */
heap = header_ptr->pool_ptr;
+ RT_ASSERT(heap);
+ RT_ASSERT(rt_object_get_type(&heap->parent) == RT_Object_Class_MemHeap);
+
/* lock memheap */
result = rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
if (result != RT_EOK)
@@ -631,6 +640,9 @@ void *rt_malloc(rt_size_t size)
object = rt_list_entry(node, struct rt_object, list);
heap = (struct rt_memheap *)object;
+ RT_ASSERT(heap);
+ RT_ASSERT(rt_object_get_type(&heap->parent) == RT_Object_Class_MemHeap);
+
/* not allocate in the default system heap */
if (heap == &_heap)
continue;
diff --git a/src/mempool.c b/src/mempool.c
index 5d80d66533..cd98e8c14e 100644
--- a/src/mempool.c
+++ b/src/mempool.c
@@ -150,6 +150,8 @@ rt_err_t rt_mp_detach(struct rt_mempool *mp)
/* parameter check */
RT_ASSERT(mp != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mp->parent) == RT_Object_Class_MemPool);
+ RT_ASSERT(rt_object_is_systemobject(&mp->parent));
/* wake up all suspended threads */
while (!rt_list_isempty(&(mp->suspend_thread)))
@@ -266,6 +268,8 @@ rt_err_t rt_mp_delete(rt_mp_t mp)
/* parameter check */
RT_ASSERT(mp != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mp->parent) == RT_Object_Class_MemPool);
+ RT_ASSERT(rt_object_is_systemobject(&mp->parent) == RT_FALSE);
/* wake up all suspended threads */
while (!rt_list_isempty(&(mp->suspend_thread)))
@@ -292,15 +296,8 @@ rt_err_t rt_mp_delete(rt_mp_t mp)
rt_hw_interrupt_enable(temp);
}
-#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
- /* the mp object belongs to an application module */
- if (mp->parent.flag & RT_OBJECT_FLAG_MODULE)
- rt_module_free(mp->parent.module_id, mp->start_address);
- else
-#endif
-
- /* release allocated room */
- rt_free(mp->start_address);
+ /* release allocated room */
+ rt_free(mp->start_address);
/* detach object */
rt_object_delete(&(mp->parent));
diff --git a/src/module.c b/src/module.c
index b9801558dc..89ab7735bd 100644
--- a/src/module.c
+++ b/src/module.c
@@ -65,30 +65,6 @@
#define RT_USING_MODULE_PRIO (RT_THREAD_PRIORITY_MAX - 2)
#endif
-#ifdef RT_USING_SLAB
-#define PAGE_COUNT_MAX 256
-
-/* module memory allocator */
-struct rt_mem_head
-{
- rt_size_t size; /* size of memory block */
- struct rt_mem_head *next; /* next valid memory block */
-};
-
-struct rt_page_info
-{
- rt_uint32_t *page_ptr;
- rt_uint32_t npage;
-};
-
-static void *rt_module_malloc_page(rt_size_t npages);
-static void rt_module_free_page(rt_module_t module,
- void *page_ptr,
- rt_size_t npages);
-
-static struct rt_semaphore mod_sem;
-#endif
-
static struct rt_module_symtab *_rt_module_symtab_begin = RT_NULL;
static struct rt_module_symtab *_rt_module_symtab_end = RT_NULL;
@@ -120,10 +96,6 @@ int rt_system_module_init(void)
_rt_module_symtab_end = __section_end("RTMSymTab");
#endif
-#ifdef RT_USING_SLAB
- /* initialize heap semaphore */
- rt_sem_init(&mod_sem, "module", 1, RT_IPC_FLAG_FIFO);
-#endif
return 0;
}
INIT_COMPONENT_EXPORT(rt_system_module_init);
@@ -138,7 +110,7 @@ void list_symbol(void)
index != _rt_module_symtab_end;
index ++)
{
- rt_kprintf("%s\n", index->name);
+ rt_kprintf("%s => 0x%08x\n", index->name, index->addr);
}
return ;
@@ -295,80 +267,6 @@ static int rt_module_arm_relocate(struct rt_module *module,
return 0;
}
-void rt_module_init_object_container(struct rt_module *module)
-{
- RT_ASSERT(module != RT_NULL);
-
- /* clear all of object information */
- rt_memset(&module->module_object[0], 0x0, sizeof(module->module_object));
-
- /* initialize object container - thread */
- rt_list_init(&(module->module_object[RT_Object_Class_Thread].object_list));
- module->module_object[RT_Object_Class_Thread].object_size = sizeof(struct rt_thread);
- module->module_object[RT_Object_Class_Thread].type = RT_Object_Class_Thread;
-
-#ifdef RT_USING_SEMAPHORE
- /* initialize object container - semaphore */
- rt_list_init(&(module->module_object[RT_Object_Class_Semaphore].object_list));
- module->module_object[RT_Object_Class_Semaphore].object_size = sizeof(struct rt_semaphore);
- module->module_object[RT_Object_Class_Semaphore].type = RT_Object_Class_Semaphore;
-#endif
-
-#ifdef RT_USING_MUTEX
- /* initialize object container - mutex */
- rt_list_init(&(module->module_object[RT_Object_Class_Mutex].object_list));
- module->module_object[RT_Object_Class_Mutex].object_size = sizeof(struct rt_mutex);
- module->module_object[RT_Object_Class_Mutex].type = RT_Object_Class_Mutex;
-#endif
-
-#ifdef RT_USING_EVENT
- /* initialize object container - event */
- rt_list_init(&(module->module_object[RT_Object_Class_Event].object_list));
- module->module_object[RT_Object_Class_Event].object_size = sizeof(struct rt_event);
- module->module_object[RT_Object_Class_Event].type = RT_Object_Class_Event;
-#endif
-
-#ifdef RT_USING_MAILBOX
- /* initialize object container - mailbox */
- rt_list_init(&(module->module_object[RT_Object_Class_MailBox].object_list));
- module->module_object[RT_Object_Class_MailBox].object_size = sizeof(struct rt_mailbox);
- module->module_object[RT_Object_Class_MailBox].type = RT_Object_Class_MailBox;
-#endif
-
-#ifdef RT_USING_MESSAGEQUEUE
- /* initialize object container - message queue */
- rt_list_init(&(module->module_object[RT_Object_Class_MessageQueue].object_list));
- module->module_object[RT_Object_Class_MessageQueue].object_size = sizeof(struct rt_messagequeue);
- module->module_object[RT_Object_Class_MessageQueue].type = RT_Object_Class_MessageQueue;
-#endif
-
-#ifdef RT_USING_MEMHEAP
- /* initialize object container - memory heap */
- rt_list_init(&(module->module_object[RT_Object_Class_MemHeap].object_list));
- module->module_object[RT_Object_Class_MemHeap].object_size = sizeof(struct rt_memheap);
- module->module_object[RT_Object_Class_MemHeap].type = RT_Object_Class_MemHeap;
-#endif
-
-#ifdef RT_USING_MEMPOOL
- /* initialize object container - memory pool */
- rt_list_init(&(module->module_object[RT_Object_Class_MemPool].object_list));
- module->module_object[RT_Object_Class_MemPool].object_size = sizeof(struct rt_mempool);
- module->module_object[RT_Object_Class_MemPool].type = RT_Object_Class_MemPool;
-#endif
-
-#ifdef RT_USING_DEVICE
- /* initialize object container - device */
- rt_list_init(&(module->module_object[RT_Object_Class_Device].object_list));
- module->module_object[RT_Object_Class_Device].object_size = sizeof(struct rt_device);
- module->module_object[RT_Object_Class_Device].type = RT_Object_Class_Device;
-#endif
-
- /* initialize object container - timer */
- rt_list_init(&(module->module_object[RT_Object_Class_Timer].object_list));
- module->module_object[RT_Object_Class_Timer].object_size = sizeof(struct rt_timer);
- module->module_object[RT_Object_Class_Timer].type = RT_Object_Class_Timer;
-}
-
#ifdef RT_USING_HOOK
static void (*rt_module_load_hook)(rt_module_t module);
static void (*rt_module_unload_hook)(rt_module_t module);
@@ -636,7 +534,7 @@ static struct rt_module *_load_shared_object(const char *name,
length = rt_strlen((const char *)(strtab + symtab[i].st_name)) + 1;
module->symtab[count].addr =
- (void *)(module->module_space + symtab[i].st_value);
+ (void *)(module->module_space + symtab[i].st_value - module->vstart_addr);
module->symtab[count].name = rt_malloc(length);
rt_memset((void *)module->symtab[count].name, 0, length);
rt_memcpy((void *)module->symtab[count].name,
@@ -1016,9 +914,6 @@ rt_module_t rt_module_do_main(const char *name,
if (module == RT_NULL)
return RT_NULL;
- /* init module object container */
- rt_module_init_object_container(module);
-
if (line_size && cmd_line)
{
/* set module argument */
@@ -1042,16 +937,6 @@ rt_module_t rt_module_do_main(const char *name,
if (elf_module->e_entry != 0)
{
-#ifdef RT_USING_SLAB
- /* init module memory allocator */
- module->mem_list = RT_NULL;
-
- /* create page array */
- module->page_array =
- (void *)rt_malloc(PAGE_COUNT_MAX * sizeof(struct rt_page_info));
- module->page_cnt = 0;
-#endif
-
/* create module thread */
module->module_thread = rt_thread_create(name,
module_main_entry, module,
@@ -1291,14 +1176,13 @@ FINSH_FUNCTION_EXPORT_ALIAS(rt_module_open, exec, exec module from a file);
rt_err_t rt_module_destroy(rt_module_t module)
{
int i;
- struct rt_object *object;
- struct rt_list_node *list;
RT_DEBUG_NOT_IN_INTERRUPT;
/* check parameter */
RT_ASSERT(module != RT_NULL);
RT_ASSERT(module->nref == 0);
+ RT_ASSERT(rt_object_get_type(&module->parent) == RT_Object_Class_Module);
RT_DEBUG_LOG(RT_DEBUG_MODULE, ("rt_module_destroy: %8.*s\n",
RT_NAME_MAX, module->parent.name));
@@ -1306,147 +1190,6 @@ rt_err_t rt_module_destroy(rt_module_t module)
/* module has entry point */
if (!(module->parent.flag & RT_MODULE_FLAG_WITHOUTENTRY))
{
-#ifdef RT_USING_SEMAPHORE
- /* delete semaphores */
- list = &module->module_object[RT_Object_Class_Semaphore].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_sem_detach((rt_sem_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_sem_delete((rt_sem_t)object);
- }
- }
-#endif
-
-#ifdef RT_USING_MUTEX
- /* delete mutexs*/
- list = &module->module_object[RT_Object_Class_Mutex].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_mutex_detach((rt_mutex_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_mutex_delete((rt_mutex_t)object);
- }
- }
-#endif
-
-#ifdef RT_USING_EVENT
- /* delete mailboxs */
- list = &module->module_object[RT_Object_Class_Event].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_event_detach((rt_event_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_event_delete((rt_event_t)object);
- }
- }
-#endif
-
-#ifdef RT_USING_MAILBOX
- /* delete mailboxs */
- list = &module->module_object[RT_Object_Class_MailBox].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_mb_detach((rt_mailbox_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_mb_delete((rt_mailbox_t)object);
- }
- }
-#endif
-
-#ifdef RT_USING_MESSAGEQUEUE
- /* delete msgqueues */
- list = &module->module_object[RT_Object_Class_MessageQueue].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_mq_detach((rt_mq_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_mq_delete((rt_mq_t)object);
- }
- }
-#endif
-
-#ifdef RT_USING_MEMPOOL
- /* delete mempools */
- list = &module->module_object[RT_Object_Class_MemPool].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_mp_detach((rt_mp_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_mp_delete((rt_mp_t)object);
- }
- }
-#endif
-
-#ifdef RT_USING_DEVICE
- /* delete devices */
- list = &module->module_object[RT_Object_Class_Device].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- rt_device_unregister((rt_device_t)object);
- }
-#endif
-
- /* delete timers */
- list = &module->module_object[RT_Object_Class_Timer].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_timer_detach((rt_timer_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_timer_delete((rt_timer_t)object);
- }
- }
-
/* delete command line */
if (module->module_cmd_line != RT_NULL)
{
@@ -1454,20 +1197,6 @@ rt_err_t rt_module_destroy(rt_module_t module)
}
}
-#ifdef RT_USING_SLAB
- if (module->page_cnt > 0)
- {
- struct rt_page_info *page = (struct rt_page_info *)module->page_array;
-
- rt_kprintf("Module: warning - memory still hasn't been free finished\n");
-
- while (module->page_cnt != 0)
- {
- rt_module_free_page(module, page[0].page_ptr, page[0].npage);
- }
- }
-#endif
-
/* release module space memory */
rt_free(module->module_space);
@@ -1479,11 +1208,6 @@ rt_err_t rt_module_destroy(rt_module_t module)
if (module->symtab != RT_NULL)
rt_free(module->symtab);
-#ifdef RT_USING_SLAB
- if (module->page_array != RT_NULL)
- rt_free(module->page_array);
-#endif
-
/* delete module object */
rt_object_delete((rt_object_t)module);
@@ -1499,9 +1223,6 @@ rt_err_t rt_module_destroy(rt_module_t module)
*/
rt_err_t rt_module_unload(rt_module_t module)
{
- struct rt_object *object;
- struct rt_list_node *list;
-
RT_DEBUG_NOT_IN_INTERRUPT;
/* check parameter */
@@ -1509,31 +1230,7 @@ rt_err_t rt_module_unload(rt_module_t module)
return -RT_ERROR;
rt_enter_critical();
- if (!(module->parent.flag & RT_MODULE_FLAG_WITHOUTENTRY))
- {
- /* delete all sub-threads */
- list = &module->module_object[RT_Object_Class_Thread].object_list;
- while (list->next != list)
- {
- object = rt_list_entry(list->next, struct rt_object, list);
- if (rt_object_is_systemobject(object) == RT_TRUE)
- {
- /* detach static object */
- rt_thread_detach((rt_thread_t)object);
- }
- else
- {
- /* delete dynamic object */
- rt_thread_delete((rt_thread_t)object);
- }
- }
-
- /* delete the main thread of module */
- if (module->module_thread != RT_NULL)
- {
- rt_thread_delete(module->module_thread);
- }
- }
+ /* invoke module cleanup */
rt_exit_critical();
#ifdef RT_USING_HOOK
@@ -1589,462 +1286,4 @@ rt_module_t rt_module_find(const char *name)
}
RTM_EXPORT(rt_module_find);
-#ifdef RT_USING_SLAB
-/*
- * This function will allocate the numbers page with specified size
- * in page memory.
- *
- * @param size the size of memory to be allocated.
- * @note this function is used for RT-Thread Application Module
- */
-static void *rt_module_malloc_page(rt_size_t npages)
-{
- void *chunk;
- struct rt_page_info *page;
- rt_module_t self_module;
-
- self_module = rt_module_self();
- RT_ASSERT(self_module != RT_NULL);
-
- chunk = rt_page_alloc(npages);
- if (chunk == RT_NULL)
- return RT_NULL;
-
- page = (struct rt_page_info *)self_module->page_array;
- page[self_module->page_cnt].page_ptr = chunk;
- page[self_module->page_cnt].npage = npages;
- self_module->page_cnt ++;
-
- RT_ASSERT(self_module->page_cnt <= PAGE_COUNT_MAX);
- RT_DEBUG_LOG(RT_DEBUG_MODULE, ("rt_module_malloc_page 0x%x %d\n",
- chunk, npages));
-
- return chunk;
-}
-
-/*
- * This function will release the previously allocated memory page
- * by rt_malloc_page.
- *
- * @param page_ptr the page address to be released.
- * @param npages the number of page shall be released.
- *
- * @note this function is used for RT-Thread Application Module
- */
-static void rt_module_free_page(rt_module_t module,
- void *page_ptr,
- rt_size_t npages)
-{
- int i, index;
- struct rt_page_info *page;
- rt_module_t self_module;
-
- self_module = rt_module_self();
- RT_ASSERT(self_module != RT_NULL);
-
- RT_DEBUG_LOG(RT_DEBUG_MODULE, ("rt_module_free_page 0x%x %d\n",
- page_ptr, npages));
- rt_page_free(page_ptr, npages);
-
- page = (struct rt_page_info *)module->page_array;
-
- for (i = 0; i < module->page_cnt; i ++)
- {
- if (page[i].page_ptr == page_ptr)
- {
- if (page[i].npage == npages + 1)
- {
- page[i].page_ptr +=
- npages * RT_MM_PAGE_SIZE / sizeof(rt_uint32_t);
- page[i].npage -= npages;
- }
- else if (page[i].npage == npages)
- {
- for (index = i; index < module->page_cnt - 1; index ++)
- {
- page[index].page_ptr = page[index + 1].page_ptr;
- page[index].npage = page[index + 1].npage;
- }
- page[module->page_cnt - 1].page_ptr = RT_NULL;
- page[module->page_cnt - 1].npage = 0;
-
- module->page_cnt --;
- }
- else
- RT_ASSERT(RT_FALSE);
- self_module->page_cnt --;
-
- return;
- }
- }
-
- /* should not get here */
- RT_ASSERT(RT_FALSE);
-}
-
-/**
- * rt_module_malloc - allocate memory block in free list
- */
-void *rt_module_malloc(rt_size_t size)
-{
- struct rt_mem_head *b, *n, *up;
- struct rt_mem_head **prev;
- rt_uint32_t npage;
- rt_size_t nunits;
- rt_module_t self_module;
-
- self_module = rt_module_self();
- RT_ASSERT(self_module != RT_NULL);
-
- RT_DEBUG_NOT_IN_INTERRUPT;
-
- nunits = (size + sizeof(struct rt_mem_head) - 1) /
- sizeof(struct rt_mem_head)
- + 1;
-
- RT_ASSERT(size != 0);
- RT_ASSERT(nunits != 0);
-
- rt_sem_take(&mod_sem, RT_WAITING_FOREVER);
-
- for (prev = (struct rt_mem_head **)&self_module->mem_list;
- (b = *prev) != RT_NULL;
- prev = &(b->next))
- {
- if (b->size > nunits)
- {
- /* split memory */
- n = b + nunits;
- n->next = b->next;
- n->size = b->size - nunits;
- b->size = nunits;
- *prev = n;
-
- RT_DEBUG_LOG(RT_DEBUG_MODULE, ("rt_module_malloc 0x%x, %d\n",
- b + 1, size));
- rt_sem_release(&mod_sem);
-
- return (void *)(b + 1);
- }
-
- if (b->size == nunits)
- {
- /* this node fit, remove this node */
- *prev = b->next;
-
- RT_DEBUG_LOG(RT_DEBUG_MODULE, ("rt_module_malloc 0x%x, %d\n",
- b + 1, size));
-
- rt_sem_release(&mod_sem);
-
- return (void *)(b + 1);
- }
- }
-
- /* allocate pages from system heap */
- npage = (size + sizeof(struct rt_mem_head) + RT_MM_PAGE_SIZE - 1) /
- RT_MM_PAGE_SIZE;
- if ((up = (struct rt_mem_head *)rt_module_malloc_page(npage)) == RT_NULL)
- return RT_NULL;
-
- up->size = npage * RT_MM_PAGE_SIZE / sizeof(struct rt_mem_head);
-
- for (prev = (struct rt_mem_head **)&self_module->mem_list;
- (b = *prev) != RT_NULL;
- prev = &(b->next))
- {
- if (b > up + up->size)
- break;
- }
-
- up->next = b;
- *prev = up;
-
- rt_sem_release(&mod_sem);
-
- return rt_module_malloc(size);
-}
-
-/**
- * rt_module_free - free memory block in free list
- */
-void rt_module_free(rt_module_t module, void *addr)
-{
- struct rt_mem_head *b, *n, *r;
- struct rt_mem_head **prev;
-
- RT_DEBUG_NOT_IN_INTERRUPT;
-
- RT_ASSERT(addr);
- RT_ASSERT((((rt_uint32_t)addr) & (sizeof(struct rt_mem_head) - 1)) == 0);
-
- RT_DEBUG_LOG(RT_DEBUG_MODULE, ("rt_module_free 0x%x\n", addr));
-
- rt_sem_take(&mod_sem, RT_WAITING_FOREVER);
-
- n = (struct rt_mem_head *)addr - 1;
- prev = (struct rt_mem_head **)&module->mem_list;
-
- while ((b = *prev) != RT_NULL)
- {
- RT_ASSERT(b->size > 0);
- RT_ASSERT(b > n || b + b->size <= n);
-
- if (b + b->size == n && ((rt_uint32_t)n % RT_MM_PAGE_SIZE != 0))
- {
- if (b + (b->size + n->size) == b->next)
- {
- b->size += b->next->size + n->size;
- b->next = b->next->next;
- }
- else
- b->size += n->size;
-
- if ((rt_uint32_t)b % RT_MM_PAGE_SIZE == 0)
- {
- int npage =
- b->size * sizeof(struct rt_page_info) / RT_MM_PAGE_SIZE;
- if (npage > 0)
- {
- if ((b->size * sizeof(struct rt_page_info) % RT_MM_PAGE_SIZE) != 0)
- {
- rt_size_t nunits = npage *
- RT_MM_PAGE_SIZE /
- sizeof(struct rt_mem_head);
- /* split memory */
- r = b + nunits;
- r->next = b->next;
- r->size = b->size - nunits;
- *prev = r;
- }
- else
- {
- *prev = b->next;
- }
-
- rt_module_free_page(module, b, npage);
- }
- }
-
- /* unlock */
- rt_sem_release(&mod_sem);
-
- return;
- }
-
- if (b == n + n->size)
- {
- n->size = b->size + n->size;
- n->next = b->next;
-
- if ((rt_uint32_t)n % RT_MM_PAGE_SIZE == 0)
- {
- int npage =
- n->size * sizeof(struct rt_page_info) / RT_MM_PAGE_SIZE;
- if (npage > 0)
- {
- if ((n->size * sizeof(struct rt_page_info) % RT_MM_PAGE_SIZE) != 0)
- {
- rt_size_t nunits = npage *
- RT_MM_PAGE_SIZE /
- sizeof(struct rt_mem_head);
- /* split memory */
- r = n + nunits;
- r->next = n->next;
- r->size = n->size - nunits;
- *prev = r;
- }
- else
- *prev = n->next;
-
- rt_module_free_page(module, n, npage);
- }
- }
- else
- {
- *prev = n;
- }
-
- /* unlock */
- rt_sem_release(&mod_sem);
-
- return;
- }
- if (b > n + n->size)
- break;
-
- prev = &(b->next);
- }
-
- if ((rt_uint32_t)n % RT_MM_PAGE_SIZE == 0)
- {
- int npage = n->size * sizeof(struct rt_page_info) / RT_MM_PAGE_SIZE;
- if (npage > 0)
- {
- rt_module_free_page(module, n, npage);
- if (n->size % RT_MM_PAGE_SIZE != 0)
- {
- rt_size_t nunits =
- npage * RT_MM_PAGE_SIZE / sizeof(struct rt_mem_head);
- /* split memory */
- r = n + nunits;
- r->next = b;
- r->size = n->size - nunits;
- *prev = r;
- }
- else
- {
- *prev = b;
- }
- }
- }
- else
- {
- n->next = b;
- *prev = n;
- }
-
- /* unlock */
- rt_sem_release(&mod_sem);
-}
-
-/**
- * rt_module_realloc - realloc memory block in free list
- */
-void *rt_module_realloc(void *ptr, rt_size_t size)
-{
- struct rt_mem_head *b, *p, *prev, *tmpp;
- rt_size_t nunits;
- rt_module_t self_module;
-
- self_module = rt_module_self();
- RT_ASSERT(self_module != RT_NULL);
-
- RT_DEBUG_NOT_IN_INTERRUPT;
-
- if (!ptr)
- return rt_module_malloc(size);
- if (size == 0)
- {
- rt_module_free(self_module, ptr);
-
- return RT_NULL;
- }
-
- nunits = (size + sizeof(struct rt_mem_head) - 1) /
- sizeof(struct rt_mem_head)
- + 1;
- b = (struct rt_mem_head *)ptr - 1;
-
- if (nunits <= b->size)
- {
- /* new size is smaller or equal then before */
- if (nunits == b->size)
- return ptr;
- else
- {
- p = b + nunits;
- p->size = b->size - nunits;
- b->size = nunits;
- rt_module_free(self_module, (void *)(p + 1));
-
- return (void *)(b + 1);
- }
- }
- else
- {
- /* more space then required */
- prev = (struct rt_mem_head *)self_module->mem_list;
- for (p = prev->next;
- p != (b->size + b) && p != RT_NULL;
- prev = p, p = p->next)
- {
- break;
- }
-
- /* available block after ap in freelist */
- if (p != RT_NULL &&
- (p->size >= (nunits - (b->size))) &&
- p == (b + b->size))
- {
- /* perfect match */
- if (p->size == (nunits - (b->size)))
- {
- b->size = nunits;
- prev->next = p->next;
- }
- else /* more space then required, split block */
- {
- /* pointer to old header */
- tmpp = p;
- p = b + nunits;
-
- /* restoring old pointer */
- p->next = tmpp->next;
-
- /* new size for p */
- p->size = tmpp->size + b->size - nunits;
- b->size = nunits;
- prev->next = p;
- }
- self_module->mem_list = (void *)prev;
-
- return (void *)(b + 1);
- }
- else /* allocate new memory and copy old data */
- {
- if ((p = rt_module_malloc(size)) == RT_NULL)
- return RT_NULL;
- rt_memmove(p, (b + 1), ((b->size) * sizeof(struct rt_mem_head)));
- rt_module_free(self_module, (void *)(b + 1));
-
- return (void *)(p);
- }
- }
-}
-
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-
-void list_memlist(const char *name)
-{
- rt_module_t module;
- struct rt_mem_head **prev;
- struct rt_mem_head *b;
-
- module = rt_module_find(name);
- if (module == RT_NULL)
- return;
-
- for (prev = (struct rt_mem_head **)&module->mem_list;
- (b = *prev) != RT_NULL;
- prev = &(b->next))
- {
- rt_kprintf("0x%x--%d\n", b, b->size * sizeof(struct rt_mem_head));
- }
-}
-FINSH_FUNCTION_EXPORT(list_memlist, list module free memory information)
-
-void list_mempage(const char *name)
-{
- rt_module_t module;
- struct rt_page_info *page;
- int i;
-
- module = rt_module_find(name);
- if (module == RT_NULL)
- return;
-
- page = (struct rt_page_info *)module->page_array;
-
- for (i = 0; i < module->page_cnt; i ++)
- {
- rt_kprintf("0x%x--%d\n", page[i].page_ptr, page[i].npage);
- }
-}
-FINSH_FUNCTION_EXPORT(list_mempage, list module using memory page information)
-#endif /* RT_USING_FINSH */
-
-#endif /* RT_USING_SLAB */
-
#endif
diff --git a/src/object.c b/src/object.c
index 14d5f1cf3b..b09af9ddee 100644
--- a/src/object.c
+++ b/src/object.c
@@ -252,15 +252,9 @@ void rt_object_init(struct rt_object *object,
register rt_base_t temp;
struct rt_object_information *information;
-#ifdef RT_USING_MODULE
- /* get module object information */
- information = (rt_module_self() != RT_NULL) ?
- &rt_module_self()->module_object[type] : rt_object_get_information(type);
-#else
/* get object information */
information = rt_object_get_information(type);
RT_ASSERT(information != RT_NULL);
-#endif
/* initialize object's parameters */
@@ -297,6 +291,9 @@ void rt_object_detach(rt_object_t object)
RT_OBJECT_HOOK_CALL(rt_object_detach_hook, (object));
+ /* reset object type */
+ object->type = 0;
+
/* lock interrupt */
temp = rt_hw_interrupt_disable();
@@ -324,18 +321,9 @@ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char *name)
RT_DEBUG_NOT_IN_INTERRUPT;
-#ifdef RT_USING_MODULE
- /*
- * get module object information,
- * module object should be managed by kernel object container
- */
- information = (rt_module_self() != RT_NULL && (type != RT_Object_Class_Module)) ?
- &rt_module_self()->module_object[type] : rt_object_get_information(type);
-#else
/* get object information */
information = rt_object_get_information(type);
RT_ASSERT(information != RT_NULL);
-#endif
object = (struct rt_object *)RT_KERNEL_MALLOC(information->object_size);
if (object == RT_NULL)
@@ -393,6 +381,9 @@ void rt_object_delete(rt_object_t object)
RT_OBJECT_HOOK_CALL(rt_object_detach_hook, (object));
+ /* reset object type */
+ object->type = 0;
+
/* lock interrupt */
temp = rt_hw_interrupt_disable();
@@ -402,14 +393,8 @@ void rt_object_delete(rt_object_t object)
/* unlock interrupt */
rt_hw_interrupt_enable(temp);
-#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
- if (object->flag & RT_OBJECT_FLAG_MODULE)
- rt_module_free((rt_module_t)object->module_id, object);
- else
-#endif
-
- /* free the memory of object */
- RT_KERNEL_FREE(object);
+ /* free the memory of object */
+ RT_KERNEL_FREE(object);
}
#endif
@@ -434,6 +419,22 @@ rt_bool_t rt_object_is_systemobject(rt_object_t object)
}
/**
+ * This function will return the type of object without
+ * RT_Object_Class_Static flag.
+ *
+ * @param object the specified object to be get type.
+ *
+ * @return the type of object.
+ */
+rt_uint8_t rt_object_get_type(rt_object_t object)
+{
+ /* object check */
+ RT_ASSERT(object != RT_NULL);
+
+ return object->type & ~RT_Object_Class_Static;
+}
+
+/**
* This function will find specified name object from object
* container.
*
@@ -458,65 +459,6 @@ rt_object_t rt_object_find(const char *name, rt_uint8_t type)
/* which is invoke in interrupt status */
RT_DEBUG_NOT_IN_INTERRUPT;
-#ifdef RT_USING_MODULE
- /* check whether to find a object inside a module. */
- {
- const char *name_ptr;
- int module_name_length;
-
- name_ptr = name;
- while ((*name_ptr != '\0') && (*name_ptr != '/'))
- name_ptr ++;
-
- if (*name_ptr == '/')
- {
- struct rt_module *module = RT_NULL;
-
- /* get the name length of module */
- module_name_length = name_ptr - name;
-
- /* enter critical */
- rt_enter_critical();
-
- /* find module */
- information = rt_object_get_information(RT_Object_Class_Module);
- RT_ASSERT(information != RT_NULL);
-
- for (node = information->object_list.next;
- node != &(information->object_list);
- node = node->next)
- {
- object = rt_list_entry(node, struct rt_object, list);
- if ((rt_strncmp(object->name, name, module_name_length) == 0) &&
- (module_name_length == RT_NAME_MAX || object->name[module_name_length] == '\0'))
- {
- /* get module */
- module = (struct rt_module *)object;
- break;
- }
- }
- rt_exit_critical();
-
- /* there is no this module inside the system */
- if (module == RT_NULL) return RT_NULL;
-
- /* get the object pool of module */
- information = &(module->module_object[type]);
-
- /* get object name */
- while ((*name_ptr == '/') && (*name_ptr != '\0')) name_ptr ++;
- if (*name_ptr == '\0')
- {
- if (type == RT_Object_Class_Module) return object;
- return RT_NULL;
- }
-
- /* point to the object name */
- name = name_ptr;
- }
- }
-#endif
-
/* enter critical */
rt_enter_critical();
diff --git a/src/signal.c b/src/signal.c
index 68b3836a85..5b93c774df 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -35,7 +35,7 @@
#endif
// #define DBG_ENABLE
-#define DBG_SECTION_NAME "[SIGN]"
+#define DBG_SECTION_NAME "SIGN"
#define DBG_COLOR
#define DBG_LEVEL DBG_LOG
#include <rtdbg.h>
@@ -45,7 +45,7 @@
struct siginfo_node
{
- struct siginfo si;
+ siginfo_t si;
struct rt_slist_node list;
};
@@ -339,7 +339,7 @@ void rt_thread_handle_sig(rt_bool_t clean_state)
level = rt_hw_interrupt_disable();
tid->sig_pending &= ~sig_mask(signo);
- error = si_node->si.si_errno;
+ error = -RT_EINTR;
rt_mp_free(si_node); /* release this siginfo node */
/* set errno in thread tcb */
@@ -419,7 +419,6 @@ int rt_thread_kill(rt_thread_t tid, int sig)
if (!sig_valid(sig)) return -RT_EINVAL;
dbg_log(DBG_INFO, "send signal: %d\n", sig);
- si.si_errno = RT_EINTR;
si.si_signo = sig;
si.si_code = SI_USER;
si.si_value.sival_ptr = RT_NULL;
diff --git a/src/slab.c b/src/slab.c
index 5e6a204896..16c68a2408 100644
--- a/src/slab.c
+++ b/src/slab.c
@@ -496,11 +496,6 @@ void *rt_malloc(rt_size_t size)
if (size == 0)
return RT_NULL;
-#ifdef RT_USING_MODULE
- if (rt_module_self() != RT_NULL)
- return rt_module_malloc(size);
-#endif
-
/*
* Handle large allocations directly. There should not be very many of
* these so performance is not a big issue.
@@ -705,11 +700,6 @@ void *rt_realloc(void *ptr, rt_size_t size)
return RT_NULL;
}
-#ifdef RT_USING_MODULE
- if (rt_module_self() != RT_NULL)
- return rt_module_realloc(ptr, size);
-#endif
-
/*
* Get the original allocation's zone. If the new request winds up
* using the same chunk size we do not have to do anything.
@@ -800,15 +790,6 @@ void rt_free(void *ptr)
RT_OBJECT_HOOK_CALL(rt_free_hook, (ptr));
-#ifdef RT_USING_MODULE
- if (rt_module_self() != RT_NULL)
- {
- rt_module_free(rt_module_self(), ptr);
-
- return;
- }
-#endif
-
/* get memory usage */
#if RT_DEBUG_SLAB
{
diff --git a/src/thread.c b/src/thread.c
index ea0ba0bfc9..b3d91b30d0 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -199,6 +199,10 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
thread->si_list = RT_NULL;
#endif
+#ifdef RT_USING_LWP
+ thread->lwp = RT_NULL;
+#endif
+
RT_OBJECT_HOOK_CALL(rt_thread_inited_hook, (thread));
return RT_EOK;
@@ -275,6 +279,7 @@ rt_err_t rt_thread_startup(rt_thread_t thread)
/* thread check */
RT_ASSERT(thread != RT_NULL);
RT_ASSERT((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_INIT);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
/* set current priority to init priority */
thread->current_priority = thread->init_priority;
@@ -318,6 +323,8 @@ rt_err_t rt_thread_detach(rt_thread_t thread)
/* thread check */
RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
+ RT_ASSERT(rt_object_is_systemobject((rt_object_t)thread));
if ((thread->stat & RT_THREAD_STAT_MASK) != RT_THREAD_INIT)
{
@@ -416,6 +423,8 @@ rt_err_t rt_thread_delete(rt_thread_t thread)
/* thread check */
RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
+ RT_ASSERT(rt_object_is_systemobject((rt_object_t)thread) == RT_FALSE);
if ((thread->stat & RT_THREAD_STAT_MASK) != RT_THREAD_INIT)
{
@@ -504,6 +513,7 @@ rt_err_t rt_thread_sleep(rt_tick_t tick)
/* set to current thread */
thread = rt_current_thread;
RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
/* suspend thread */
rt_thread_suspend(thread);
@@ -538,6 +548,23 @@ rt_err_t rt_thread_delay(rt_tick_t tick)
RTM_EXPORT(rt_thread_delay);
/**
+ * This function will let current thread delay for some milliseconds.
+ *
+ * @param tick the delay time
+ *
+ * @return RT_EOK
+ */
+rt_err_t rt_thread_mdelay(rt_int32_t ms)
+{
+ rt_tick_t tick;
+
+ tick = rt_tick_from_millisecond(ms);
+
+ return rt_thread_sleep(tick);
+}
+RTM_EXPORT(rt_thread_mdelay);
+
+/**
* This function will control thread behaviors according to control command.
*
* @param thread the specified thread to be controlled
@@ -555,6 +582,7 @@ rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg)
/* thread check */
RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
switch (cmd)
{
@@ -633,6 +661,7 @@ rt_err_t rt_thread_suspend(rt_thread_t thread)
/* thread check */
RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
RT_DEBUG_LOG(RT_DEBUG_THREAD, ("thread suspend: %s\n", thread->name));
@@ -675,6 +704,7 @@ rt_err_t rt_thread_resume(rt_thread_t thread)
/* thread check */
RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
RT_DEBUG_LOG(RT_DEBUG_THREAD, ("thread resume: %s\n", thread->name));
@@ -720,6 +750,7 @@ void rt_thread_timeout(void *parameter)
/* thread check */
RT_ASSERT(thread != RT_NULL);
RT_ASSERT((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
/* set error number */
thread->error = -RT_ETIMEOUT;
diff --git a/src/timer.c b/src/timer.c
index d6cf486931..8354d43a43 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -207,6 +207,8 @@ rt_err_t rt_timer_detach(rt_timer_t timer)
/* timer check */
RT_ASSERT(timer != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer);
+ RT_ASSERT(rt_object_is_systemobject(&timer->parent));
/* disable interrupt */
level = rt_hw_interrupt_disable();
@@ -268,6 +270,8 @@ rt_err_t rt_timer_delete(rt_timer_t timer)
/* timer check */
RT_ASSERT(timer != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer);
+ RT_ASSERT(rt_object_is_systemobject(&timer->parent) == RT_FALSE);
/* disable interrupt */
level = rt_hw_interrupt_disable();
@@ -302,6 +306,7 @@ rt_err_t rt_timer_start(rt_timer_t timer)
/* timer check */
RT_ASSERT(timer != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer);
/* stop timer firstly */
level = rt_hw_interrupt_disable();
@@ -422,6 +427,8 @@ rt_err_t rt_timer_stop(rt_timer_t timer)
/* timer check */
RT_ASSERT(timer != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer);
+
if (!(timer->parent.flag & RT_TIMER_FLAG_ACTIVATED))
return -RT_ERROR;
@@ -455,6 +462,7 @@ rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg)
{
/* timer check */
RT_ASSERT(timer != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer);
switch (cmd)
{