mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-22 19:44:24 +08:00
Merge branch 'master' into mutexrevert
This commit is contained in:
+11
-3
@@ -13,7 +13,8 @@
|
||||
* 2010-07-13 Bernard fix rt_tick_from_millisecond issue found by kuronca
|
||||
* 2011-06-26 Bernard add rt_tick_set function.
|
||||
* 2018-11-22 Jesven add per cpu tick
|
||||
* 2020-12-29 Meco Man add function rt_tick_get_millisecond()
|
||||
* 2020-12-29 Meco Man implement rt_tick_get_millisecond()
|
||||
* 2021-06-01 Meco Man add critical section projection for rt_tick_increase()
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
@@ -22,7 +23,7 @@
|
||||
#ifdef RT_USING_SMP
|
||||
#define rt_tick rt_cpu_index(0)->tick
|
||||
#else
|
||||
static rt_tick_t rt_tick = 0;
|
||||
static volatile rt_tick_t rt_tick = 0;
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -62,6 +63,9 @@ void rt_tick_set(rt_tick_t tick)
|
||||
void rt_tick_increase(void)
|
||||
{
|
||||
struct rt_thread *thread;
|
||||
rt_base_t level;
|
||||
|
||||
level = rt_hw_interrupt_disable();
|
||||
|
||||
/* increase the global tick */
|
||||
#ifdef RT_USING_SMP
|
||||
@@ -78,11 +82,15 @@ void rt_tick_increase(void)
|
||||
{
|
||||
/* change to initialized tick */
|
||||
thread->remaining_tick = thread->init_tick;
|
||||
|
||||
thread->stat |= RT_THREAD_STAT_YIELD;
|
||||
|
||||
rt_hw_interrupt_enable(level);
|
||||
rt_schedule();
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
/* check timer */
|
||||
rt_timer_check();
|
||||
|
||||
+6
-2
@@ -127,6 +127,7 @@ rt_err_t rt_thread_idle_delhook(void (*hook)(void))
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_HEAP
|
||||
/* Return whether there is defunctional thread to be deleted. */
|
||||
rt_inline int _has_defunct_thread(void)
|
||||
{
|
||||
@@ -140,6 +141,7 @@ rt_inline int _has_defunct_thread(void)
|
||||
|
||||
return l->next != l;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @ingroup Thread
|
||||
@@ -200,12 +202,14 @@ static void rt_thread_idle_entry(void *parameter)
|
||||
{
|
||||
#ifdef RT_USING_IDLE_HOOK
|
||||
rt_size_t i;
|
||||
void (*idle_hook)(void);
|
||||
|
||||
for (i = 0; i < RT_IDLE_HOOK_LIST_SIZE; i++)
|
||||
{
|
||||
if (idle_hook_list[i] != RT_NULL)
|
||||
idle_hook = idle_hook_list[i];
|
||||
if (idle_hook != RT_NULL)
|
||||
{
|
||||
idle_hook_list[i]();
|
||||
idle_hook();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -37,7 +37,9 @@
|
||||
* 2020-07-29 Meco Man fix thread->event_set/event_info when received an
|
||||
* event without pending
|
||||
* 2020-10-11 Meco Man add value overflow-check code
|
||||
* 2021-01-03 Meco Man add rt_mb_urgent()
|
||||
* 2021-01-03 Meco Man implement rt_mb_urgent()
|
||||
* 2021-05-30 Meco Man implement rt_mutex_trytake()
|
||||
* 2021-01-20 hupu fix priority inversion bug of mutex
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
@@ -123,6 +125,7 @@ rt_inline rt_err_t rt_ipc_list_suspend(rt_list_t *list,
|
||||
break;
|
||||
|
||||
default:
|
||||
RT_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -425,7 +428,7 @@ RTM_EXPORT(rt_sem_take);
|
||||
*/
|
||||
rt_err_t rt_sem_trytake(rt_sem_t sem)
|
||||
{
|
||||
return rt_sem_take(sem, 0);
|
||||
return rt_sem_take(sem, RT_WAITING_NO);
|
||||
}
|
||||
RTM_EXPORT(rt_sem_trytake);
|
||||
|
||||
@@ -816,6 +819,19 @@ __again:
|
||||
}
|
||||
RTM_EXPORT(rt_mutex_take);
|
||||
|
||||
/**
|
||||
* This function will try to take a mutex and immediately return
|
||||
*
|
||||
* @param mutex the mutex object
|
||||
*
|
||||
* @return the error code
|
||||
*/
|
||||
rt_err_t rt_mutex_trytake(rt_mutex_t mutex)
|
||||
{
|
||||
return rt_mutex_take(mutex, RT_WAITING_NO);
|
||||
}
|
||||
RTM_EXPORT(rt_mutex_trytake);
|
||||
|
||||
/**
|
||||
* This function will release a mutex, if there are threads suspended on mutex,
|
||||
* it will be waked up.
|
||||
|
||||
+35
-33
@@ -17,6 +17,7 @@
|
||||
* 2013-05-24 Bernard fix the rt_memheap_realloc issue.
|
||||
* 2013-07-11 Grissiom fix the memory block splitting issue.
|
||||
* 2013-07-15 Grissiom optimize rt_memheap_realloc
|
||||
* 2021-06-03 Flybreak Fix the crash problem after opening Oz optimization on ac6.
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
@@ -41,31 +42,31 @@
|
||||
rt_inline void rt_memheap_setname(struct rt_memheap_item *item, const char *name)
|
||||
{
|
||||
int index;
|
||||
rt_uint8_t* ptr;
|
||||
rt_uint8_t *ptr;
|
||||
|
||||
ptr = (rt_uint8_t*)&(item->next_free);
|
||||
for (index = 0; index < sizeof(void*); index ++)
|
||||
ptr = (rt_uint8_t *) & (item->next_free);
|
||||
for (index = 0; index < sizeof(void *); index ++)
|
||||
{
|
||||
if (name[index] == '\0') break;
|
||||
ptr[index] = name[index];
|
||||
}
|
||||
if (name[index] == '\0') ptr[index] = '\0';
|
||||
else
|
||||
else
|
||||
{
|
||||
ptr = (rt_uint8_t*)&(item->prev_free);
|
||||
for (index = 0; index < sizeof(void*) && (index + sizeof(void*))< RT_NAME_MAX; index ++)
|
||||
ptr = (rt_uint8_t *) & (item->prev_free);
|
||||
for (index = 0; index < sizeof(void *) && (index + sizeof(void *)) < RT_NAME_MAX; index ++)
|
||||
{
|
||||
if (name[sizeof(void*) + index] == '\0') break;
|
||||
ptr[index] = name[sizeof(void*) + index];
|
||||
if (name[sizeof(void *) + index] == '\0') break;
|
||||
ptr[index] = name[sizeof(void *) + index];
|
||||
}
|
||||
|
||||
if (name[sizeof(void*) + index] == '\0') ptr[index] = '\0';
|
||||
if (name[sizeof(void *) + index] == '\0') ptr[index] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
void rt_mem_set_tag(void* ptr, const char* name)
|
||||
void rt_mem_set_tag(void *ptr, const char *name)
|
||||
{
|
||||
struct rt_memheap_item* item;
|
||||
struct rt_memheap_item *item;
|
||||
|
||||
if (ptr && name)
|
||||
{
|
||||
@@ -369,7 +370,8 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
|
||||
if (newsize > oldsize)
|
||||
{
|
||||
void *new_ptr;
|
||||
struct rt_memheap_item *next_ptr;
|
||||
/* Fix the crash problem after opening Oz optimization on ac6 */
|
||||
volatile struct rt_memheap_item *next_ptr;
|
||||
|
||||
/* lock memheap */
|
||||
result = rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
|
||||
@@ -441,14 +443,14 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
|
||||
|
||||
next_ptr->prev = header_ptr;
|
||||
next_ptr->next = header_ptr->next;
|
||||
header_ptr->next->prev = next_ptr;
|
||||
header_ptr->next = next_ptr;
|
||||
header_ptr->next->prev = (struct rt_memheap_item *)next_ptr;
|
||||
header_ptr->next = (struct rt_memheap_item *)next_ptr;
|
||||
|
||||
/* insert next_ptr to free list */
|
||||
next_ptr->next_free = heap->free_list->next_free;
|
||||
next_ptr->prev_free = heap->free_list;
|
||||
heap->free_list->next_free->prev_free = next_ptr;
|
||||
heap->free_list->next_free = next_ptr;
|
||||
heap->free_list->next_free->prev_free = (struct rt_memheap_item *)next_ptr;
|
||||
heap->free_list->next_free = (struct rt_memheap_item *)next_ptr;
|
||||
RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("new ptr: next_free 0x%08x, prev_free 0x%08x",
|
||||
next_ptr->next_free,
|
||||
next_ptr->prev_free));
|
||||
@@ -666,17 +668,17 @@ void rt_memheap_free(void *ptr)
|
||||
RTM_EXPORT(rt_memheap_free);
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
static void _memheap_dump_tag(struct rt_memheap_item* item)
|
||||
static void _memheap_dump_tag(struct rt_memheap_item *item)
|
||||
{
|
||||
rt_uint8_t name[2 * sizeof(void*)];
|
||||
rt_uint8_t* ptr;
|
||||
rt_uint8_t name[2 * sizeof(void *)];
|
||||
rt_uint8_t *ptr;
|
||||
|
||||
ptr = (rt_uint8_t*)&(item->next_free);
|
||||
rt_memcpy(name, ptr, sizeof(void*));
|
||||
ptr = (rt_uint8_t*)&(item->prev_free);
|
||||
rt_memcpy(&name[sizeof(void*)], ptr, sizeof(void*));
|
||||
ptr = (rt_uint8_t *) & (item->next_free);
|
||||
rt_memcpy(name, ptr, sizeof(void *));
|
||||
ptr = (rt_uint8_t *) & (item->prev_free);
|
||||
rt_memcpy(&name[sizeof(void *)], ptr, sizeof(void *));
|
||||
|
||||
rt_kprintf("%.*s", 2 * sizeof(void*), name);
|
||||
rt_kprintf("%.*s", 2 * sizeof(void *), name);
|
||||
}
|
||||
|
||||
int rt_memheap_dump(struct rt_memheap *heap)
|
||||
@@ -686,15 +688,15 @@ int rt_memheap_dump(struct rt_memheap *heap)
|
||||
if (heap == RT_NULL) return 0;
|
||||
RT_ASSERT(rt_object_get_type(&heap->parent) == RT_Object_Class_MemHeap);
|
||||
|
||||
rt_kprintf("\n[%.*s] [0x%08x - 0x%08x]->\n", RT_NAME_MAX, heap->parent.name,
|
||||
(rt_ubase_t)heap->start_addr, (rt_ubase_t)heap->start_addr + heap->pool_size);
|
||||
rt_kprintf("\n[%.*s] [0x%08x - 0x%08x]->\n", RT_NAME_MAX, heap->parent.name,
|
||||
(rt_ubase_t)heap->start_addr, (rt_ubase_t)heap->start_addr + heap->pool_size);
|
||||
rt_kprintf("------------------------------\n");
|
||||
|
||||
/* lock memheap */
|
||||
rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
|
||||
item = heap->block_list;
|
||||
|
||||
end = (struct rt_memheap_item *) ((rt_uint8_t *)heap->start_addr + heap->pool_size - RT_MEMHEAP_SIZE);
|
||||
end = (struct rt_memheap_item *)((rt_uint8_t *)heap->start_addr + heap->pool_size - RT_MEMHEAP_SIZE);
|
||||
|
||||
/* for each memory block */
|
||||
while ((rt_ubase_t)item < ((rt_ubase_t)end))
|
||||
@@ -730,13 +732,13 @@ int memheaptrace(void)
|
||||
int index;
|
||||
extern int list_memheap(void);
|
||||
|
||||
heaps = (struct rt_memheap**)rt_malloc(sizeof(struct rt_memheap*) * count);
|
||||
heaps = (struct rt_memheap **)rt_malloc(sizeof(struct rt_memheap *) * count);
|
||||
if (heaps == RT_NULL) return 0;
|
||||
|
||||
list_memheap();
|
||||
|
||||
rt_kprintf("memheap header size: %d\n", RT_MEMHEAP_SIZE);
|
||||
count = rt_object_get_pointers(RT_Object_Class_MemHeap, (rt_object_t*)heaps, count);
|
||||
count = rt_object_get_pointers(RT_Object_Class_MemHeap, (rt_object_t *)heaps, count);
|
||||
for (index = 0; index < count; index++)
|
||||
{
|
||||
rt_memheap_dump(heaps[index]);
|
||||
@@ -966,15 +968,15 @@ void dump_used_memheap(struct rt_memheap *mh)
|
||||
{
|
||||
/* dump information */
|
||||
rt_kprintf("[0x%08x - %d - %c%c%c%c] used\n", header_ptr, block_size,
|
||||
header_ptr->owner_thread_name[0], header_ptr->owner_thread_name[1],
|
||||
header_ptr->owner_thread_name[2], header_ptr->owner_thread_name[3]);
|
||||
header_ptr->owner_thread_name[0], header_ptr->owner_thread_name[1],
|
||||
header_ptr->owner_thread_name[2], header_ptr->owner_thread_name[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* dump information */
|
||||
rt_kprintf("[0x%08x - %d - %c%c%c%c] free\n", header_ptr, block_size,
|
||||
header_ptr->owner_thread_name[0], header_ptr->owner_thread_name[1],
|
||||
header_ptr->owner_thread_name[2], header_ptr->owner_thread_name[3]);
|
||||
header_ptr->owner_thread_name[0], header_ptr->owner_thread_name[1],
|
||||
header_ptr->owner_thread_name[2], header_ptr->owner_thread_name[3]);
|
||||
}
|
||||
|
||||
/* move to next used memory block */
|
||||
|
||||
+1
-1
@@ -404,7 +404,7 @@ __exit:
|
||||
#else
|
||||
/**
|
||||
* This function will perform one schedule. It will select one thread
|
||||
* with the highest priority level, then switch to it.
|
||||
* with the highest priority level, and switch to it immediately.
|
||||
*/
|
||||
void rt_schedule(void)
|
||||
{
|
||||
|
||||
+1
-1
@@ -540,7 +540,7 @@ void *rt_malloc(rt_size_t size)
|
||||
{
|
||||
RT_ASSERT(z->z_nfree > 0);
|
||||
|
||||
/* Remove us from the zone_array[] when we become empty */
|
||||
/* Remove us from the zone_array[] when we become full */
|
||||
if (--z->z_nfree == 0)
|
||||
{
|
||||
zone_array[zi] = z->z_next;
|
||||
|
||||
+15
-7
@@ -79,7 +79,7 @@ void rt_thread_inited_sethook(void (*hook)(rt_thread_t thread))
|
||||
#endif
|
||||
|
||||
/* must be invoke witch rt_hw_interrupt_disable */
|
||||
static void _thread_cleanup_execute(rt_thread_t thread)
|
||||
static void _rt_thread_cleanup_execute(rt_thread_t thread)
|
||||
{
|
||||
register rt_base_t level;
|
||||
#ifdef RT_USING_MODULE
|
||||
@@ -103,7 +103,7 @@ static void _thread_cleanup_execute(rt_thread_t thread)
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
void rt_thread_exit(void)
|
||||
static void _rt_thread_exit(void)
|
||||
{
|
||||
struct rt_thread *thread;
|
||||
register rt_base_t level;
|
||||
@@ -114,7 +114,7 @@ void rt_thread_exit(void)
|
||||
/* disable interrupt */
|
||||
level = rt_hw_interrupt_disable();
|
||||
|
||||
_thread_cleanup_execute(thread);
|
||||
_rt_thread_cleanup_execute(thread);
|
||||
|
||||
/* remove from schedule */
|
||||
rt_schedule_remove_thread(thread);
|
||||
@@ -165,11 +165,11 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
|
||||
#ifdef ARCH_CPU_STACK_GROWS_UPWARD
|
||||
thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter,
|
||||
(void *)((char *)thread->stack_addr),
|
||||
(void *)rt_thread_exit);
|
||||
(void *)_rt_thread_exit);
|
||||
#else
|
||||
thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter,
|
||||
(rt_uint8_t *)((char *)thread->stack_addr + thread->stack_size - sizeof(rt_ubase_t)),
|
||||
(void *)rt_thread_exit);
|
||||
(void *)_rt_thread_exit);
|
||||
#endif
|
||||
|
||||
/* priority init */
|
||||
@@ -358,6 +358,8 @@ RTM_EXPORT(rt_thread_startup);
|
||||
*/
|
||||
rt_err_t rt_thread_detach(rt_thread_t thread)
|
||||
{
|
||||
rt_base_t lock;
|
||||
|
||||
/* thread check */
|
||||
RT_ASSERT(thread != RT_NULL);
|
||||
RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
|
||||
@@ -372,17 +374,23 @@ rt_err_t rt_thread_detach(rt_thread_t thread)
|
||||
rt_schedule_remove_thread(thread);
|
||||
}
|
||||
|
||||
_thread_cleanup_execute(thread);
|
||||
_rt_thread_cleanup_execute(thread);
|
||||
|
||||
/* release thread timer */
|
||||
rt_timer_detach(&(thread->thread_timer));
|
||||
|
||||
/* disable interrupt */
|
||||
lock = rt_hw_interrupt_disable();
|
||||
|
||||
/* change stat */
|
||||
thread->stat = RT_THREAD_CLOSE;
|
||||
|
||||
/* detach thread object */
|
||||
rt_object_detach((rt_object_t)thread);
|
||||
|
||||
/* enable interrupt */
|
||||
rt_hw_interrupt_enable(lock);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
RTM_EXPORT(rt_thread_detach);
|
||||
@@ -464,7 +472,7 @@ rt_err_t rt_thread_delete(rt_thread_t thread)
|
||||
rt_schedule_remove_thread(thread);
|
||||
}
|
||||
|
||||
_thread_cleanup_execute(thread);
|
||||
_rt_thread_cleanup_execute(thread);
|
||||
|
||||
/* release thread timer */
|
||||
rt_timer_detach(&(thread->thread_timer));
|
||||
|
||||
+6
-2
@@ -531,7 +531,9 @@ void rt_timer_check(void)
|
||||
struct rt_timer *t;
|
||||
rt_tick_t current_tick;
|
||||
register rt_base_t level;
|
||||
rt_list_t list = RT_LIST_OBJECT_INIT(list);
|
||||
rt_list_t list;
|
||||
|
||||
rt_list_init(&list);
|
||||
|
||||
RT_DEBUG_LOG(RT_DEBUG_TIMER, ("timer check enter\n"));
|
||||
|
||||
@@ -613,7 +615,9 @@ void rt_soft_timer_check(void)
|
||||
rt_tick_t current_tick;
|
||||
struct rt_timer *t;
|
||||
register rt_base_t level;
|
||||
rt_list_t list = RT_LIST_OBJECT_INIT(list);
|
||||
rt_list_t list;
|
||||
|
||||
rt_list_init(&list);
|
||||
|
||||
RT_DEBUG_LOG(RT_DEBUG_TIMER, ("software timer check enter\n"));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user