a bugfix for mail queue and printf clipping switch

1. add TOS_CFG_LIBC_PRINTF_EN
1: enable printf to implement tos_kprintf
when you call tos_kprintf(actually currently it's a MACRO rather than a function) , the libc will be invloved into the image, most of the time it means a larger image size.

0: disable printf, means tos_kprintf is defined as an empty MACRO
most of the time, means you will not get a log output from the uart(currently we donnot have a console yet) but a smaller image size.

2. fix a bug of tos_mail_q and tos_priority_mail_q
if we are post-ing a mail and there is[are] task[s] just pend-ing for the mail queue, the mail delivered to the pend-er will be a pointer, and probably it's a pointer to the local variable on the stack. Actually we should do a memcpy rather than a pointer assignment. for more details, see the patch.
This commit is contained in:
daishengdong
2019-11-25 21:04:37 +08:00
parent 7b7c806f2a
commit 96cf620708
20 changed files with 68 additions and 59 deletions

View File

@@ -32,7 +32,6 @@
#include <tos_fault.h>
#include <tos_klib.h>
#include <tos_list.h>
#include <tos_pm.h>
#include <tos_pend.h>
#include <tos_sys.h>
#include <tos_ring_queue.h>

View File

@@ -230,6 +230,10 @@
#define TOS_CFG_OBJECT_VERIFY_EN 0u
#endif
#ifndef TOS_CFG_LIBC_PRINTF_EN
#define TOS_CFG_LIBC_PRINTF_EN 1u // we enable this by default
#endif
#if (TOS_CFG_TIMER_AS_PROC == 0u) && !defined(TOS_CFG_TIMER_TASK_PRIO)
#define TOS_CFG_TIMER_TASK_PRIO (k_prio_t)(K_TASK_PRIO_IDLE - (k_prio_t)1u)
#endif

View File

@@ -31,14 +31,14 @@
#define TOS_PTR_SANITY_CHECK(ptr) \
do { \
if (unlikely((ptr) == K_NULL)) { \
if (unlikely(!(ptr))) { \
return K_ERR_OBJ_PTR_NULL; \
} \
} while(0)
#define TOS_PTR_SANITY_CHECK_RC(ptr, return_code) \
do { \
if (unlikely((ptr) == K_NULL)) { \
if (unlikely(!(ptr))) { \
return return_code; \
} \
} while(0)
@@ -70,12 +70,18 @@
#define TOS_OBJ_VERIFY_RC(obj, obj_type, return_code)
#endif
#if TOS_CFG_LIBC_PRINTF_EN > 0u
#define LIBC_PRINTF printf
#else
#define LIBC_PRINTF(...)
#endif
// currently we use default microlib supplied by mdk
#define tos_kprintf(...) printf(__VA_ARGS__);
#define tos_kprintf(...) LIBC_PRINTF(__VA_ARGS__);
#define tos_kprintln(...) \
printf(__VA_ARGS__); \
printf("\n");
LIBC_PRINTF(__VA_ARGS__); \
LIBC_PRINTF("\n");
#define TOS_ASSERT_AUX(exp, function, line) \
if (!(exp)) { \

View File

@@ -416,8 +416,9 @@ __KERNEL__ __STATIC_INLINE__ void task_state_set_sleeping(k_task_t *task)
__DEBUG__ __STATIC_INLINE__ void task_default_walker(k_task_t *task)
{
char *state_str;
char *state_str = "ABNORMAL";
state_str = state_str;
tos_kprintln("tsk name: %s", task->name);
if (task->state == K_TASK_STATE_PENDTIMEOUT_SUSPENDED) {

View File

@@ -32,7 +32,7 @@ __API__ void tos_tick_handler(void);
__KERNEL__ void tick_update(k_tick_t tick);
__KERNEL__ k_err_t tick_list_add(k_task_t *task, k_tick_t timeout);
__KERNEL__ void tick_list_add(k_task_t *task, k_tick_t timeout);
__KERNEL__ void tick_list_remove(k_task_t *task);