support avr architecture based on ATMega32
1. IAR project, see TencentOS-tiny\board\ATMega32\IAR, both 4.12 and 7.20 is supplied.
This commit is contained in:
@@ -112,7 +112,7 @@
|
||||
#define __NAKED__
|
||||
#define __WEAK__ __weak
|
||||
|
||||
/*------------------ ICC Compiler for STM8 ----------------------*/
|
||||
/*------------------ ICC Compiler for STM8/AVR ----------------------*/
|
||||
#elif defined(__IAR_SYSTEMS_ICC__)
|
||||
|
||||
#define __ASM__ __asm
|
||||
|
@@ -26,10 +26,10 @@
|
||||
#define TOS_MACRO_BEGIN do {
|
||||
#define TOS_MACRO_END } while (0)
|
||||
|
||||
#define TOS_OFFSET_OF_FIELD(type, field) \
|
||||
#define TOS_OFFSET_OF_FIELD(type, field) \
|
||||
((uint32_t)&(((type *)0)->field))
|
||||
|
||||
#define TOS_CONTAINER_OF_FIELD(ptr, type, field) \
|
||||
#define TOS_CONTAINER_OF_FIELD(ptr, type, field) \
|
||||
((type *)((uint8_t *)(ptr) - TOS_OFFSET_OF_FIELD(type, field)))
|
||||
|
||||
#define TOS_COUNT_OF(array) (sizeof(array) / sizeof(array[0]))
|
||||
@@ -43,14 +43,14 @@ TOS_MACRO_END
|
||||
|
||||
#define TOS_PTR_SANITY_CHECK_RC(ptr, return_code) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (unlikely(!(ptr))) { \
|
||||
return return_code; \
|
||||
if (unlikely(!(ptr))) { \
|
||||
return return_code; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
|
||||
#define TOS_IN_IRQ_CHECK() \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (unlikely(knl_is_inirq())) { \
|
||||
if (unlikely(knl_is_inirq())) { \
|
||||
return K_ERR_IN_IRQ; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
@@ -60,9 +60,9 @@ TOS_MACRO_END
|
||||
#define TOS_OBJ_INIT(obj, obj_type) knl_object_init(&obj->knl_obj, obj_type)
|
||||
#define TOS_OBJ_DEINIT(obj) knl_object_deinit(&obj->knl_obj)
|
||||
|
||||
#define TOS_OBJ_VERIFY(obj, obj_type) \
|
||||
#define TOS_OBJ_VERIFY(obj, obj_type) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return K_ERR_OBJ_INVALID; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
@@ -70,7 +70,22 @@ TOS_MACRO_END
|
||||
|
||||
#define TOS_OBJ_VERIFY_RC(obj, obj_type, return_code) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return return_code; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
|
||||
#define TOS_OBJ_TEST(obj, obj_type) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return K_ERR_OBJ_INVALID; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
|
||||
|
||||
#define TOS_OBJ_TEST_RC(obj, obj_type, return_code) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return return_code; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
@@ -81,6 +96,8 @@ TOS_MACRO_END
|
||||
#define TOS_OBJ_DEINIT(obj)
|
||||
#define TOS_OBJ_VERIFY(obj, obj_type)
|
||||
#define TOS_OBJ_VERIFY_RC(obj, obj_type, return_code)
|
||||
#define TOS_OBJ_TEST(obj, obj_type)
|
||||
#define TOS_OBJ_TEST_RC(obj, obj_type, return_code)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -93,18 +110,18 @@ TOS_MACRO_END
|
||||
// currently we use default microlib supplied by mdk
|
||||
#define tos_kprintf(...) LIBC_PRINTF(__VA_ARGS__);
|
||||
|
||||
#define tos_kprintln(...) \
|
||||
LIBC_PRINTF(__VA_ARGS__); \
|
||||
#define tos_kprintln(...) \
|
||||
LIBC_PRINTF(__VA_ARGS__); \
|
||||
LIBC_PRINTF("\n");
|
||||
|
||||
#define TOS_ASSERT_AUX(exp, function, line) \
|
||||
if (!(exp)) { \
|
||||
tos_kprintln("assert failed: %s %d\n", function, line); \
|
||||
tos_knl_sched_lock(); \
|
||||
tos_cpu_int_disable(); \
|
||||
while (K_TRUE) { \
|
||||
; \
|
||||
} \
|
||||
#define TOS_ASSERT_AUX(exp, function, line) \
|
||||
if (!(exp)) { \
|
||||
tos_kprintln("assert failed: %s %d\n", function, line); \
|
||||
tos_knl_sched_lock(); \
|
||||
tos_cpu_int_disable(); \
|
||||
while (K_TRUE) { \
|
||||
; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define TOS_ASSERT(exp) TOS_ASSERT_AUX(exp, __FUNCTION__, __LINE__)
|
||||
|
@@ -21,10 +21,10 @@
|
||||
__CDECLS_BEGIN
|
||||
|
||||
#define K_PRIO_TBL_SIZE ((TOS_CFG_TASK_PRIO_MAX + 31) / 32)
|
||||
#define K_PRIO_TBL_SLOT_SIZE (32u)
|
||||
#define K_PRIO_TBL_SLOT_SIZE (8 * sizeof(uint32_t))
|
||||
|
||||
#define K_PRIO_NDX(prio) ((prio) >> 5u) /* prio / 32u */
|
||||
#define K_PRIO_BIT(prio) ((uint32_t)1u << (K_PRIO_TBL_SLOT_SIZE - 1u - ((prio) & (K_PRIO_TBL_SLOT_SIZE - 1u))))
|
||||
#define K_PRIO_NDX(prio) ((prio) >> 5u) /* prio / 32u */
|
||||
#define K_PRIO_BIT(prio) ((uint32_t)1u << (K_PRIO_TBL_SLOT_SIZE - 1u - ((prio) & (K_PRIO_TBL_SLOT_SIZE - 1u))))
|
||||
|
||||
typedef struct readyqueue_st {
|
||||
k_list_t task_list_head[TOS_CFG_TASK_PRIO_MAX];
|
||||
|
@@ -189,7 +189,7 @@ __API__ k_err_t tos_rwlock_wpend_timed(k_rwlock_t *rwlock, k_tick_t timeout)
|
||||
}
|
||||
|
||||
while (rwlock->n_readers > 0u || rwlock->is_writting) {
|
||||
/* util no one is writting or reading */
|
||||
/* until no one is writting or reading */
|
||||
err = tos_sem_pend(&rwlock->signal, timeout);
|
||||
if (err != K_ERR_NONE) {
|
||||
break;
|
||||
|
@@ -96,10 +96,8 @@ __API__ k_err_t tos_task_create(k_task_t *task,
|
||||
TOS_PTR_SANITY_CHECK(entry);
|
||||
TOS_PTR_SANITY_CHECK(stk_base);
|
||||
|
||||
if (task->knl_obj.type == KNL_OBJ_TYPE_TASK) {
|
||||
/* try to re-create a task, kind of dangerous action */
|
||||
return K_ERR_TASK_ALREADY_CREATED;
|
||||
}
|
||||
/* try to re-create a task, kind of dangerous */
|
||||
TOS_OBJ_TEST_RC(task, KNL_OBJ_TYPE_TASK, K_ERR_TASK_ALREADY_CREATED);
|
||||
|
||||
if (unlikely(stk_size < K_TASK_STK_SIZE_MIN)) {
|
||||
return K_ERR_TASK_STK_SIZE_INVALID;
|
||||
|
@@ -88,20 +88,20 @@ __STATIC__ k_time_t tickless_cpu_sleep_time_get(k_cpu_lpwr_mode_t lpwr_mode)
|
||||
return time_sleep_ms > max_delay_ms ? max_delay_ms : time_sleep_ms;
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_systick_suspend(void)
|
||||
__STATIC__ void tickless_tick_suspend(void)
|
||||
{
|
||||
cpu_systick_suspend();
|
||||
cpu_systick_pending_reset();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_systick_resume(void)
|
||||
__STATIC__ void tickless_tick_resume(void)
|
||||
{
|
||||
cpu_systick_suspend();
|
||||
cpu_systick_reset();
|
||||
cpu_systick_resume();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_systick_fix(k_tick_t tick_sleep)
|
||||
__STATIC__ void tickless_tick_fix(k_tick_t tick_sleep)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
@@ -114,14 +114,14 @@ __STATIC__ void tickless_systick_fix(k_tick_t tick_sleep)
|
||||
timer_update();
|
||||
#endif
|
||||
|
||||
tickless_systick_resume();
|
||||
tickless_tick_resume();
|
||||
|
||||
TOS_CPU_INT_ENABLE();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_enter(void)
|
||||
{
|
||||
tickless_systick_suspend();
|
||||
tickless_tick_suspend();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_leave(k_time_t time_sleep_ms)
|
||||
@@ -131,7 +131,7 @@ __STATIC__ void tickless_leave(k_time_t time_sleep_ms)
|
||||
/* how many "ticks" have we sleep */
|
||||
tick_sleep = k_cpu_tick_per_second * time_sleep_ms / K_TIME_MILLISEC_PER_SEC;
|
||||
|
||||
tickless_systick_fix(tick_sleep);
|
||||
tickless_tick_fix(tick_sleep);
|
||||
}
|
||||
|
||||
__KNL__ void tickless_proc(void)
|
||||
|
Reference in New Issue
Block a user