diff options
| author | guochuangjian <[email protected]> | 2018-08-05 15:08:50 +0800 |
|---|---|---|
| committer | guochuangjian <[email protected]> | 2018-08-05 15:08:50 +0800 |
| commit | 3de51fe25688f0b6c7cb9f9d424861654fb09e49 (patch) | |
| tree | dcf4a170b00deace7860187e3ff9c2e6495e0923 /src | |
| parent | 650f06aa1943d439ac049f6bc276b216999e6a56 (diff) | |
| parent | 03bf99a56de255d41655bc8486d50cadbcae22f0 (diff) | |
fix usRcvBufferPos == MB_SER_PDU_SIZE_MAX bug
Diffstat (limited to 'src')
| -rw-r--r-- | src/Kconfig | 139 | ||||
| -rw-r--r-- | src/components.c | 7 | ||||
| -rw-r--r-- | src/device.c | 75 | ||||
| -rw-r--r-- | src/idle.c | 107 | ||||
| -rw-r--r-- | src/ipc.c | 92 | ||||
| -rw-r--r-- | src/kservice.c | 3 | ||||
| -rw-r--r-- | src/memheap.c | 12 | ||||
| -rw-r--r-- | src/mempool.c | 15 | ||||
| -rw-r--r-- | src/module.c | 769 | ||||
| -rw-r--r-- | src/object.c | 106 | ||||
| -rw-r--r-- | src/signal.c | 7 | ||||
| -rw-r--r-- | src/slab.c | 19 | ||||
| -rw-r--r-- | src/thread.c | 31 | ||||
| -rw-r--r-- | src/timer.c | 8 |
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 @@ -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) { |
