Merge branch 'master' into mutexrevert

This commit is contained in:
Meco Jianting Man
2021-06-05 13:03:45 +08:00
committed by GitHub
486 changed files with 129625 additions and 6158 deletions
+11 -3
View File
@@ -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
View File
@@ -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
+18 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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"));